Событие изменения ввода автозаполнения FireFox
Я пытаюсь подписаться на изменения событий во входном теге для автоматической формы ajax. Эти события изменения не срабатывают, когда пользователь нажимает предложение автозаполнения из FireFox.
Я видел исправления для IE, но не FireFox. Вы можете просмотреть это поведение здесь
Шаги по воссозданию:
введите любой ввод в одном из полей и нажмите "Отправить".
Начните вводить значение снова в том же поле.
Вы должны увидеть, что окно ввода автозаполнения появляется под полем ввода. Обратите внимание, что нажатие на подсказку не запускает событие изменения (оно также не запускает событие click)
В настоящее время мой единственный вариант - отключить автозаполнение в этом поле, но я не хочу этого делать.
Ответы
Ответ 1
Если вам становится лучше, это известная ошибка
Предлагаемое обходное решение: (Не мое, от здесь
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Mozilla Firefox Problem</title>
<script type="text/javascript">
function fOnChange()
{
alert('OnChange Fired');
}
var val_textBox;
function fOnFocus()
{
val_textBox = document.getElementById('textBox').value;
}
function fOnBlur()
{
if (val_textBox != document.getElementById('textBox').value) {
fOnChange();
}
}
</script>
</head>
<body>
<form name="frm">
<table>
<tr>
<td><input type="text" id="textBox" name="textBox" onFocus="fOnFocus()" onBlur="fOnBlur()"></td>
</tr>
<tr>
<td><input type="submit" value="Submit"></td>
</tr>
</form>
</body>
</html>
Ответ 2
Firefox 4+ fire 'oninput', когда используется автозаполнение.
Вот некоторые jQuery, чтобы сделать это более действенным:
$('#password').bind('input', function(){ /* your code */});
Ответ 3
У меня была такая же проблема.
По-видимому, имеется отладка диспетчера паролей
https://wiki.mozilla.org/Firefox:Password_Manager_Debugging
Итак, я обнаружил, что для меня произошло срабатывание DOMAutoComplete
Мне удалось успешно присоединить его к полю через jQuery bind, например
$('#email').bind('DOMAutoComplete',function() { ...
Ответ 4
Другая Рекомендуемая работа. На этот раз, используя опрос, вы можете
так же, проверяя "изменения" в вашем поле. Измените значение опроса (по умолчанию
375 мс для вашего собственного вкуса).
Я использовал jQuery и плагин jquery, который кто-то писал:
https://github.com/cowboy/jquery-dotimeout/
Git Hub Src: https://raw.github.com/cowboy/jquery-dotimeout/master/jquery.ba-dotimeout.js
<html>
<head>
<meta charset="utf-8">
<title>onChange() for Firefox / IE autofil get-around</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>
<script type="text/javascript" src="/~dsloan/js/ba-dotimeout.js"></script>
<script type="text/javascript">
$(document).ready(function(){
var val;
var count=0; // used to illustrate the "poll count"
// when focusing on the element and typing
// (vs not focused)
// set a focus function to poll the input
$("#myname").focus(function() {
// start polling
$.doTimeout('checkname', 375, function() {
++count;
// no changes, just exit this poll
if($("#myname").val() == val) {
return true;
// store the value
} else {
val = $("#myname").val();
}
var str;
// do stuff here with your field....
if($(document.activeElement) &&
($(document.activeElement).attr('id') ==
$("#myname").attr('id'))) {
var len = $("#myname").val().length;
if(len == 0) {
str = 'Timer called, length 0...';
} else if(len < 2) {
str = 'Timer called, length < 2...';
} else {
str = 'Timer called, valid!';
}
}
// show some debugging...
$("#foo span").html(str+' (count: '+count+'): '+
$(document.activeElement).attr('id')+
', val: '+$("#myname").val());
return true;
});
});
// set a blur function to remove the poll
$("#myname").blur(function() {
$.doTimeout('checkname');
});
});
</script>
</head>
<body>
<form action="#" method=post>
Name: <input type="text" name="name" value="" id="myname" />
Scooby: <input name="scooby" value="" id="scooby" />
<input type="submit" value="Press Me!" />
</form>
<div id="foo"><span></span></div>
</body>
</html>
Ответ 5
Возможная альтернатива: можете ли вы просто использовать таймер, чтобы указать, когда изменяется значение текстового поля?
Ответ 6
Вам придется размыть поле ввода и reset фокус на него. Тем не менее, это потребует немного обмана.