Welcome to the LimeSurvey Community Forum

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

Checking if a survey is opened via mobile device?

  • DanielVN
  • DanielVN's Avatar Topic Author
  • Offline
  • Senior Member
  • Senior Member
More
5 years 11 months ago #168679 by DanielVN
Hi,

I have a request from a client that wants to make sure that the a potential survey will be opened only via mobile device. If not we should screen out the respondents.

Could you please advise if there is any solution for this?

Thank you very much in advance.

Best regrads
Daniel
The topic has been locked.
  • tpartner
  • tpartner's Avatar
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
5 years 11 months ago #168680 by tpartner
Define "mobile device". That's a moving target now. For example a Surface Pro is both a tablet and a PC/laptop. You may be better to target screen sizes.

Cheers,
Tony Partner

Solutions, code and workarounds presented in these forums are given without any warranty, implied or otherwise.
The topic has been locked.
  • DanielVN
  • DanielVN's Avatar Topic Author
  • Offline
  • Senior Member
  • Senior Member
More
5 years 11 months ago #168682 by DanielVN
Hi Tony,

For this particular survey we should consider only mobile phones as mobile device.
Just to add i'm using lime version 2.73.
The topic has been locked.
  • DenisChenu
  • DenisChenu's Avatar
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
5 years 11 months ago #168683 by DenisChenu
Replied by DenisChenu on topic Checking if a survey is opened via mobile device?
Tony are right,

Else :
- Included javascript solution : github.com/LimeSurvey/LimeSurvey/tree/ma...answer/shortfreetext
- PHP solution (need little update for 3.X) gitlab.com/SondagesPro/findUserAgentInfo

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.
The topic has been locked.
More
5 years 11 months ago #168685 by orvil
You will find a jQuery solution here, working in most cases to my experience:
detectmobilebrowsers.com/

Hint: add this to DenisChenu's script addon in an hidden equation question at the beginning of the survey

jQuery code:
Code:
/**
 * jQuery.browser.mobile (http://detectmobilebrowser.com/)
 *
 * jQuery.browser.mobile will be true if the browser is a mobile device
 *
 **/
(function(a){(jQuery.browser=jQuery.browser||{}).mobile=/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))})(navigator.userAgent||navigator.vendor||window.opera);

There is also a php version avaliable on the page I've mentioned. This could be integrated into the em_expression-helper.php =>@tpartner this brings me back to the idea of an update save extendable em_expression_helper :)

Best regards/Beste Grüße,
O. Villani
The topic has been locked.
  • Joffm
  • Joffm's Avatar
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
5 years 11 months ago #168689 by Joffm
Hi, here is another JS solution
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 can check for the "jscd.mobile" or the viewport or screensize.

Joffm

Volunteers are not paid.
Not because they are worthless, but because they are priceless
The topic has been locked.
  • DanielVN
  • DanielVN's Avatar Topic Author
  • Offline
  • Senior Member
  • Senior Member
More
5 years 11 months ago #168690 by DanielVN
Thank you all for your help.

I'm afraid that i might need some step by step guidance in order to implement this in the survey.

Thank you very much in advance.
The topic has been locked.
More
5 years 11 months ago #168693 by orvil
Hi DanielVN,

may I ask for the version of LS you are working with? Will help for step-by-step :)

Best regards/Beste Grüße,
O. Villani
The topic has been locked.
  • DanielVN
  • DanielVN's Avatar Topic Author
  • Offline
  • Senior Member
  • Senior Member
More
5 years 11 months ago #168694 by DanielVN
Hi Orvil,

I'm using version 2.73.0+171219 :)
The topic has been locked.
  • Joffm
  • Joffm's Avatar
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
5 years 11 months ago #168697 by Joffm
Hi, Daniel,
here is a working example.

If there are any questions about the equation, don't hesitate to ask.

Joffm

File Attachment:

File Name: limesurvey...4985.lss
File Size:25 KB

Volunteers are not paid.
Not because they are worthless, but because they are priceless
The topic has been locked.
  • DenisChenu
  • DenisChenu's Avatar
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
5 years 11 months ago #168701 by DenisChenu
Replied by DenisChenu on topic Checking if a survey is opened via mobile device?

orvil wrote: Hint: add this to DenisChenu's script addon in an hidden equation question at the beginning of the survey

My solution is done without javascript , with hidden (totally, not by css or javascript).

Done with PHP Server var :)

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.
The topic has been locked.
More
5 years 11 months ago #168702 by orvil
Hi,

simplest way:

A - decide which info is required

1.) create a new question (textarea)
2.) use the "Source" button in the Question editor
3.) copy and paste joffm's script (it gives you more information than mine) into the editor area
3) save the question an run it

You will see something like this:
Code:
 
OS: Windows 7
Browser: Chrome 66 (66.0.3359.170)
Mobile: false
Flash: no check
Cookies: true
Viewport width: 2691
Viewport heigth: 1612
Screen Size: 3072 x 1728
 
Full User Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.170 Safari/537.36

B - if necessary delete the lines not necessary. E.g. if you only need the mobile flag, reduce the part of the script (at the end)
Code:
...
...
 
$(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
    );
    });

to:
Code:
...
...
$(document).ready(function() {  
 
    // Hide this question (remove double slash below to hide)
    //$('#question{QID}').hide();
 
    // Load the question
    $('#question{QID} textarea').val(
 
    jscd.mobile;
    );
    });
 

Best regards/Beste Grüße,
O. Villani
The topic has been locked.

Lime-years ahead

Online-surveys for every purse and purpose