如何判断浏览器是否自动填充了文本框?特别是用户名和&自动填充页面加载的密码框。
我的第一个问题是在页面加载序列中何时发生这种情况?是在document.ready之前还是之后?
其次,我如何使用逻辑来确定是否发生了这种情况?它不是我想阻止这种情况发生,只是挂钩事件。最好是这样的:
if (autoFilled == true) {
} else {
}
如果可能的话,我很乐意看到一个jsfiddle显示你的答案。
可能重复
DOM event for browser password autofill?
Browser Autofill and Javascript triggered events
- 这两个问题都没有真正解释触发了什么事件,他们只是不断重新检查文本框(不利于性能!)。
答案 0 :(得分:113)
问题是自动填充由不同的浏览器以不同的方式处理。有些人发送变更事件,有些则没有。因此,几乎不可能挂钩浏览器自动填充输入字段时触发的事件。
更改不同浏览器的事件触发器:
对于用户名/密码字段:
对于其他表单字段:
您最好的选择是在表单中使用autocomplete="off"
停用表单的自动填充功能,或者定期轮询以查看表单是否已填充。
关于它是否在document.ready之前或之前填写的问题,它在浏览器之间甚至版本之间都有所不同。仅对于用户名/密码字段,仅在您选择用户名时填写密码字段。因此,如果您尝试附加到任何事件,您将会有一个非常混乱的代码。
您可以对此HERE
有一个很好的阅读答案 1 :(得分:50)
来自 : - webkit-autofill CSS伪类的MDN文档:
:-webkit-autofill CSS伪类匹配一个元素的值由浏览器自动填充
我们可以在所需的<input>
元素:-webkit-autofill
上定义一个void transition css规则。然后,JS将能够挂钩animationstart
事件。
致Klarna UI小组的积分。在这里看到他们很好的实现:
答案 2 :(得分:15)
以防万一有人在寻找解决方案(就像我今天一样),听一下浏览器自动填充更改,这里是我自己构建的自定义jquery方法,只是为了简化过程向输入添加更改侦听器:
$.fn.allchange = function (callback) {
var me = this;
var last = "";
var infunc = function () {
var text = $(me).val();
if (text != last) {
last = text;
callback();
}
setTimeout(infunc, 100);
}
setTimeout(infunc, 100);
};
您可以这样称呼它:
$("#myInput").allchange(function () {
alert("change!");
});
答案 3 :(得分:14)
这适用于最新的Firefox,Chrome和Edge:
$('#email').on('blur input', function() {
....
});
答案 4 :(得分:13)
对于Google Chrome自动填充功能,这对我有用:
if ($("#textbox").is(":-webkit-autofill"))
{
// the value in the input field of the form was filled in with google chrome autocomplete
}
答案 5 :(得分:7)
不幸的是,我发现检查此跨浏览器的唯一可靠方法是轮询输入。为了使其响应也听取事件。 Chrome已开始隐藏javascript中的自动填充值,这需要黑客攻击。
为Chrome隐藏的自动填充密码值添加修复程序。
$(document).ready(function () {
$('#inputID').change(YOURFUNCTIONNAME);
$('#inputID').keypress(YOURFUNCTIONNAME);
$('#inputID').keyup(YOURFUNCTIONNAME);
$('#inputID').blur(YOURFUNCTIONNAME);
$('#inputID').focusin(YOURFUNCTIONNAME);
$('#inputID').focusout(YOURFUNCTIONNAME);
$('#inputID').on('input', YOURFUNCTIONNAME);
$('#inputID').on('textInput', YOURFUNCTIONNAME);
$('#inputID').on('reset', YOURFUNCTIONNAME);
window.setInterval(function() {
var hasValue = $("#inputID").val().length > 0;//Normal
if(!hasValue){
hasValue = $("#inputID:-webkit-autofill").length > 0;//Chrome
}
if (hasValue) {
$('#inputID').trigger('change');
}
}, 333);
});
答案 6 :(得分:7)
我正在阅读很多关于这个问题的内容,并希望提供一个非常快速的解决方法来帮助我。
let style = window.getComputedStyle(document.getElementById('email'))
if (style && style.backgroundColor !== inputBackgroundNormalState) {
this.inputAutofilledByBrowser = true
}
我的模板的inputBackgroundNormalState
是&#39; rgb(255,255,255)&#39;。
所以基本上当浏览器应用自动完成时,他们倾向于通过在输入上应用不同的(恼人的)黄色来表明输入是自动填充的。
编辑:它适用于每个浏览器
答案 7 :(得分:6)
有一个新的polyfill组件可以在github上解决这个问题。看看autofill-event。只需要bower安装它并自动填充,自动填充按预期工作。
bower install autofill-event
答案 8 :(得分:4)
我的解决方案:
像往常一样收听change
个事件,并在DOM内容加载上执行此操作:
setTimeout(function() {
$('input').each(function() {
var elem = $(this);
if (elem.val()) elem.change();
})
}, 250);
这会在用户有机会编辑之前触发所有非空字段的更改事件。
答案 9 :(得分:4)
我一直在寻找类似的东西。仅限Chrome ...在我的情况下,包装器div需要知道输入字段是否已自动填充。因此,当Chrome自动填充时,我可以像输入字段那样给它额外的CSS。通过查看上面的所有答案,我的综合解决方案如下:
/*
* make a function to use it in multiple places
*/
var checkAutoFill = function(){
$('input:-webkit-autofill').each(function(){
$(this).closest('.input-wrapper').addClass('autofilled');
});
}
/*
* Put it on the 'input' event
* (happens on every change in an input field)
*/
$('html').on('input', function() {
$('.input-wrapper').removeClass('autofilled');
checkAutoFill();
});
/*
* trigger it also inside a timeOut event
* (happens after chrome auto-filled fields on page-load)
*/
setTimeout(function(){
checkAutoFill();
}, 0);
这个工作的html将是
<div class="input-wrapper">
<input type="text" name="firstname">
</div>
答案 10 :(得分:3)
我也面临同样的问题,标签没有检测到自动填充,并且在填充文本上移动标签的动画是重叠的,这个解决方案对我有用。
input:-webkit-autofill ~ label {
top:-20px;
}
答案 11 :(得分:2)
我对这个问题有完美的解决方案试试这个代码片段
Demo is here
function ModernForm() {
var modernInputElement = $('.js_modern_input');
function recheckAllInput() {
modernInputElement.each(function() {
if ($(this).val() !== '') {
$(this).parent().find('label').addClass('focus');
}
});
}
modernInputElement.on('click', function() {
$(this).parent().find('label').addClass('focus');
});
modernInputElement.on('blur', function() {
if ($(this).val() === '') {
$(this).parent().find('label').removeClass('focus');
} else {
recheckAllInput();
}
});
}
ModernForm();
&#13;
.form_sec {
padding: 30px;
}
.form_sec .form_input_wrap {
position: relative;
}
.form_sec .form_input_wrap label {
position: absolute;
top: 25px;
left: 15px;
font-size: 16px;
font-weight: 600;
z-index: 1;
color: #333;
-webkit-transition: all ease-in-out 0.35s;
-moz-transition: all ease-in-out 0.35s;
-ms-transition: all ease-in-out 0.35s;
-o-transition: all ease-in-out 0.35s;
transition: all ease-in-out 0.35s;
}
.form_sec .form_input_wrap label.focus {
top: 5px;
color: #a7a9ab;
font-weight: 300;
-webkit-transition: all ease-in-out 0.35s;
-moz-transition: all ease-in-out 0.35s;
-ms-transition: all ease-in-out 0.35s;
-o-transition: all ease-in-out 0.35s;
transition: all ease-in-out 0.35s;
}
.form_sec .form_input {
width: 100%;
font-size: 16px;
font-weight: 600;
color: #333;
border: none;
border-bottom: 2px solid #d3d4d5;
padding: 30px 0 5px 0;
outline: none;
}
.form_sec .form_input.err {
border-bottom-color: #888;
}
.form_sec .cta_login {
border: 1px solid #ec1940;
border-radius: 2px;
background-color: #ec1940;
font-size: 14px;
font-weight: 500;
text-align: center;
color: #ffffff;
padding: 15px 40px;
margin-top: 30px;
display: inline-block;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<form class="form_sec">
<div class="row clearfix">
<div class="form-group col-lg-6 col-md-6 form_input_wrap">
<label>
Full Name
</label>
<input type="text" name="name" id="name" class="form_input js_modern_input">
</div>
</div>
<div class="row clearfix">
<div class="form-group form_input_wrap col-lg-6 col-md-6">
<label>
Emaill
</label>
<input type="email" name="email" class="form_input js_modern_input">
</div>
</div>
<div class="row clearfix">
<div class="form-group form_input_wrap col-lg-12 col-md-12">
<label>
Address Line 1
</label>
<input type="text" name="address" class="form_input js_modern_input">
</div>
</div>
<div class="row clearfix">
<div class="form-group col-lg-6 col-md-6 form_input_wrap">
<label>
City
</label>
<input type="text" name="city" class="form_input js_modern_input">
</div>
<div class="form-group col-lg-6 col-md-6 form_input_wrap">
<label>
State
</label>
<input type="text" name="state" class="form_input js_modern_input">
</div>
</div>
<div class="row clearfix">
<div class="form-group col-lg-6 col-md-6 form_input_wrap">
<label>
Country
</label>
<input type="text" name="country" class="form_input js_modern_input">
</div>
<div class="form-group col-lg-4 col-md-4 form_input_wrap">
<label>
Pin
</label>
<input type="text" name="pincode" class="form_input js_modern_input">
</div>
</div>
<div class="row cta_sec">
<div class="col-lg-12">
<button type="submit" class="cta_login">Submit</button>
</div>
</div>
</form>
&#13;
答案 12 :(得分:2)
在chrome上,您可以通过为自动填充元素设置特殊的css规则来检测自动填充字段,然后使用javascript检查元素是否已应用该规则。
示例:
CSS
input:-webkit-autofill {
-webkit-box-shadow: 0 0 0 30px white inset;
}
的JavaScript
let css = $("#selector").css("box-shadow")
if (css.match(/inset/))
console.log("autofilled:", $("#selector"))
答案 13 :(得分:1)
我知道这是一个老线程,但我可以想象很多人会在这里找到解决方案。
为此,您可以检查输入是否具有以下值:
$(function() {
setTimeout(function() {
if ($("#inputID").val().length > 0) {
// YOUR CODE
}
}, 100);
});
我自己使用它来检查登录表单中的值,以便在启用提交按钮时加载它。 代码是为jQuery编写的,但如果需要可以很容易地更改。
答案 14 :(得分:1)
在Chrome和Edge(2020年)中,检查:-webkit-autofill
会告诉您输入已被填充。但是,除非用户以某种方式与页面交互,否则您的JavaScript无法获取输入中的值。
在代码中使用$('x').focus()
和$('x').blur()
或触发鼠标事件无济于事。
答案 15 :(得分:1)
这是使用 webkit渲染引擎的浏览器的解决方案。 当表单自动填充时,输入将获得伪类: - webkit-autofill - (f.e。input:-webkit-autofill {...})。所以这是你必须通过JavaScript检查的标识符。
使用某种测试形式的解决方案:
$(document).ready(function() {
setTimeout(function() {
$(".js-filled_check input:not([type=submit])").each(function (i, element) {
var el = $(this),
autofilled = (el.is("*:-webkit-autofill")) ? el.addClass('auto_filled') : false;
console.log("element: " + el.attr("id") + " // " + "autofilled: " + (el.is("*:-webkit-autofill")));
});
}, 200);
});
和javascript:
"proxy": "http://localhost:5000/"
页面加载时出现问题是获取密码值,甚至是长度。这是因为浏览器的安全性。还有超时,这是因为浏览器会在一段时间后填写表格。
此代码会将类 auto_filled 添加到已填充的输入中。此外,我试图检查输入类型密码值或长度,但它只是在页面上的某些事件发生后才起作用。所以我尝试触发一些事件,但没有成功。现在这是我的解决方案。 请享用!
答案 16 :(得分:1)
我将此解决方案用于同样的问题。
HTML代码应更改为:
<input type="text" name="username" />
<input type="text" name="password" id="txt_password" />
和jQuery代码应该在document.ready
:
$('#txt_password').focus(function(){
$(this).attr('type','password');
});
答案 17 :(得分:0)
这是来自Klarna UI团队的CSS解决方案。在resource
上查看其不错的实现对我来说很好。
input:-webkit-autofill {
animation-name: onAutoFillStart;
transition: background-color 50000s ease-in-out 0s;
}
input:not(:-webkit-autofill) {
animation-name: onAutoFillCancel;
}
答案 18 :(得分:0)
你可以试试这个来检测并清除所有自动填充
var autofillclear = false;
setInterval(function() {
if ($("input:-webkit-autofill") && autofillclear == false) {
$("input:-webkit-autofill").each(function() {
if ($(this).val() != '') {
$(this).val('');
autofillclear = true;
}
});
}
}, 500);
答案 19 :(得分:0)
$('selector').on('keyup', aFunction);
// If tab is active, auto focus for trigger event keyup, blur, change...
// for inputs has been autofill
$(window).on('load', () => {
if (!document.hidden) {
window.focus();
}
})
这对我有用。 在 Chrome 上测试。
答案 20 :(得分:0)
在 2020 年,这就是我在 chrome 中的作用:
// wait 0.1 sec to execute action after detecting autofill
// check if input username is autofilled by browser
// enable "login" button for click to submit form
$(window).on("load", function(){
setTimeout(function(){
if ($("#UserName").is("input:-webkit-autofill"))
$("#loginbtn").prop('disabled', false);
}, 100);
});
答案 21 :(得分:0)
对于正在寻找2020年纯JS解决方案来检测自动填充的任何人,都可以。
请原谅制表符错误,不能让它很好地定位
//Chose the element you want to select - in this case input
var autofill = document.getElementsByTagName('input');
for (var i = 0; i < autofill.length; i++) {
//Wrap this in a try/catch because non webkit browsers will log errors on this pseudo element
try{
if (autofill[i].matches(':-webkit-autofill')) {
//Do whatever you like with each autofilled element
}
}
catch(error){
return(false);
}
}
答案 22 :(得分:0)
我花了几个小时解决了在首页加载时检测自动填充输入的问题(无需采取任何用户操作),并且找到了理想的解决方案,该解决方案也适用于Chrome,Opera,Edge和FF !
通过使用伪类input:-webkit-autofill
搜索元素并执行所需的操作(在我的情况下,我正在更改输入包装器类以使用浮动标签图案更改标签位置)。
因为FF没有这样的伪类或类似的类(很多人建议使用“:-moz-autofill”),而这些类仅通过搜索DOM就可以看到。您也找不到输入的黄色背景。唯一的原因是浏览器通过更改滤镜属性来添加此黄色:
input:-moz-autofill, input:-moz-autofill-preview { filter: grayscale(21%) brightness(88%) contrast(161%) invert(10%) sepia(40%) saturate(206%); }
因此,对于Firefox,您必须首先搜索所有输入并获取其计算出的样式,然后将其与在浏览器设置中硬编码的此过滤器样式进行比较。我真的不知道为什么他们不只使用背景色,而是那种奇怪的滤镜!?他们使生活更加艰难;)
这是我的代码在网站(https://my.oodo.pl/en/modules/register/login.php)上的魅力所在:
<script type="text/javascript">
/*
* this is my main function
*/
var checkAutoFill = function(){
/*first we detect if we have FF or other browsers*/
var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;
if (!isFirefox) {
$('input:-webkit-autofill').each(function(){
/*here i have code that adds "focused" class to my input wrapper and changes
info instatus div. U can do what u want*/
$(this).closest('.field-wrapper').addClass('focused');
document.getElementById("status").innerHTML = "Your browser autofilled form";
});
}
if (isFirefox) {
$('input').each(function(){
var bckgrnd = window.getComputedStyle(document.getElementById(this.id), null).getPropertyValue("filter");
if (bckgrnd === 'grayscale(0.21) brightness(0.88) contrast(1.61) invert(0.1) sepia(0.4) saturate(2.06)') {
/*if our input has that filter property customized by browserr with yellow background i do as above (change input wrapper class and change status info. U can add your code here)*/
$(this).closest('.field-wrapper').addClass('focused');
document.getElementById("status").innerHTML = "Your Browser autofilled form";
}
})
}
}
/*im runing that function at load time and two times more at 0.5s and 1s delay because not all browsers apply that style imediately (Opera does after ~300ms and so Edge, Chrome is fastest and do it at first function run)*/
checkAutoFill();
setTimeout(function(){
checkAutoFill();
}, 500);
setTimeout(function(){
checkAutoFill();
}, 1000);
})
</script>
我在这里手动编辑了上面的代码,以扔掉一些对您不重要的垃圾。如果它不适用于您,则将其粘贴到您的IDE中并仔细检查语法;)当然,添加一些调试警报或控制台日志并进行自定义。
答案 23 :(得分:0)
我在用户名上使用了模糊事件来检查pwd字段是否已自动填充。
$('#userNameTextBox').blur(function () {
if ($('#userNameTextBox').val() == "") {
$('#userNameTextBox').val("User Name");
}
if ($('#passwordTextBox').val() != "") {
$('#passwordTextBoxClear').hide(); // textbox with "Password" text in it
$('#passwordTextBox').show();
}
});
这适用于IE,适用于所有其他浏览器(我只检查过IE)
答案 24 :(得分:0)
我很难检测Firefox中的自动填充。这是唯一对我有用的解决方案:
HTML:
<div class="inputFields">
<div class="f_o">
<div class="field_set">
<label class="phold">User</label>
<input type="tel" class="form_field " autocomplete="off" value="" maxlength="50">
</div>
</div>
<div class="f_o">
<div class="field_set">
<label class="phold">Password</label>
<input type="password" class="form_field " autocomplete="off" value="" maxlength="50">
</div>
</div>
</div>
CSS:
/* Detect autofill for Chrome */
.inputFields input:-webkit-autofill {
animation-name: onAutoFillStart;
transition: background-color 50000s ease-in-out 0s;
}
.inputFields input:not(:-webkit-autofill) {
animation-name: onAutoFillCancel;
}
@keyframes onAutoFillStart {
}
@keyframes onAutoFillCancel {
}
.inputFields {
max-width: 414px;
}
.field_set .phold{
display: inline-block;
position: absolute;
font-size: 14px;
color: #848484;
-webkit-transform: translate3d(0,8px,0);
-ms-transform: translate3d(0,8px,0);
transform: translate3d(0,8px,0);
-webkit-transition: all 200ms ease-out;
transition: all 200ms ease-out;
background-color: transparent;
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
margin-left: 8px;
z-index: 1;
left: 0;
pointer-events: none;
}
.field_set .phold_active {
font-size: 12px;
-webkit-transform: translate3d(0,-8px,0);
-ms-transform: translate3d(0,-8px,0);
transform: translate3d(0,-8px,0);
background-color: #FFF;
padding-left: 3px;
padding-right: 3px;
}
.field_set input[type='text'], .field_set select, .field_set input[type='tel'], .field_set input[type='password'] {
height: 36px;
}
.field_set input[type='text'], .field_set input[type='tel'], .field_set input[type='password'], .field_set select, .field_set textarea {
box-sizing: border-box;
width: 100%;
padding: 5px;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
border: 1px solid #ababab;
border-radius: 0;
}
.field_set {
margin-bottom: 10px;
position: relative;
}
.inputFields .f_o {
width: 100%;
line-height: 1.42857143;
float: none;
}
JavaScript:
// detect auto-fill when page is loading
$(window).on('load', function() {
// for sign in forms when the user name and password are filled by browser
getAutofill('.inputFields');
});
function getAutofill(parentClass) {
if ($(parentClass + ' .form_field').length > 0) {
var formInput = $(parentClass + ' .form_field');
formInput.each(function(){
// for Chrome: $(this).css('animation-name') == 'onAutoFillStart'
// for Firefox: $(this).val() != ''
if ($(this).css('animation-name') == 'onAutoFillStart' || $(this).val() != '') {
$(this).siblings('.phold').addClass('phold_active');
} else {
$(this).siblings('.phold').removeClass('phold_active');
}
});
}
}
$(document).ready(function(){
$(document).on('click','.phold',function(){
$(this).siblings('input, textarea').focus();
});
$(document).on('focus','.form_field', function(){
$(this).siblings('.phold').addClass('phold_active');
});
// blur for Chrome and change for Firefox
$(document).on('blur change','.form_field', function(){
var $this = $(this);
if ($this.val().length == 0) {
$(this).siblings('.phold').removeClass('phold_active');
} else {
$(this).siblings('.phold').addClass('phold_active');
}
});
// case when form is reloaded due to errors
if ($('.form_field').length > 0) {
var formInput = $('.form_field');
formInput.each(function(){
if ($(this).val() != '') {
$(this).siblings('.phold').addClass('phold_active');
} else {
$(this).siblings('.phold').removeClass('phold_active');
}
});
}
});
对于Chrome,我使用:if ($(this).css('animation-name') == 'onAutoFillStart')
对于Firefox:if ($(this).val() != '')
答案 25 :(得分:0)
例如,要检测电子邮件,我尝试了“ on change”和一个变种观察器,但都没有起作用。 setInterval与LinkedIn自动填充(不显示我的所有代码,但您明白了)的效果很好,如果在此处添加额外的条件来减慢AJAX的速度,则setInterval可以很好地与后端配合使用。而且,如果表单字段没有变化(例如,他们没有键入内容来编辑电子邮件),那么lastEmail会阻止无意义的AJAX ping操作。
// lastEmail needs scope outside of setInterval for persistence.
var lastEmail = 'nobody';
window.setInterval(function() { // Auto-fill detection is hard.
var theEmail = $("#email-input").val();
if (
( theEmail.includes("@") ) &&
( theEmail != lastEmail )
) {
lastEmail = theEmail;
// Do some AJAX
}
}, 1000); // Check the field every 1 second
答案 26 :(得分:0)
我在chrome上取得了成功:
setTimeout(
function(){
$("#input_password").focus();
$("#input_username").focus();
console.log($("#input_username").val());
console.log($("#input_password").val());
}
,500);
答案 27 :(得分:0)
我遇到了同样的问题,我已经写过这个解决方案。
当页面加载时,它会在每个输入字段上开始轮询(我设置了10秒,但您可以调整此值)。
10秒后,它会停止每个输入字段的轮询,并且仅在聚焦输入(如果有)上开始轮询。
模糊输入时会停止,如果您将输入模糊,则会再次启动。
通过这种方式,您只在真正需要时才进行轮询,并且仅在有效输入时进行轮询。
// This part of code will detect autofill when the page is loading (username and password inputs for example)
var loading = setInterval(function() {
$("input").each(function() {
if ($(this).val() !== $(this).attr("value")) {
$(this).trigger("change");
}
});
}, 100);
// After 10 seconds we are quite sure all the needed inputs are autofilled then we can stop checking them
setTimeout(function() {
clearInterval(loading);
}, 10000);
// Now we just listen on the focused inputs (because user can select from the autofill dropdown only when the input has focus)
var focused;
$(document)
.on("focus", "input", function() {
var $this = $(this);
focused = setInterval(function() {
if ($this.val() !== $this.attr("value")) {
$this.trigger("change");
}
}, 100);
})
.on("blur", "input", function() {
clearInterval(focused);
});
当您自动插入多个值时,它不能很好地工作,但可以调整它来查找当前表单上的每个输入。
类似的东西:
// This part of code will detect autofill when the page is loading (username and password inputs for example)
var loading = setInterval(function() {
$("input").each(function() {
if ($(this).val() !== $(this).attr("value")) {
$(this).trigger("change");
}
});
}, 100);
// After 10 seconds we are quite sure all the needed inputs are autofilled then we can stop checking them
setTimeout(function() {
clearInterval(loading);
}, 10000);
// Now we just listen on inputs of the focused form
var focused;
$(document)
.on("focus", "input", function() {
var $inputs = $(this).parents("form").find("input");
focused = setInterval(function() {
$inputs.each(function() {
if ($(this).val() !== $(this).attr("value")) {
$(this).trigger("change");
}
});
}, 100);
})
.on("blur", "input", function() {
clearInterval(focused);
});
答案 28 :(得分:0)
如果您只想检测是否使用了自动填充,而不是确切地检测何时以及使用了哪个字段自动填充,您只需添加一个将自动填充的隐藏元素,然后检查这是否包含任何值。我知道这可能不是很多人感兴趣的。用负tabIndex设置输入字段,绝对坐标远离屏幕。输入是与输入的其余部分相同的形式的一部分是很重要的。您必须使用将通过自动填充(例如“secondname”)拾取的名称。
var autofilldetect = document.createElement('input');
autofilldetect.style.position = 'absolute';
autofilldetect.style.top = '-100em';
autofilldetect.style.left = '-100em';
autofilldetect.type = 'text';
autofilldetect.name = 'secondname';
autofilldetect.tabIndex = '-1';
将此输入附加到表单并在表单提交上检查其值。
答案 29 :(得分:0)
似乎是一个不依赖轮询的解决方案(至少对Chrome来说)。这几乎和他一样,但我确实认为这比全球民意调查要好一些。
考虑以下情况:
用户开始填写field1
用户选择自动填充字段2和字段3
解决方案:通过以下jQuery代码段(&#39;: - webkit-autofill&#39;)
在所有检查是否存在自动填充字段的字段上注册onblur这不会立竿见影,因为它会被延迟,直到用户模糊field1但它不依赖全局轮询所以IMO,这是一个更好的解决方案。
也就是说,因为点击回车键可以提交表单,你可能还需要一个相应的onkeypress处理程序。
或者,您可以使用全局轮询来检查$(&#39;: - webkit-autofill&#39;)
答案 30 :(得分:0)
经过研究,问题是webkit浏览器不会在自动完成时触发更改事件。我的解决方案是获取webkit添加的自动填充类并自行触发更改事件。
setTimeout(function() {
if($('input:-webkit-autofill').length > 0) {
//do some stuff
}
},300)
以下是铬问题的链接。 https://bugs.chromium.org/p/chromium/issues/detail?id=636425
答案 31 :(得分:0)
我的解决方案是:
$.fn.onAutoFillEvent = function (callback) {
var el = $(this),
lastText = "",
maxCheckCount = 10,
checkCount = 0;
(function infunc() {
var text = el.val();
if (text != lastText) {
lastText = text;
callback(el);
}
if (checkCount > maxCheckCount) {
return false;
}
checkCount++;
setTimeout(infunc, 100);
}());
};
$(".group > input").each(function (i, element) {
var el = $(element);
el.onAutoFillEvent(
function () {
el.addClass('used');
}
);
});
答案 32 :(得分:0)
根据我的个人经验,下面的代码适用于firefox IE和safari,但在Chrome中选择自动完成功能并不是很好。
function check(){
clearTimeout(timeObj);
timeObj = setTimeout(function(){
if($('#email').val()){
//do something
}
},1500);
}
$('#email').bind('focus change blur',function(){
check();
});
下面的代码效果更好,因为每当用户点击输入字段时它就会触发,从那里你可以检查输入字段是否为空。
$('#email').bind('click', function(){
check();
});
答案 33 :(得分:-1)
尝试使用CSS
input:-webkit-autofill {
border-color: #9B9FC4 !important;
}