Is Limesurvey able to detect the used device?

More
1 year 2 weeks ago #204699 by Joffm
Enter this script in a question of type "long free text" (source code mode)
<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' && !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.

More
1 year 2 weeks 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.

More
1 year 2 weeks 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.

More
5 months 4 days 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.

More
5 months 4 days ago #214983 by Joffm
Hi, Tammo,
I replaced this
// 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
       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
Attachments:
The following user(s) said Thank You: tammo

Please Log in to join the conversation.

More
5 months 3 days 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.

More
5 months 3 days ago #215016 by DenisChenu

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.

More
5 months 3 days 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.

More
5 months 2 days ago #215024 by tpartner
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.

More
5 months 1 day ago #215040 by DenisChenu
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.

More
5 months 1 day 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
Attachments:

Please Log in to join the conversation.

More
5 months 1 day ago #215050 by DenisChenu
> 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.

More
5 months 1 day ago #215052 by tammo
Denis,

I think you are much more technically advanced than I am, I am afraid that I cannot see the complete implications of what you propose, sorry.

I understand that you would like to implement a non-javascript solution.

Hiding by CSS is not really hiding, is it? Because the HTML is there, but by display:none; it is hidden? In the script that I used the hiding can be done via uncommenting a javascript statement. Is that bad?

What I learned from your mail: you can add a class to a question based on earlier values? So a class on a question can be defined via Expression Script? I had never thought of that, but that is great.

Tammo


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

Please Log in to join the conversation.

More
5 months 1 day ago - 5 months 1 day ago #215062 by jelo

 Hiding by CSS is not really hiding, is it? Because the HTML is there, but by display:none; it is hidden?

Usually "display: none;" is a form of hiding by CSS.

With many workarounds where Javascript is involved to place content into answer fields, you can only hide these fields visually, The content is still in the HTML code and still public.
The Javascript code needs the form elements to write the data into it. If you use the "Always hidden" function of LimeSurvey the fields are removed from the HTML code.
So the always hidden function in LimeSurvey is less and less useful, since without workarounds the feature gap to the competition is too high.

The enduser can inspect and manipulate the data hidden via the webdeveloper tools bundled with every modern browser. That is no longer possible to prevent, without bringing LimeSurvey back into the stoneage.

bugs.limesurvey.org/view.php?id=11665

The meaning of the word "stable" for users
www.limesurvey.org/forum/development/117...ord-stable-for-users
Last edit: 5 months 1 day ago by jelo.
The following user(s) said Thank You: DenisChenu

Please Log in to join the conversation.

More
5 months 1 day ago - 5 months 1 day ago #215066 by tammo
Thank you Jelo, this is clear: hiding via css and/or javascript is still open for manipulation. I think that in many surveys this will not be a problem, but still, I see the need for a more robust solution where data will still be written to the database, without any possibility that it is shown on the screen.

I guess that what Denis is working on (a plugin of special question type) will be more robust.

I think that a solution where you van use a special type of short text question and fill it with a variable that is detected, like viewport-width or isMobile would be very good, since it opens the possibility to tailor the survey to the possibilities that the user has.
I also think that defining a multiple short text question would even be better, but far more difficult to define, since it would need a specific user interface where the user (developer of surveys) is shown what is possible with that specific question.

Tammo


Tammo ter Hark at Respondage
For Limesurvey reporting, education and customized themes
respondage.nl
Last edit: 5 months 1 day ago by tammo.

Please Log in to join the conversation.

Start now!

Just create your account and start using Limesurvey today.

Register now