Очень странное поведение Chrome в открытом (сфокусированном) элементе select - PullRequest
3 голосов
/ 25 августа 2011

Вот элемент <select>:

<select>
    <option>Hello</option>
    <option>Banana</option>
    <option>Balloon</option>
    <option>Something</option>
    <option>Potato</option>
    <option>Cleveland</option>
</select>

Вот немного JavaScript (обработчик jQuery "ready"):

$(function() {

    function foo() {
        var s = $('select').find(':selected');
    }

    setInterval(foo, 200);
});

Вот jsfiddle для этого вопроса. .

Обработчик устанавливает интервальный таймер, который каждые 200 миллисекунд находит выбранный в данный момент <option> из <select> и ничего с ним не делает. Когда я запускаю скрипку в Chrome (13.0.782.112) и щелкаю элемент <select>, а затем пытаюсь выбрать запись, выделение выделения продолжает переходить к первому выбранному элементу. Я могу нажать на любой из показанных элементов <option>, и это, конечно, сработает, а затем в следующий раз произойдет то же самое.

Теперь, если я изменю обработчик таймера, чтобы он не использовал jQuery для поиска выбранного в данный момент элемента <option>, как показано ниже:

$(function() {

    function foo() {
        var select = $('select')[0];
        var s = $(select.options[select.selectedIndex]);
    }

    setInterval(foo, 200);
});

тогда я больше не вижу эффекта.

Firefox этого не делает. Я еще не пробовал Safari.

Лично я думаю, что что-то делает что-то здесь не так. Это Chrome? JQuery

изменить & mdash; Еще одна деталь - я использую Chrome на Linux. Я попробую Windows через секунду. ( изменить то же самое в Windows.)

1 Ответ

3 голосов
/ 25 августа 2011

Измените код на:

function foo() {
    var s = $('select option:selected');
}

setInterval(foo, 200);

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

Может быть, существует какой-то странный элемент-призрак, против которого выполняется «выбранный» псевдоселектор, когда он этого не должен.Решение здесь состоит в том, что я ограничиваю контекст опциями перед выполнением псевдоселектора.Всегда хорошая вещь.

...