Welcome to the LimeSurvey Community Forum

Ask the community, share ideas, and connect with other LimeSurvey users!

Is Limesurvey able to detect the used device?

  • Joffm
  • Joffm's Avatar Topic Author
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
3 years 6 months ago #204699 by Joffm
Enter this script in a question of type "long free text" (source code mode)
Code:
<script type="text/javascript" charset="utf-8">
  /**
   * JavaScript Client Detection
   * (C) viazenetti GmbH (Christian Ludwig)
   */
  (function (window) {
    {
      var unknown = '-';
 
      // screen
      var screenSize = '';
      if (screen.width) {
        width = (screen.width) ? screen.width : '';
        height = (screen.height) ? screen.height : '';
        screenSize += '' + width + " x " + height;
      }
var vpw = Math.max(document.documentElement.clientWidth, window.innerWidth || 0); 
var vph = Math.max(document.documentElement.clientHeight, window.innerHeight || 0); 
      // browser
      var nVer = navigator.appVersion;
      var nAgt = navigator.userAgent;
      var browser = navigator.appName;
      var version = '' + parseFloat(navigator.appVersion);
      var majorVersion = parseInt(navigator.appVersion, 10);
      var nameOffset, verOffset, ix;
 
      // Opera
      if ((verOffset = nAgt.indexOf('Opera')) != -1) {
        browser = 'Opera';
        version = nAgt.substring(verOffset + 6);
        if ((verOffset = nAgt.indexOf('Version')) != -1) {
          version = nAgt.substring(verOffset + 8);
        }
      }
      // Opera Next
      if ((verOffset = nAgt.indexOf('OPR')) != -1) {
        browser = 'Opera';
        version = nAgt.substring(verOffset + 4);
      }
      // MSIE
      else if ((verOffset = nAgt.indexOf('MSIE')) != -1) {
        browser = 'Microsoft Internet Explorer';
        version = nAgt.substring(verOffset + 5);
      }
      // Chrome
      else if ((verOffset = nAgt.indexOf('Chrome')) != -1) {
        browser = 'Chrome';
        version = nAgt.substring(verOffset + 7);
      }
      // Safari
      else if ((verOffset = nAgt.indexOf('Safari')) != -1) {
        browser = 'Safari';
        version = nAgt.substring(verOffset + 7);
        if ((verOffset = nAgt.indexOf('Version')) != -1) {
          version = nAgt.substring(verOffset + 8);
        }
      }
      // Firefox
      else if ((verOffset = nAgt.indexOf('Firefox')) != -1) {
        browser = 'Firefox';
        version = nAgt.substring(verOffset + 8);
      }
      // MSIE 11+
      else if (nAgt.indexOf('Trident/') != -1) {
        browser = 'Microsoft Internet Explorer';
        version = nAgt.substring(nAgt.indexOf('rv:') + 3);
      }
      // Other browsers
      else if ((nameOffset = nAgt.lastIndexOf(' ') + 1) < (verOffset = nAgt.lastIndexOf('/'))) {
        browser = nAgt.substring(nameOffset, verOffset);
        version = nAgt.substring(verOffset + 1);
        if (browser.toLowerCase() == browser.toUpperCase()) {
          browser = navigator.appName;
        }
      }
      // trim the version string
      if ((ix = version.indexOf(';')) != -1) version = version.substring(0, ix);
      if ((ix = version.indexOf(' ')) != -1) version = version.substring(0, ix);
      if ((ix = version.indexOf(')')) != -1) version = version.substring(0, ix);
 
      majorVersion = parseInt('' + version, 10);
      if (isNaN(majorVersion)) {
        version = '' + parseFloat(navigator.appVersion);
        majorVersion = parseInt(navigator.appVersion, 10);
      }
 
      // mobile version
      var mobile = /Mobile|mini|Fennec|Android|iP(ad|od|hone)/.test(nVer);
 
      // cookie
      var cookieEnabled = (navigator.cookieEnabled) ? true : false;
 
      if (typeof navigator.cookieEnabled == 'undefined' &amp;&amp; !cookieEnabled) {
        document.cookie = 'testcookie';
        cookieEnabled = (document.cookie.indexOf('testcookie') != -1) ? true : false;
      }
 
      // system
      var os = unknown;
      var clientStrings = [
        { s:'Windows 10', r:/(Windows 10.0|Windows NT 10.0)/ },
        { s:'Windows 8.1', r:/(Windows 8.1|Windows NT 6.3)/ },
        { s:'Windows 8', r:/(Windows 8|Windows NT 6.2)/ },
        { s:'Windows 7', r:/(Windows 7|Windows NT 6.1)/ },
        { s:'Windows Vista', r:/Windows NT 6.0/ },
        { s:'Windows Server 2003', r:/Windows NT 5.2/ },
        { s:'Windows XP', r:/(Windows NT 5.1|Windows XP)/ },
        { s:'Windows 2000', r:/(Windows NT 5.0|Windows 2000)/ },
        { s:'Windows ME', r:/(Win 9x 4.90|Windows ME)/ },
        { s:'Windows 98', r:/(Windows 98|Win98)/ },
        { s:'Windows 95', r:/(Windows 95|Win95|Windows_95)/ },
        { s:'Windows NT 4.0', r:/(Windows NT 4.0|WinNT4.0|WinNT|Windows NT)/ },
        { s:'Windows CE', r:/Windows CE/ },
        { s:'Windows 3.11', r:/Win16/ },
        { s:'Android', r:/Android/ },
        { s:'Open BSD', r:/OpenBSD/ },
        { s:'Sun OS', r:/SunOS/ },
        { s:'Linux', r:/(Linux|X11)/ },
        { s:'iOS', r:/(iPhone|iPad|iPod)/ },
        { s:'Mac OS X', r:/Mac OS X/ },
        { s:'Mac OS', r:/(MacPPC|MacIntel|Mac_PowerPC|Macintosh)/ },
        { s:'QNX', r:/QNX/ },
        { s:'UNIX', r:/UNIX/ },
        { s:'BeOS', r:/BeOS/ },
        { s:'OS/2', r:/OS\/2/ },
        { s:'Search Bot', r:/(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/ }
      ];
      for (var id in clientStrings) {
        var cs = clientStrings[id];
        if (cs.r.test(nAgt)) {
          os = cs.s;
          break;
        }
      }
 
      var osVersion = unknown;
 
      if (/Windows/.test(os)) {
        osVersion = /Windows (.*)/.exec(os)[1];
        os = 'Windows';
      }
 
      switch (os) {
        case 'Mac OS X':
          osVersion = /Mac OS X (10[\.\_\d]+)/.exec(nAgt)[1];
          break;
 
        case 'Android':
          osVersion = /Android ([\.\_\d]+)/.exec(nAgt)[1];
          break;
 
        case 'iOS':
          osVersion = /OS (\d+)_(\d+)_?(\d+)?/.exec(nVer);
          osVersion = osVersion[1] + '.' + osVersion[2] + '.' + (osVersion[3] | 0);
          break;
      }
 
      // flash (you'll need to include swfobject)
      /* script src="//ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js" */
      var flashVersion = 'no check';
      if (typeof swfobject != 'undefined') {
        var fv = swfobject.getFlashPlayerVersion();
        if (fv.major > 0) {
          flashVersion = fv.major + '.' + fv.minor + ' r' + fv.release;
        }
        else  {
          flashVersion = unknown;
        }
      }
    }
 
    window.jscd = {
      screen: screenSize,
      browser: browser,
      browserVersion: version,
      browserMajorVersion: majorVersion,
      mobile: mobile,
      os: os,
      osVersion: osVersion,
      cookies: cookieEnabled,
      flashVersion: flashVersion,
            vieww : vpw,
            viewh: vph
    };
  }(this));
 
 
$(document).ready(function() {  
 
    // Hide this question (remove double slash below to hide)
    //$('#question{QID}').hide();
 
    // Load the question
    $('#question{QID} textarea').val(
    'OS: ' + jscd.os +' '+ jscd.osVersion + '\n' +
    'Browser: ' + jscd.browser +' '+ jscd.browserMajorVersion +
      ' (' + jscd.browserVersion + ')\n' + 
    'Mobile: ' + jscd.mobile + '\n' +
    'Flash: ' + jscd.flashVersion + '\n' +
    'Cookies: ' + jscd.cookies + '\n' +
    'Viewport width: ' + jscd.vieww + '\n' +
    'Viewport heigth: ' + jscd.viewh + '\n' +
    'Screen Size: ' + jscd.screen + '\n\n' +
    'Full User Agent: ' + navigator.userAgent
    );
    });
</script>

You will get a lot of information


and as you may restrict the output to the needed info you are able to filter or whatever you want to do.

And hide the question by uncommenting this line
//$('#question{QID}').hide();

forums.limesurvey.org/forum/design-issue...mobile-device#168689

Volunteers are not paid.
Not because they are worthless, but because they are priceless

Please Log in to join the conversation.

  • holch
  • holch's Avatar
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
3 years 6 months ago #204706 by holch
Speaking with yourself today? ;-)

I answer at the LimeSurvey forum in my spare time, I'm not a LimeSurvey GmbH employee.
No support via private message.

The following user(s) said Thank You: DenisChenu

Please Log in to join the conversation.

  • Joffm
  • Joffm's Avatar Topic Author
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
3 years 6 months ago #204725 by Joffm
Sometimes I do it when I need expert advice. ;)

This should have been the answer to the post of the same name by @kasparis.
Unfortunately it was the reason for my short-term absence.

Joffm

Volunteers are not paid.
Not because they are worthless, but because they are priceless

Please Log in to join the conversation.

  • tammo
  • tammo's Avatar
  • Offline
  • Official LimeSurvey Partner
  • Official LimeSurvey Partner
More
2 years 11 months ago #214981 by tammo
I have been using this script in every survey that I made since I found it. Great.

But now something else comes up: would it be possible to write all found values in a question of the type Multiple short text? That way it is much simpler to use these values in the survey. I have been trying to do this, but did not succeed.

Can anyone point me in how to adapt this?

Thanks in advance,

Tammo


Tammo ter Hark at Respondage
For Limesurvey reporting, education and customized themes
respondage.nl

Please Log in to join the conversation.

  • Joffm
  • Joffm's Avatar Topic Author
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
2 years 11 months ago #214983 by Joffm
Hi, Tammo,
I replaced this
Code:
// Load the question
    $('#question{QID} textarea').val(
    'OS: ' + jscd.os +' '+ jscd.osVersion + '\n' +
    'Browser: ' + jscd.browser +' '+ jscd.browserMajorVersion +
      ' (' + jscd.browserVersion + ')\n' + 
    'Mobile: ' + jscd.mobile + '\n' +
    'Flash: ' + jscd.flashVersion + '\n' +
    'Cookies: ' + jscd.cookies + '\n' +
    'Viewport width: ' + jscd.vieww + '\n' +
    'Viewport heigth: ' + jscd.viewh + '\n' +
    'Screen Size: ' + jscd.screen + '\n\n' +
    'Full User Agent: ' + navigator.userAgent
    );

with this in a multiple short text
Code:
       var thisQuestion = $('#question{QID}');
// Fill the array
       $('input[type=text]:eq(0)', thisQuestion).val(jscd.os +' '+ jscd.osVersion);
       $('input[type=text]:eq(1)', thisQuestion).val(jscd.browser +' '+ jscd.browserMajorVersion +
          ' (' + jscd.browserVersion + ')' );
       $('input[type=text]:eq(2)', thisQuestion).val( jscd.vieww );
       $('input[type=text]:eq(3)', thisQuestion).val( jscd.viewh );
    });

 

Joffm
 

Volunteers are not paid.
Not because they are worthless, but because they are priceless
The following user(s) said Thank You: tammo

Please Log in to join the conversation.

  • tammo
  • tammo's Avatar
  • Offline
  • Official LimeSurvey Partner
  • Official LimeSurvey Partner
More
2 years 11 months ago #215001 by tammo
Priceless! Thank you!

Tammo


Tammo ter Hark at Respondage
For Limesurvey reporting, education and customized themes
respondage.nl

Please Log in to join the conversation.

  • DenisChenu
  • DenisChenu's Avatar
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
2 years 11 months ago #215016 by DenisChenu
Replied by DenisChenu on topic Is Limesurvey able to detect the used device?

Assistance on LimeSurvey forum and LimeSurvey core development are on my free time.
I'm not a LimeSurvey GmbH member, professional service on demand , plugin development .
I don't answer to private message.

Please Log in to join the conversation.

  • tammo
  • tammo's Avatar
  • Offline
  • Official LimeSurvey Partner
  • Official LimeSurvey Partner
More
2 years 11 months ago #215019 by tammo
Hi Denis,

I think this would be a great solution for many people that did not even know that this existed. So: yes, I kindly ask you to add these extra features.

That would be great!

My use case: my customer wants to exclude some questions/question groupds for people that visit the survey on their mobile phone.

Other use case that I can think of: add some extra questions about where you are when you are answering via your mobile phone.

Thanks in advance,

Tammo


Tammo ter Hark at Respondage
For Limesurvey reporting, education and customized themes
respondage.nl

Please Log in to join the conversation.

  • tpartner
  • tpartner's Avatar
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
2 years 11 months ago #215024 by tpartner
Replied by tpartner on topic Is Limesurvey able to detect the used device?
3rd use case - to convince clients that they should be designing/targeting their surveys for mobile devices. I frequently sniff the user agent and screen size to prove to clients that 50% + of responses are on phones.

Cheers,
Tony Partner

Solutions, code and workarounds presented in these forums are given without any warranty, implied or otherwise.

Please Log in to join the conversation.

  • DenisChenu
  • DenisChenu's Avatar
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
2 years 11 months ago #215040 by DenisChenu
Replied by DenisChenu on topic Is Limesurvey able to detect the used device?
Working on it this week-end : i think it's better to create it as a Question settings ?

Not a theme : reason :
1. It must work on a whole in one survey
2. It must allow using value even it's hidden by attribute
3. The value muts be used in all Expression Manager system : even when start (no need JS).

What it's you opinion about Question type :
- In short text question type : fill by 'drodown for each value'
- A multiple short text : Use as userAgentInfo : need to fill subquestion code for each type ?

PS : i send an update just for isTablet and isMobile this afternoon.

Assistance on LimeSurvey forum and LimeSurvey core development are on my free time.
I'm not a LimeSurvey GmbH member, professional service on demand , plugin development .
I don't answer to private message.

Please Log in to join the conversation.

  • tammo
  • tammo's Avatar
  • Offline
  • Official LimeSurvey Partner
  • Official LimeSurvey Partner
More
2 years 11 months ago #215049 by tammo
Not exactly sure about what you mean:
2. It must allow using value even it's hidden by attribute ?
3. The value muts be used in all Expression Manager system : even when start (no need JS).

When using a short text question: the survey designer has flexibility to choose what value he want to use. Could be that he is just interested in the "isMobile" value and not in others.

A multiple short text question would be ideal, but it will take a big task in defining a good user interface for that, I guess.

This is what I could make of what Joffm proposed:
research.respondage.eu/index.php/952431?newtest=Y&lang=en

See attached .lss file for example


Tammo ter Hark at Respondage
For Limesurvey reporting, education and customized themes
respondage.nl

Please Log in to join the conversation.

  • DenisChenu
  • DenisChenu's Avatar
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
2 years 11 months ago #215050 by DenisChenu
Replied by DenisChenu on topic Is Limesurvey able to detect the used device?
> 2. It must allow using value even it's hidden by attribute ?

With JS solution : you need to hide the question by CSS, in my opinion : you must be allowed to really hide questions.
With JS solution : maybe user can update answer ?
With JS solution : can not use in a question by question survey

> 3. The value muts be used in all Expression Manager system : even when start (no need JS).

With JS solution : you need to add javascript to upadet answer and trigger if some question must be hidden for mobile at 1st page.

If we fill like prefilling URL : i think we can use on 1st page .
Even in the text , or adding a class on some question etc …

Else about hidding some question for mobile/tablet/ etc … you can use getbootstrap.com/docs/3.4/css/#responsive-utilities-classes directly.

Assistance on LimeSurvey forum and LimeSurvey core development are on my free time.
I'm not a LimeSurvey GmbH member, professional service on demand , plugin development .
I don't answer to private message.

Please Log in to join the conversation.

Lime-years ahead

Online-surveys for every purse and purpose