Coder Social home page Coder Social logo

sowirepo / detectmobile.js Goto Github PK

View Code? Open in Web Editor NEW

This project forked from miohtama/detectmobile.js

0.0 2.0 0.0 659 KB

detectmobile.js allows you detect mobile browsers, create intelligent mobile redirects in HTTP cache safe manner using Javascript.

Home Page: http://opensourcehacker.com

Shell 1.69% JavaScript 84.09% HTML 14.22%

detectmobile.js's Introduction

detectmobile.js allows you detect mobile browsers, create intelligent mobile redirects in HTTP cache safe manner using Javascript.

  • You have separate web and mobile site and want to redirect mobile visitors to the mobile site automatically
  • You want to customize the page layout for mobile and CSS is not enough
  • You want to have page features only for mobile browsers e.g. add download app from the app store links

The script will take care of the task:

if user is using a mobile browser and comes to your web site then
        go to a matching mobile site page
else
        stay on the web site
  • Mobile detection is based on the screen size: you use "screens smaller than this diameter" threshold which is actually the only thing you want to know to send visitors to the small screen optimized site.
  • detectmobile.js is cache friendly, as it is not doing any cache varying by HTTP user agent header or HTTP redirects. Thus, you can safely use any static and anonymous caching with detectmobile.js.

With the default settings detectmobile.js is set up for the following configuration

  • Website is hosted in the address like www.site.com or site.com
  • Mobile site is hosted in the address like m.site.com

Using a Javascript feature based detection over HTTP User-agent header based detection like Wurfl offers several benefits

  • Keep It Simple, Stupid
  • Front end caching performance is not destroyed by the need for vary by user agents
  • You do not need to maintain huge user agent database (thousands of devices)
  • You need minimal amount of server-side code
  • Compatible with any programming language or framework (Python, PHP, C#, ASP.NET, Java, even static HTML files...)
  • You can actually understand the codebase

You need to be able add new Javascript code on the website.

No changes on the mobile site required, besides adding a back link "Go to full website".

The Javascript file must be loaded on both web site and mobile site.

It is recommended to have this script as the first script of all Javascripts, as when the mobile browser comes to website the redirect occurs before any other media resources are loaded.

<html>
        <head>
                <script src="http://xxx.com/detectmobile.js"></script>
                <script>
                        try {
                                // This is the URL where mobile
                                detectmobile.defaultMobileURL = "http://m.xxx.com";
                                detectmobile.process();
                        } catch(e) {
                                // Make sure that in the fault modes
                                // we do not interrupt execution of other Javascript code
                        }
                </script>
        </head>

You can also configure detectmobile.redirectCallback() function doing dynamic mapping of the URLs between mobile site and website pages, so that when mobile browser arrives to a website it will be redirected to the corresponding mobile page, not the site root.

<html>
        <head>
                <script src="http://xxx.com/detectmobile.js"></script>
                <script>
                        try {
                                // Set up detectmobile.js
                                detectmobile.redirectCallback = function(mode, url) {
                                        if(mode == "mobile") {
                                                // We could have arrived directly to a news article
                                                // from a search engine, not the site home page
                                                // Redirect to a corresponding article mobile version

                                                // This example has some URL path for the article
                                                // on both site.com and m.site.com, just different domain name.
                                                // But you could any kind of URL rewrite here.
                                                return detectmobile.replaceDomainName(url, "m", true, true);
                                        }

                                        // Take no action
                                        return url;
                                }


                                // Execute mobile redirect
                                detectmobile.process();
                        } catch(e) {
                                // Make sure that in the fault modes
                                // we do not interrupt execution of other Javascript code
                                if(console && console.exception) {
                                        console.exception(e);
                                }
                        }
                </script>
        </head>

Add the following code to your mobile site to have a backlink to the website.

You need to add force-web HTTP GET query parameter to create a sticky cookie which will make the mobile browser stay in the web version.

Use the following code on the mobile site to make browsers go to the full web version:

<a href="yoursite.com/page?force-web">
        Full website version
</a>

This will use Javascript to set a cookie called detectmobilesticky (configurable) on yoursite.com. Whenever the cookie is prevent, the automatic mobile redirect process is suspended.

This link will clear the sticky cookie and returning clients will automatically redirect to mobile site once again.

<a href="yoursite.com/?force-mobile">
Mobile site

</a>

The suggested mobile site link place is in the footer or some other non-visible place. This link only should concern users who have used "full web site" link and then go back to the mobile site.

See the API documentation `GitHub pages.

All HTML capable mobile browsers are supported.

Opera Mini is supported. Other thin clients are also supported if they execute DOM on ready / window loaded Javascript events.

In versio 0.1 we do a brute check of the screen width in the pixels. Everything 960 pixels wide and narrower are considered as mobile screens. This covers iPhone, iPad, current Android phones and tables, etc.

However the plan is to include DPI detection using CSS trick for the future versions to support to ignore PC screens of 800 pixels wide.

The front end caching servers should be configured to ignore the following cookie:

detectmobilesticky

This cookie is used by Javascript only.

Whether the cookei is present or not should not affect the caching. However, the frontend cache serves are usually configured not to cache any responses with the cookie.

If you are not aware of the situation the following might happen

  • Browser loads a page from the server (cached)
  • The page contains detectmobile.js
  • Browser sets the mobile sticky cookie
  • Browser loads the next page from the server. Since HTTP request now contains a cookie, set by Javascript on the previous page, this request no longer comes from the cache and the further site performance for this particular user is destroyed

Below is an example of configuring Varnish to strip out this cookie from the backend requests.

We do not want the sticky mobile cookie to mess the backend caching. This cookie is only corcern of the client (Javascript) and thus should not be visible on the server-side code:

sub vcl_recv {
    # Remove cookie detectmobilesticky
    set req.http.cookie = regsub(req.http.cookie,"detectmobilesticky=[^;]*;?( |$)","");

    # Remove the cookie header if it's empty after cleanup
    if (req.http.cookie ~ "^ *$") {
        remove req.http.cookie;
    }
}

This snippet was created using fabulous cookie-stripper.sh.

Below are some examples how to integrate detectmobile.js with various mobile frameworks.

Here are short integration instructions to

The script is on the production usage at least on the following sites

detectmobile.js works with PHP, Python, Wordpress, Joomla, Plone, Django, static HTML5, you name it... no hard dependencies to any backend system.

Try grab Moo on #html5 IRC channel on freenode.net.

This code was isolated from Mobilize.js.

API documents are available at GitHub Pages.

Installing prerequisitements (OSX):

sudo gem install rdiscount json parallel rspec

Installing JSDuck:

# --pre installs 2.0 beta version
sudo gem install --pre jsduck

Get ExtJS:

wget http://extjs.cachefly.net/ext-4.0.2a-gpl.zip
unzip ext-4.0.2a-gpl.zip  # takes time here....
mkdir docs/template/extjs
# Create dummy entry - actually we load everything
# from Sencha CDN in custom index.html
cp ext-4.0.2a/ext-all.js docs/template/extjs

SASS it:

sudo gem install compass
compass compile doc/template/resources/sass

Building docs with JSDuck:

bin/build-docs.sh

JSDuck has hardcored branding for Sencha. To get rid of this, the hacked file list is: index.html, Viewport.js.

JSDuck did not offer customization hooks, so I had to dump whole ExtJS Doc viewer application tree to the source code.

More info

You need to create another clone of the repo:

git clone [email protected]:miohtama/detectmobile.js.git detectmobiledocs
cd detectmobiledocs
git checkout -b gh-pages origin/gh-pages
cp -r ../detectmobile.js/docs/apidocs/* .
cp ../detectmobile.js/.gitignore . # Don't commit .sass cache files
git add -A
git commit -m "Updated API docs"
git push

More info

Below are short instructions for simple manual testing.

Add entry:

m.localhost 127.0.0.1

Start HTTP server in the project folder:

python -m SimpleHTTPServer 7777

And then open with desktop browser:

http://localhost:7777/tests/simple.html

And another:

http://m.localhost:7777/tests/simple.html

Start iOS emulator and try:

http://localhost:7777/tests/simple.html

You should end up to m.localhost:7777/tests/simple.html via Javascript redirect.

Code: GPL 2.

The generated API documentation falls under GPL 3 license as it has been linked with Ext JS 4.0.

detectmobile.js's People

Contributors

kasperpeulen avatar miohtama avatar

Watchers

James Cloos avatar Tony avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.