Как определить, поддерживает ли браузер фокус на отключенных элементах?

Не удается переместить фокус на элемент управления, так как он невидим, не включен или имеет тип, который не принимает фокус

jQuery выдал указанную выше ошибку в IE8.

Я хотел бы иметь возможность определить, поддерживает ли браузер фокус на отключенных элементах (в моем случае input) и сохранить его в jQuery.support.

Как бы я это сделал?

Простое решение JS было бы хорошо, но я не хочу использовать обнюхивание браузера (jQuery.browser и т. д.).

Будет ли использование dispatchEvent() хорошим способом?


person Adam Lynch    schedule 06.12.2012    source источник
comment
вы имеете в виду отключенные <input> элементы?   -  person Muthu Kumaran    schedule 06.12.2012
comment
по какой причине вы не хотите проверять, виден ли элемент управления и включен ли он, прежде чем установить на него фокус?   -  person Arsen Mkrtchyan    schedule 06.12.2012
comment
@ArsenMkrt В других браузерах это работает нормально. При фокусировке срабатывают сторонние вещи, поэтому я не хочу проверять, видно ли это. Это заблокировало бы это использование в других браузерах, если бы я не нюхал браузер. Кроме того, я бы предпочел сделать проверку и сохранить результат в jQuery.support при загрузке страницы.   -  person Adam Lynch    schedule 06.12.2012
comment
Какую версию jQuery вы используете? я не могу заставить его выдать указанную ошибку в 1.8.2 для отключенного элемента.   -  person Kevin B    schedule 06.12.2012
comment
@KevinB Я использую 1.7.2. попробую 1.8.2   -  person Adam Lynch    schedule 06.12.2012
comment
@KevinB Элемент должен быть в DOM, прежде чем вы сфокусируете его. Адам, проблема возникает и в 1.8.2 (только что проверено в jsfiddle)   -  person Asad Saeeduddin    schedule 06.12.2012
comment
@Асад, спасибо за это. В любом случае у меня были неприятные проблемы с очисткой кеша.   -  person Adam Lynch    schedule 06.12.2012


Ответы (1)


Я полагаю, вы могли бы просто try, catch именно это (фокусировать отключенный элемент) и сохранить значение в support, если что-то не работает.

var test = $('<input disabled/>');
$(document.body).append(test);
try{
    test.focus();
}catch(e){
    //no support, do your thing
    //...
}
//clean up test element
test.remove();
person Asad Saeeduddin    schedule 06.12.2012
comment
лол .. Я сам не мог придумать ничего другого, но боялся публиковать как решение, опасаясь гнева критиков ТАК .. лол .. молодец .. +1 - person Sajjan Sarkar; 06.12.2012
comment
Почему бы не перейти на более низкий уровень? Могу ли я попробовать использовать dispatchEvent()? - person Adam Lynch; 06.12.2012
comment
@AdamLynch Зачем переходить на более низкий уровень? Вы, конечно, можете попробовать, но я не вижу смысла, поскольку где-то в коде для focus() это уже происходит. - person Asad Saeeduddin; 06.12.2012
comment
Может быть, это было бы быстрее (я не уверен, что это правда). Например, использование $('#id').find('.class') быстрее, чем использование $('#id .class'), потому что jQuery в конечном итоге решает, что следует использовать первое, когда через некоторое время предоставляется последнее. - person Adam Lynch; 06.12.2012
comment
@AdamLynch Это разовая проверка, а не итерация. Это может улучшить вашу производительность максимум на миллисекунду или две. - person Asad Saeeduddin; 06.12.2012
comment
Фу. Получил эту действительно странную ошибку сейчас. catch выше ломает полифилл-заполнитель (я думаю, я использую этот) в IE8 (заполнитель не скрывается при клике/фокусе поля, без ошибок). Что странно, так это то, что это работает, если я закомментирую приведенный выше улов. Он ломается, даже если исключение переименовано или ловушка даже пуста. Любые идеи? Не могу найти ничего связанного в Интернете - person Adam Lynch; 07.12.2012
comment
@AdamLynch Я свяжусь с тобой завтра. - person Asad Saeeduddin; 07.12.2012
comment
@AdamLynch Не могли бы вы сделать jsFiddle? - person Asad Saeeduddin; 08.12.2012
comment
@Asad, вот оно: работает без попытки -catch, не работает с try-catch - person Adam Lynch; 10.12.2012
comment
Похоже, что вызов focus вызывает проблемы вне try-catch, а try-catch не вызывает проблема сама по себе - person Adam Lynch; 10.12.2012
comment
Хорошо, понятно. Это кажется мне неожиданным поведением, я добавлю проблему в jQuery GitHub. - person Adam Lynch; 10.12.2012