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

setInterval返回一个处理程序,您可以将其传递给以clearInterval停止函数运行。这是它如何工作的基本示例。

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如果没有存储的处理程序 from ,您将无法调用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 回答