-
Notifications
You must be signed in to change notification settings - Fork 12
/
jquery.disable.autocomplete.js
111 lines (92 loc) · 2.93 KB
/
jquery.disable.autocomplete.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/*
* jQuery Disable Autocomplete Plugin v${version}
* https://github.com/say2joe/jquery.disable-autocomplete
*
* Date: ${timestamp}
*/
(function($) {
function disableAutocomplete() {
var $input = $(this).attr("autocomplete", "off").val('');
if (typeof this.selectionStart === "undefined") {
return true; // Older browsers are OK.
}
var $clone = $input.clone().removeAttr("placeholder");
var $hidden = $input.clone().removeAttr("placeholder").attr("type", "hidden");
var rePswdChar = /^[\w\ \`\~\!\@\#\$\%\^\&\*\(\)\-\=\+\/\?\.\>\,\<\'\"\;\:\\\|\]\}\[\{]$/;
var reBackDelete = /^(8|46)$/;
var reArrowKey = /^(37|39)$/;
var reSubmit = /^(13)$/;
function maskAndSyncInputs (event) {
var key = event.which;
var maskedValue = $clone.val();
var actualValue = $hidden.val();
var cursorPos = this.selectionStart;
var character = String.fromCharCode(key);
var selectionLength = (this.selectionEnd - cursorPos);
var isSubmit = reSubmit.test(key);
var isArrowKey = reArrowKey.test(event.keyCode);
var isBackspaceOrDelete = reBackDelete.test(key);
var isAcceptablePswdChar = rePswdChar.test(character);
if (maskedValue === "password") maskedValue = '';
if (actualValue === "password") actualValue = '';
var arrMaskedValue = maskedValue.split('');
var arrActualValue = actualValue.split('');
if (event.type === "keydown") {
if (isBackspaceOrDelete) {
if (selectionLength) {
//arrMaskedValue.splice(cursorPos, selectionLength);
arrActualValue.splice(cursorPos, selectionLength);
} else if (key === 46) { // Delete next character
//arrMaskedValue.splice(cursorPos, 1);
arrActualValue.splice(cursorPos, 1);
} else { // Delete last character (backspace)
//arrMaskedValue.splice(--cursorPos, 1);
arrActualValue.splice(cursorPos, 1);
}
$hidden.val(arrActualValue.join(''));
//$clone.val(arrMaskedValue.join(''));
}
return true;
} else if (event.type === "keypress") {
if (isSubmit) this.form.submit();
if (isAcceptablePswdChar) {
arrActualValue.splice(cursorPos, selectionLength, character);
arrMaskedValue.splice(cursorPos, selectionLength, '*');
cursorPos++;
} else {
return isBackspaceOrDelete || isArrowKey;
}
} else {
// Disable pasting passwords.
return false;
}
maskedValue = arrMaskedValue.join('');
actualValue = arrActualValue.join('');
$hidden.val(actualValue);
$clone.val(maskedValue);
this.setSelectionRange(
cursorPos, cursorPos
);
return false;
}
$clone.attr({
type : "text", name : ""
}).on(
"keypress keydown paste", maskAndSyncInputs
);
$input.before(
$hidden, $clone
).remove();
$input = null;
}
$.fn.extend({
disableAutocomplete: function() {
var reValidFields = /text|password/i;
return this.each(function() {
if (reValidFields.test(this.type)) {
disableAutocomplete.call(this);
}
});
}
});
})(jQuery);