Почему select с onfocus не работает в IE? - PullRequest
2 голосов
/ 19 ноября 2009

Я хочу выделить выделенный элемент цветом фона, чтобы указать, это обязательно. Когда пользователь открывает меню, нажимая на него, я хочу удалить цвет фона, чтобы он выглядел лучше и был более читабельным. Это прекрасно работает в Firefox, Chrome и даже IE6, но в IE7 и 8 раскрывающийся список не открывается при первом щелчке (или открывается и закрывается очень быстро), а только при втором.

<select 
    style="background-color: #BDE5F8"
    onfocus="this.style.backgroundColor='#fff'"
    onblur="this.style.backgroundColor='#BDE5F8'">
    <option>choose...</option>
    <option>1</option>
    <option>2</option>
    <option>3</option>
</select>

Как я могу это исправить?

Ответы [ 6 ]

6 голосов
/ 19 ноября 2009

После небольшого тестирования мне кажется, что IE не открывает выпадающий список, если стиль каким-либо образом изменен.

Да, хорошая ошибка ловить там. Все, что изменяет поле выбора (включая любое изменение стиля, даже одно, вызванное изменением родительского className), заставляет IE воссоздавать для него виджет OS, что имеет побочный эффект его закрытия. Таким образом, раскрывающийся список открывается, но сразу закрывается перед рендерингом. Если вы установите тайм-аут на функцию смены фона, вы увидите, что это произойдет потом.

То, что вам понадобится, - это сначала событие перед фокусировкой, так что вы можете изменить стиль, вызывая закрытие выпадающего меню до его открытия. К счастью, есть один ! Но это только для IE. Для других браузеров (включая IE8) лучше всего придерживаться простого селектора CSS :focus:

<style>
    select { background-color: #BDE5F8; }
    select:focus, select.focus { background-color: white; }
</style>
<select>
        <option>choose...</option>
        <option>1</option>
        <option>2</option>
        <option>3</option>
</select>

<!--[if lt IE 8]><script>
    // Fix lack of :focus selector for select elements in IE7-
    //
    var selects= document.getElementsByTagName('select');
    for (var i= selects.length; i-- >0;) {
        var select= selects[i];
        select.onfocusin= function() {
            this.className= 'focus';
        };
        select.onfocusout= function() {
            this.className= '';
        };
    }

    // Or, the same expressed in jQuery, since you mentioned using it
    //
    $('select').bind('focusin', function() {
        $(this).addClass('focus');
    }).bind('focusout', function() {
        $(this).removeClass('focus');
    });
</script><![endif]-->
0 голосов
/ 19 мая 2010

Вот мой пример этой ошибки для ie8:

http://jsfiddle.net/axQTJ/1/

0 голосов
/ 10 марта 2010

Я потратил много времени, пытаясь решить эту проблему, и нашел простой обходной путь для IE8 - просто используйте onmousedown, а не onfocus. Хотя это может быть не совсем идеально во всех ситуациях, оно хорошо работает для смены стиля.

0 голосов
/ 19 ноября 2009

Похоже, очень странная ошибка. Очевидно, он заключается в установке каких-либо других настроек во время фокусировки, например, класса для выбора.

Одной из идей было бы установить только «требуемый» цвет фона для опции Выберите ... в качестве обходного пути (это не работает в других браузерах, выполните проверку браузера для этого) .

<select>
        <option style="background: red none">choose...</option>
        <option>1</option>
        <option>2</option>
        <option>3</option>
</select>
0 голосов
/ 19 ноября 2009

После тестирования немного больше, мне кажется, что лучшим способом было бы изменить цвет onmouseover и снова установить его на onblur, например

<select 
    onmouseover="this.style.backgroundColor='#fff';"
    onblur="this.style.backgroundColor='#bde5f7'">
    <option>choose...</option>
    <option>1</option>
    <option>2</option>
    <option>3</option>
</select>

Поскольку при навигации по раскрывающемуся списку с помощью клавиатуры параметры не отображаются, не кажется важным, чтобы это событие было onfocus.

Похоже, что событие onmouseout получает триггеры, как только вы больше не находитесь над фактическим <select>, но, возможно, это можно решить с помощью некоторой обработки событий jQuery?

В противном случае я понятия не имею. :)

0 голосов
/ 19 ноября 2009

Попробуйте onfocus="this.style.backgroundColor='#fff';return true;"

return true; означает, что исходный код обработки событий должен продолжаться. Также попробуйте, можете ли вы достичь того же результата с помощью CSS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...