jQuery — ошибка с не фокусируемым элементом / как принудительно размыть?

#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/get

2. Примечание: вы пытались использовать вместо этого атрибут 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() редактировать.