form-inputmode.js 1.42 KB
webshim.register('form-inputmode', function($, webshims, window, document, undefined, options){
	"use strict";
	var ua = navigator.userAgent;
	var removeListener = function(elem){
		elem.removeEventListener('blur', switchBack, true);
	};
	var needsPattern = (/iphone|ipod/i).test(ua);
	var regPattern = /^[\\d\*|\[0\-9\]]*[\+|\{\d*\,\d*\}|*]*$/;
	var stopPatterns = needsPattern || (/ipad|ios/i).test(ua) ?
		{
			'[0-9]*': 1,
			'\\d*': 1
		} :
			false
		;
	var switchBack = function(e){
		removeListener(e.target);
		e.target.type = 'text';
	};
	var removeDocListener = function(){
		document.removeEventListener('focus', addFix, true);
		document.removeEventListener('touchstart', addFix, true);
	};
	var allowSwitchByPattern = function(elem){
		var pattern;
		var switchAllowed = true;

		if(stopPatterns){
			pattern = elem.getAttribute('pattern') || '';
			if(stopPatterns[pattern] || (needsPattern && (!pattern || !regPattern.test(pattern)))){
				switchAllowed = false;
			}
		}

		return switchAllowed;
	};

	var addFix = function(e){
		if(e.target.type == 'text' && e.target.getAttribute('inputmode') == 'numeric' && allowSwitchByPattern(e.target)){
			try{
				removeListener(e.target);
				e.target.addEventListener('blur', switchBack, true);
				e.target.type = 'tel';
			} catch (er){
				removeDocListener();
			}
		}
	};

	document.addEventListener('focus', addFix, true);
	document.addEventListener('touchstart', addFix, true);
});