0

表示され、外部ページをロードするjQueryダイアログがあります。そのページでは、setInterval()1秒ごとにサーバーに継続的にクエリを実行する関数(AJAX)を実行しています。問題は、ダイアログを閉じてもsetIntervalの実行が停止しないことです。

ダイアログのコードは次のとおりです。

var theUrl = 'someUrl';

var popUp = document.createElement('div');

$(popUp).dialog({
        width: 400,
        height: 270,
        title: "Some Title",
        autoOpen: true,
        resizable:false,
        close: function(ev, ui) {
                    $(this).dialog('destroy');
               },
        modal: true,
        open: function() { 
                    $(this).load(theUrl);
              }
});    

私は電話をかけ$(this).dialog('destroy')$(this).remove()document.body.removeChild(popUp)ました。何も機能しませんでした。ロードされたページを「アンロード」する方法はありますか?

4

1 に答える 1

2

setIntervalclearInterval関数の実行を停止するために渡すことができるハンドラーを返します。これがその仕組みの基本的な例です。

var handler = setInterval(function() {}, 2000);
clearInterval(handler);

clearIntervalあなたの例では、のcloseメソッドを呼び出したいと思いますui.dialog

ドキュメント:

setInterval-https ://developer.mozilla.org/en/window.setInterval

clearInterval-https ://developer.mozilla.org/en/DOM/window.clearInterval

編集

clearIntervalからの保存されたハンドラーがないと呼び出すことはできませんsetInterval。したがって、への呼び出しsetIntervalが別のスクリプトで行われる場合、ハンドラーをキャプチャする唯一の方法は、window.setIntervalそれ自体をオーバーライドすることです。

$(function() {
    var originalSetInterval = window.setInterval;
    var handlers = [];

    window.setInterval = function() {
        handlers.push(arguments[0]);
        originalSetInterval(arguments);
    };

    $('whatever').dialog({
        close: function() {
            for (var i = 0; i < handlers.length; i++) {
                clearInterval(handlers[i]);
            }
            handlers = [];
        }
    });
});

オーバーライドするコードは、外部ファイルを取り込むためwindow.setIntervalのタグを含める前に指定する必要があることに注意してください。<script>また、このアプローチでは、が呼び出されるたびにすべての間隔関数がクリアさclearIntervalれるため、これは理想的ではありませんが、これを実現する唯一の方法です。

于 2012-06-28T02:03:29.237 に答える