我注意到我的Javascript bookmarklet在Google Reader和Google搜索结果页面等某些网站上失败(在某些非Google网站上随机发布)。看一下控制台,我可以看到,对于这些页面,单击书签并没有像往常一样将元素附加到头部/主体,而是创建了一个如下所示的新文档:
<html>
<head></head>
<body></body>
</html>
即使我将书签缩小为javascript:alert(window.location.href);
,它也会创建此空白页并在其中运行书签,以便警报显示about:blank
。在大多数网站上,不会创建此空白页面并显示正确的位置。
有人可以解释一下吗?这些沙盒外部站点是否将代码作为安全措施?
更新:我目前无法在Chrome 17.0.932.0 dev以外的浏览器上重现这一点。如果其他人可以在Chrome或其他方面重现这些结果,请与我们联系。
答案 0 :(得分:1)
您需要确保最顶层的代码,即javascript:
之后的代码不会返回任何内容。
通常可以通过将所有内容包装在void()
:
javascript:void(alert(window.location.href));
虽然函数本身没有返回任何内容,但它与alert()
断开是很奇怪的......
答案 1 :(得分:1)
我认为这是Google Chrome中的一个错误,我已将其归档到他们的错误数据库:https://bugs.webkit.org/show_bug.cgi?id=72606
答案 2 :(得分:1)
如果javascript:
url返回一个字符串,它将用于创建一个新文档:
javascript:'foo bar baz';
如果您不知道要注意,这可能是一个难以调试的问题。如果您使用返回字符串的函数或使用设置字符串值的行结束书签,则可以突然显示:
javascript: a = prompt('foo bar baz'); b = a;
一个简单的解决方案是使用闭包:
javascript:(function(){ var a; a = prompt('foo bar baz'); window.b = a}());
另一种方法是以void 0;
javascript: a = prompt('foo bar baz'); b = a; void 0;