/** * 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 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