2

我有以下代码部分工作。我是 javascript 的新手,所以如果我的方法不是最好的,请不要怪我。

window.url_var = "status.htm";
window.elem = "#e1";

function menu_item(){
$(window.elem).click(function (event)
{ 
    $("#divTestArea1").load(window.url_var);
});
}

$("#e1").click(function (event)
{ 
event.preventDefault(); 
window.url_var = "demo2.txt";
window.elem = "#e1";
$("#divTestArea1").load(window.url_var);
auto_refresh = setInterval(menu_item(), 5000);  
});


$("#e2").click(function (event)
{ 
event.preventDefault(); 
window.url_var = "status.htm";
window.elem = "#e2";
$("#divTestArea1").load(window.url_var);
auto_refresh = setInterval(menu_item(), 5000);  
});

$("#e3").click(function (event)
{ 
event.preventDefault(); 
window.url_var = "form.htm";
window.elem = "#e3";
clearInterval(auto_refresh);
$("#divTestArea1").load(window.url_var);
});


jQuery(document).ready(function() {
$("#divTestArea1").load(window.url_var);
auto_refresh = setInterval(menu_item(), 5000);  
});

每当我单击元素 e1 和 e2 时,setInterval 都会按预期工作,并且只要我单击元素 e3,该元素就会停止重新加载。

到目前为止,这就是我想要的行为。但是,如果再次单击 e1 或 e2 get,我也想再次启动 setinterval。

最后是它在上面的代码中不起作用的地方。

如果您能指出正确的方向,我将不胜感激。


在看到我原来的问题的一些答案(感谢大家)之后,我来到了这个代码。为了澄清我最初的想法,我需要定期更新网页上的一些项目,但内容可以通过一些菜单进行更改,并且某些内容(如表单)不应更新。

window.url_var = "demo2.txt";
var     auto_refresh = null;

function setRefresh() {
    var self = this;
    this.bar = function() {
      if(window.url_var != ""){ 
    $("#divTestArea1").load(window.url_var);
            auto_refresh = setTimeout(function() { self.bar(); }, 5000);
        }
    }
    this.bar();
}

$("#e1").click(function (event)
{ 
    event.preventDefault(); 
    window.url_var = "demo2.txt";
    setRefresh();
});  


$("#e2").click(function (event)
{ 
    event.preventDefault(); 
    window.url_var = "status.htm";
    setRefresh();
});  

$("#e3").click(function (event)
{ 
    event.preventDefault(); 
    window.url_var = "form.htm";
    $("#divTestArea1").load(window.url_var);
    window.url_var = "";
});


$(document).ready(function() {
    setRefresh();
});
4

2 回答 2

1

尝试使用 2 个不同的变量并在需要时清除所有变量。这是:auto_refresh1 和 auto_refresh2。每次调用 setinterval 时,它都会创建一个具有新 id 的新计时器。您正在覆盖 auto_refresh 变量,并且在此之前的计时器仍将触发。

或者您可以将 setinterval 存储在哈希对象中并运行并清除它们。

于 2012-09-13T02:29:14.920 回答
0

我不清楚你到底想在这里做什么。尽管如此,我还是稍微重写了您的代码以进行一些改进(并修复了您的代码中涉及setInterval调用的一个明显错误)。

var url_var = "status.htm",
    elem = "#e1",
    $destination = $("#divTestArea1"),
    auto_refresh;

function menu_item() {
    $(elem).bind("click", function (e) {
        $destination.load(url_var);
    });
}

function load() {
    $destination.load(url_var);
}

function set(url, id) {
    url_var = url;
    elem = id;
}

function setRefresh() {
    return setInterval(menu_item, 5000);
}

function handleClick(e) {
    e.preventDefault();
    set(e.data.url, e.data.id);
    load();
    auto_refresh = setRefresh();
}

$("#e1").on("click", {
    url: "demo2.txt",
    id: "#e1"
}, handleClick);

$("#e2").on("click", {
    url: "status.htm",
    id: "#e2"
}, handleClick);

$("#e3").on("click", function (e) {
    e.preventDefault();
    set("form.htm", "#e3");
    clearInterval(auto_refresh);
    load();
});

$(document).ready(function () {
    load();
    auto_refresh = setRefresh();
});

我猜也许这些setInterval电话实际上应该是setTimeout电话?为什么要一遍又一遍地绑定“click”事件处理程序?

编辑#1:on从方法切换到jQuery当前首选的bind方法,包括使用事件数据参数来进一步抽象事件处理代码。

于 2012-09-13T16:04:22.450 回答