3

jQuery 1.6 を使用しなければならない状況にあります。Web サイトの jQuery ファイルの種類は制御できません。属性を持つ次の HTML 要素があります...

<div id="myitem" style="display: none; position: absolute;" role="status" aria-hidden="true">
...
</div>

ドロップダウン メニューからオプションを選択するたびに、上記のコードの表示プロパティは、5 ~ 10 秒間、display:block に切り替わります。それは異なります。次に、display:none に戻します。

live() を使用して、その表示プロパティがいつ display:none に戻ったかを検出できるようにしたいと考えています。jQueryでそれは可能ですか?HTML要素を制御する元のjs関数にアクセスできないため、これを最初から行う必要があります。

これは可能ですか?(つまり、単純に console.log('the display is now hidden') を実行します)

アドバイスをありがとう

4

2 に答える 2

2

setInterval単一のタイムアウトの代わりに使用するbfavarettoの回答へのわずかな変更:

$(function(){
    $('#dropdown').change(function() {
        var timerID = setInterval(function() {
            console.log('checking display property');
            if($('#myitem').css('display') == 'none') {
                console.log('the display is now hidden again');
                clearInterval(timerID);
            }
        }, 1000);
    });
});

また、最大時間が経過しても要素が再び消えない場合は、別のことを行うようにチェックを入れることもできます。

利点は、要素が再び消えるのに 5 秒かかる場合、最大 6 秒しか待たないことです*。ただし、10 秒かかる場合は、それでも 10 秒、または最大で 11 秒待ちます。サードパーティのライブラリで何かが変更され、突然 1 秒しかかからなかった場合でも、最大 2 秒以上待たされることはありません。または、突然非常に遅くなった場合でも、それを処理する必要があります。

*注: 明らかに、これらのタイミングはどれも正確ではありません。

于 2013-06-13T15:14:08.453 に答える
2

style.displayそのdivの値を「監視」したいようです。それは不可能ではありませんが、非現実的で不安定です。change最も簡単な解決策は、ドロップダウン自体に新しいイベント ハンドラーを追加することです。そのためには、.live(その jQuery バージョンに対して)、、、.delegateまたは.change(DOM がロードされているときに行う限り) を使用できます。また、ドロップダウンの元のイベント ハンドラーが追加された後に、必ずそのイベントを登録してください。

タイムアウトに対処するには、ハンドラーからタイマーを設定し、それが他のタイマーの最大時間よりも長いことを確認します。

例えば:

$(function(){
    $('#dropdown').change(function() {
        setTimeout(function() {
            console.log('checking display property');
            if($('#myitem').css('display') == 'none') {
                console.log('the display is now hidden again');
            }
        }, 11000);
    });
});

概念実証: http://jsfiddle.net/wLEPh/1/

ここでの注意点は、元のタイマーと新しいタイマーが実行される瞬間の間に表示を再度変更した場合です。この場合、コードは div が一時的に非表示になったことを検出しません。別の方法として、MutationOberverを使用してプロパティの変更を直接監視することもできますが、サポートとパフォーマンスの問題があります。

于 2013-06-13T14:32:10.963 に答える