3

ここに<select>要素があります:

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

以下は JavaScript の一部 (jQuery の「準備完了」ハンドラー) です。

$(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 はこれを行いません。サファリはまだ試していません。

個人的には、ここで何かが間違っていると思います。クロムですか?jQuery?

編集— もう 1 つ詳細 - Linux で Chrome を実行しています。すぐに Windows を試してみます。(Windowsでも同じように編集してください。)

4

1 に答える 1

3

コードを次のように変更します。

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

setInterval(foo, 200);

正確な理由はわかりませんが、疑似セレクターが jQuery で動作する方法に関連していると思います。これらは、セレクターの名前 (この場合は「選択済み」) とペアになっている関数として実装されます。したがって、コンテキスト内のすべての可能な要素に対して実行されます (選択される可能性のある要素だけではありません)

たぶん、「選択された」擬似セレクターが実行されるべきではないときに実行されている、ある種の奇妙なゴースト要素があるかもしれません。ここでの解決策は、疑似セレクターを実行する前にコンテキストをオプションに制限することです。常に良いことです。

于 2011-08-24T23:41:32.660 に答える