mdb-ui-kit/js/autofill.js

110 lines
3.2 KiB
JavaScript
Raw Normal View History

2017-08-11 17:59:31 +03:00
import Base from "./base";
2017-08-11 17:59:31 +03:00
const Autofill = ($ => {
/**
* ------------------------------------------------------------------------
* Constants
* ------------------------------------------------------------------------
*/
2017-08-11 17:59:31 +03:00
const NAME = "autofill";
const DATA_KEY = `bmd.${NAME}`;
const JQUERY_NAME = `bmd${NAME.charAt(0).toUpperCase() + NAME.slice(1)}`;
const JQUERY_NO_CONFLICT = $.fn[JQUERY_NAME];
2017-08-11 17:59:31 +03:00
const Default = {};
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
class Autofill extends Base {
constructor($element, config) {
2017-08-11 17:59:31 +03:00
super($element, $.extend(true, {}, Default, config));
2017-08-11 17:59:31 +03:00
this._watchLoading();
this._attachEventHandlers();
}
dispose() {
2017-08-11 17:59:31 +03:00
super.dispose(DATA_KEY);
}
// ------------------------------------------------------------------------
// private
_watchLoading() {
// After 10 seconds we are quite sure all the needed inputs are autofilled then we can stop checking them
setTimeout(() => {
2017-08-11 17:59:31 +03:00
clearInterval(this._onLoading);
}, 10000);
}
// This part of code will detect autofill when the page is loading (username and password inputs for example)
_onLoading() {
setInterval(() => {
2017-08-11 17:59:31 +03:00
$("input[type!=checkbox]").each((index, element) => {
let $element = $(element);
if ($element.val() && $element.val() !== $element.attr("value")) {
$element.trigger("change");
}
2017-08-11 17:59:31 +03:00
});
}, 100);
}
_attachEventHandlers() {
// Listen on inputs of the focused form
// (because user can select from the autofill dropdown only when the input has focus)
2017-08-11 17:59:31 +03:00
let focused = null;
$(document)
2017-08-11 17:59:31 +03:00
.on("focus", "input", event => {
let $inputs = $(event.currentTarget)
.closest("form")
.find("input")
.not("[type=file]");
focused = setInterval(() => {
$inputs.each((index, element) => {
2017-08-11 17:59:31 +03:00
let $element = $(element);
if ($element.val() !== $element.attr("value")) {
$element.trigger("change");
}
2017-08-11 17:59:31 +03:00
});
}, 100);
})
2017-08-11 17:59:31 +03:00
.on("blur", ".form-group input", () => {
clearInterval(focused);
});
}
// ------------------------------------------------------------------------
// static
static _jQueryInterface(config) {
2017-08-11 17:59:31 +03:00
return this.each(function() {
let $element = $(this);
let data = $element.data(DATA_KEY);
if (!data) {
2017-08-11 17:59:31 +03:00
data = new Autofill($element, config);
$element.data(DATA_KEY, data);
}
2017-08-11 17:59:31 +03:00
});
}
}
/**
* ------------------------------------------------------------------------
* jQuery
* ------------------------------------------------------------------------
*/
2017-08-11 17:59:31 +03:00
$.fn[JQUERY_NAME] = Autofill._jQueryInterface;
$.fn[JQUERY_NAME].Constructor = Autofill;
$.fn[JQUERY_NAME].noConflict = () => {
2017-08-11 17:59:31 +03:00
$.fn[JQUERY_NAME] = JQUERY_NO_CONFLICT;
return Autofill._jQueryInterface;
};
2017-08-11 17:59:31 +03:00
return Autofill;
})(jQuery);
2017-08-11 17:59:31 +03:00
export default Autofill;