我有一个页面需要每60秒刷新一次。在这个页面上,我使用iBox来弹出各种项目。我的问题是元刷新会杀死不想要的弹出窗口。请记住,我对javascript的经验很少,所以我的解决方案可能从根本上是错误的。
我想出的解决方案是使用javascript进行刷新。当页面加载时我将启动计时器,当ibox弹出时我将清除计时器,当ibox关闭时我将再次启动计时器。
我是通过使用一个简单的函数来设置的。
function timedRefresh(timeoutPeriod){ var resetId = 0; resetId=setTimeout("location.reload(true);",timeoutPeriod); }
然后我调用函数<body onload="timedRefresh(60000)">
。
我的问题源于我试图致电clearTimeout(resetID)
时。我试图从ibox脚本的隐藏功能调用该方法,但它实际上并没有清除计时器。我认为这可能是一个范围问题,我可能需要做某种Object.clearTimeout(Object.resetID)
,但这只是猜测。
答案 0 :(得分:1)
这样做:
function timedRefresh(timeoutPeriod){
window.resetId = 0; // make it clear it's global by prefixing "window."
window.resetId=setTimeout("location.reload(true);",timeoutPeriod);
}
然后从相关的ibox函数中使用window.resetId。
看到你的评论我会添加一些内容。
“window。”将在浏览器中编写脚本时使用,如果您在其他地方使用JS,它可能无法正常工作。
然而,只要你在网页上, window 就是全局对象而“window。”前缀是IMO的一个很好的方法某些变量是全球性的;如果你一直使用它,所有没有“窗口”的变量。在他们面前总是当地的。
但是,您应该知道,如果您只使用 resetId 而没有任何前缀且没有 var ,那么它也可以工作,因为任何未使用 var 自动限定为 window 。
This short-ish guide将教你大部分关于Javascript,执行上下文和闭包中变量可见性的知识。它会让你成为一个致命的Javascript忍者。
答案 1 :(得分:0)
最简单的方法是将resetId
变量添加到全局范围:
var resetId = 0;
function timedRefresh(timeoutPeriod){
resetId=setTimeout("location.reload(true);",timeoutPeriod);
}
或者,您可以在同一范围内定义iBox的隐藏功能,但我不太清楚iBox的工作原理。
答案 2 :(得分:0)
你是对的,问题是变量resetId
的范围。当您在函数中使用var
关键字声明它时,它对于此函数是本地的,因此不存在于此函数之外。
只需在函数外部声明resetId
以使其成为全局函数,您就可以了:
var resetId = 0;
function timedRefresh(timeoutPeriod){
resetId=setTimeout("location.reload(true);",timeoutPeriod);
}
答案 3 :(得分:0)
我建议在页面上制作内容,需要刷新,通过ajax更新。以下是教程http://www.w3schools.com/Ajax/Default.Asp
的链接