无法使用setTimout在bookmarklet中不起作用

时间:2014-01-17 23:40:12

标签: javascript bookmarklet

我可以不在书签中使用setTimeout()吗?

这有效: JavaScript的: document.location = “mysite.com”; 警报( “测试”); 空隙(S);

这不是: JavaScript的: document.location = “mysite.com”; var t = setTimeout(function(){ 警报( “测试”); },10000); 空隙(S);

为什么会这样?

2 个答案:

答案 0 :(得分:1)

每次更改页面时,整个javascript上下文都会被销毁并重新创建(这是出于安全原因以及将会出现上下文的事实)

document.location="mysite.com";

有效地更改页面的上下文,销毁任何javascript引用(在您的情况下是超时)。新页面开始加载页面的那一刻有了新的背景。

要使你的超时工作,你需要一个响应时间超过10秒的服务器(基于你的第二个参数10000或者将超时减少到10毫秒)。

document.location="mysite.com"; 
var t=setTimeout(function () { alert("test"); }, 10);
你为什么需要这个?

答案 1 :(得分:0)

Bookmarklets只能用于网页上的普通嵌入式脚本。如果你不能用普通的JavaScript做到这一点,你就不能用书签来做。

在您的示例中,如果以页面中嵌入的普通javascript运行,则一旦页面重新加载,超时将与该页面中的所有其他变量一起消失。 (不要因为脚本标签中嵌入的JavaScript在页面加载时重新运行这一事实而误导。这会产生新的超时,但前一个会被删除。)

更精确的测试是将您的bookmarklet代码放入页面上的超链接并单击它(<a href="javascript:...">test</a>)。这与单击包含相同代码的书签完全相同。你无法做到这一点,你不能用书签。

解决您的问题:

选项1:Bookmarklet在当前页面内创建一个iframe,并在iframe中不断重新加载所需的页面。

选项2:Bookmarklet打开一个小窗口并向其中注入javascript,不断重新加载opener窗口。