Javascript 无法使用setTimout命令';我不能在bookmarklet中工作

Javascript 无法使用setTimout命令';我不能在bookmarklet中工作,javascript,bookmarklet,Javascript,Bookmarklet,我不能在书签中使用setTimeout() 这项工作: javascript: document.location=“mysite.com”; 警报(“测试”); 无效 这并不是: javascript: document.location=“mysite.com”; var t=设置超时(函数(){ 警报(“测试”); }, 10000); 无效 为什么会这样?每次更改页面时,整个javascript上下文都会被销毁并重新创建(这是出于安全原因,并且会创建一个上下文地狱) 有效地更改页面的上下

我不能在书签中使用
setTimeout()

这项工作: javascript: document.location=“mysite.com”; 警报(“测试”); 无效

这并不是: javascript: document.location=“mysite.com”; var t=设置超时(函数(){ 警报(“测试”); }, 10000); 无效


为什么会这样?

每次更改页面时,整个javascript上下文都会被销毁并重新创建(这是出于安全原因,并且会创建一个上下文地狱)

有效地更改页面的上下文,销毁剩下的任何javascript引用(在您的例子中是超时)。新页面开始加载时,您的页面就有了新的上下文

对于超时工作,您需要一个需要10秒以上响应的服务器(根据第二个参数10000或将超时减少到10毫秒左右)


你为什么需要这个

Bookmarklets的功能不超过网页上普通嵌入式脚本的功能。如果不能使用普通JavaScript,就不能使用bookmarklet

在您的示例中,如果作为嵌入在页面中的普通javascript运行,那么一旦页面重新加载,超时以及该页面中的所有其他变量都将消失。(不要被嵌入脚本标记中的JavaScript将在页面加载时重新运行这一事实所误导。这将创建一个新的超时,但之前的超时将被删除。)

更精确的测试是将bookmarklet代码放入页面上的超链接中,然后单击它(
)。这与单击包含相同代码的书签完全相同。你不能用这个做什么,你不能用bookmarklet做什么

您问题的解决方案:

选项1:Bookmarklet在当前页面内创建一个iframe,并在该iframe内连续重新加载所需页面


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

我猜Bookmarklet会创建自己的JS沙盒,然后在计时器完成之前重新获取它。以下内容将在Chrome中对我起作用:javascript:setTimeout(function(){alert('Hi');},10000);你在使用哪个浏览器?要加载jQuery,给它一个加载的机会,然后用它做一些事情。如果iframe是同一个域,你可以操纵它。但是您不需要访问iframe的内容来更改其位置。只需更改其
src
属性。
document.location="mysite.com";
document.location="mysite.com"; 
var t=setTimeout(function () { alert("test"); }, 10);