#javascript #jquery
#javascript #jquery
Вопрос:
У меня есть html-форма, которая использует jquery focus и blur для очистки и восстановления некоторого текста предустановленного поля. Однако форма находится в модальном диалоговом окне, которое можно скрыть и отобразить с помощью jquery hide() и show() . Однако, когда форма скрыта, она выдает ошибку javascript:
an invalid form control with name = 'email' is not focusable
Я предполагаю, что это связано с тем, что форма скрыта и недоступна. Есть ли способ принудительно вызвать событие размытия? Или какой-то способ устранить эту ошибку? Вот мой код:
$j('.dField').focus(function(){
clearInput($j(this)[0]); //The [0] seems to be necessary to retrieve the element at the DOM object level
});
$j('.dField').blur(function(){
restoreInput($j(this)[0]);
});
function clearInput(textField) {
if (textField.value == textField.defaultValue) {
textField.value = "";
}
}
//Restores the default value
function restoreInput(textField){
if (textField.value == ""){
textField.value = textField.defaultValue;
}
}
$j('#dFormBack').click(function(){
$j('#dContentContainer').show();
$j('#vehicle_form').hide();
});
Комментарии:
1. Эквивалентно
[0]
.get(0)
. Он извлекает базовый элемент DOM в указанной позиции в объекте jQuery. api.jquery.com/get2. Примечание: вы пытались использовать вместо этого атрибут placeholder (и, возможно, плагин placeholder для совместимости)?
3. Я не уверен, что вы имеете в виду, когда говорите о плагине-заполнителе?
Ответ №1:
Вы можете активировать функцию внутри прослушивателя blur
событий, вместо того, чтобы пытаться инициировать событие размытия.
restoreInput($j(".dfield")[0]);
Кстати, ваши первые строки могут быть написаны более эффективно:
$j('.dField').focus(function(){
clearInput(this);
}).blur(function(){
restoreInput(this);
});
this
в обработчике событий ссылается на элемент DOM, к которому привязан прослушиватель событий. Нет необходимости оборачиваться this
внутри оболочки jQuery и снова получать элемент DOM с помощью [0]
.
Комментарии:
1. Я не могу использовать ваш код выше, потому что каждое поле с этим классом имеет уникальное значение, поэтому $(this) необходим. Но спасибо за сокращение кода, это полезно
2. Настройте селектор в соответствии с соответствующим элементом ввода :
restoreInput($j(".dfield#email")[0]);
.3. Я не совсем понимаю, что ссылка на конкретное поле сделает для решения этой проблемы — и даже если я позабочусь о поле электронной почты, есть еще четыре, о которых нужно беспокоиться
4. Вызывайте
restoreInput($j(".dfield#ID_HERE")[0]);
каждый элемент ввода для достижения желаемых результатов. Обычноblur
функция выполняет эти функции для каждого элемента. Теперь вы «вручную» вызываете эти функции, чтобы заставить их работать.
Ответ №2:
Как указано здесь:
Запуск фокусировки на скрытых элементах вызывает ошибку в Internet Explorer. Позаботьтесь только о вызове.фокусировка () без параметров на видимых элементах.
Поэтому вы должны просто проверить, скрыт ли элемент перед вызовом focus()
Комментарии:
1. Как будет выглядеть этот код — все, что я пытаюсь, похоже, не работает. Вы не можете поместить условное выражение внутри прослушивателя фокуса, вызов blur, похоже, не работает. Кроме того, это не просто проблема IE — это любой браузер.
2. Не внутри прослушивателя фокуса, выполните проверку перед триггером фокусировки.
3. Да, но дело в том, что как только вы запускаете слушателя для фокусировки, он сохраняется, если вы не отвяжете слушателя, верно? По крайней мере, мне так кажется
4. Ошибка возникает, когда вы где-то запускаете focus(), верно?
5. Да — это срабатывает, когда я нажимаю кнопку закрытия — по-видимому, даже если я попытаюсь вызвать blur() в любом поле формы, если ваш курсор уже находится в поле, он попытается снова вызвать фокус, но к этому моменту форма скрыта.
Ответ №3:
Вы правы. Когда что-то не видно, это нельзя focus()
редактировать или blur()
редактировать.