118 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			118 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
| /**
 | |
|  * Autofill event polyfill ##version:1.0.0##
 | |
|  * (c) 2014 Google, Inc.
 | |
|  * License: MIT
 | |
|  */
 | |
| (function(window) {
 | |
|   var $ = window.jQuery || window.angular.element;
 | |
|   var rootElement = window.document.documentElement,
 | |
|     $rootElement = $(rootElement);
 | |
| 
 | |
|   addGlobalEventListener('change', markValue);
 | |
|   addValueChangeByJsListener(markValue);
 | |
| 
 | |
|   $.prototype.checkAndTriggerAutoFillEvent = jqCheckAndTriggerAutoFillEvent;
 | |
| 
 | |
|   // Need to use blur and not change event
 | |
|   // as Chrome does not fire change events in all cases an input is changed
 | |
|   // (e.g. when starting to type and then finish the input by auto filling a username)
 | |
|   addGlobalEventListener('blur', function(target) {
 | |
|     // setTimeout needed for Chrome as it fills other
 | |
|     // form fields a little later...
 | |
|     window.setTimeout(function() {
 | |
|       findParentForm(target).find('input').checkAndTriggerAutoFillEvent();
 | |
|     }, 20);
 | |
|   });
 | |
| 
 | |
|   window.document.addEventListener('DOMContentLoaded', function() {
 | |
|     // The timeout is needed for Chrome as it auto fills
 | |
|     // login forms some time after DOMContentLoaded!
 | |
|     window.setTimeout(function() {
 | |
|       $rootElement.find('input').checkAndTriggerAutoFillEvent();
 | |
|     }, 200);
 | |
|   }, false);
 | |
| 
 | |
|   return;
 | |
| 
 | |
|   // ----------
 | |
| 
 | |
|   function jqCheckAndTriggerAutoFillEvent() {
 | |
|     var i, el;
 | |
|     for (i=0; i<this.length; i++) {
 | |
|       el = this[i];
 | |
|       if (!valueMarked(el)) {
 | |
|         markValue(el);
 | |
|         triggerChangeEvent(el);
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   function valueMarked(el) {
 | |
|     var val = el.value,
 | |
|          $$currentValue = el.$$currentValue;
 | |
|     if (!val && !$$currentValue) {
 | |
|       return true;
 | |
|     }
 | |
|     return val === $$currentValue;
 | |
|   }
 | |
| 
 | |
|   function markValue(el) {
 | |
|     el.$$currentValue = el.value;
 | |
|   }
 | |
| 
 | |
|   function addValueChangeByJsListener(listener) {
 | |
|     var jq = window.jQuery || window.angular.element,
 | |
|         jqProto = jq.prototype;
 | |
|     var _val = jqProto.val;
 | |
|     jqProto.val = function(newValue) {
 | |
|       var res = _val.apply(this, arguments);
 | |
|       if (arguments.length > 0) {
 | |
|         forEach(this, function(el) {
 | |
|           listener(el, newValue);
 | |
|         });
 | |
|       }
 | |
|       return res;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   function addGlobalEventListener(eventName, listener) {
 | |
|     // Use a capturing event listener so that
 | |
|     // we also get the event when it's stopped!
 | |
|     // Also, the blur event does not bubble.
 | |
|     rootElement.addEventListener(eventName, onEvent, true);
 | |
| 
 | |
|     function onEvent(event) {
 | |
|       var target = event.target;
 | |
|       listener(target);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   function findParentForm(el) {
 | |
|     while (el) {
 | |
|       if (el.nodeName === 'FORM') {
 | |
|         return $(el);
 | |
|       }
 | |
|       el = el.parentNode;
 | |
|     }
 | |
|     return $();
 | |
|   }
 | |
| 
 | |
|   function forEach(arr, listener) {
 | |
|     if (arr.forEach) {
 | |
|       return arr.forEach(listener);
 | |
|     }
 | |
|     var i;
 | |
|     for (i=0; i<arr.length; i++) {
 | |
|       listener(arr[i]);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   function triggerChangeEvent(element) {
 | |
|     var doc = window.document;
 | |
|     var event = doc.createEvent("HTMLEvents");
 | |
|     event.initEvent("change", true, true);
 | |
|     element.dispatchEvent(event);
 | |
|   }
 | |
| 
 | |
| })(window);
 |