Javascript bookmarklet在某些网站上失败了,创建了幽灵般的新<html>页面

Javascript bookmarklet fails on certain sites, creates ghostly new <html> page

本文关键字:页面 html 幽灵 创建 bookmarklet 网站 失败 Javascript      更新时间:2023-09-26

我注意到我的Javascript书签在某些网站(如Google Reader和Google搜索结果页面)上失败了(在一些非Google网站上随机失败)。查看控制台,我可以看到,对于这些页面,单击bookmarklet并没有像通常那样向标题/正文添加元素,而是创建了一个新文档,看起来像这样:

<html>
  <head></head>
  <body></body>
</html>

即使我将书签减小到javascript:alert(window.location.href);,它也会创建这个空白页并在其中运行书签,因此警报显示about:blank。在大多数网站上,这个空白页是不创建的,并显示正确的位置。

有人能解释一下吗?这些站点是否将外部运行的代码沙箱作为一种安全措施?

UPDATE:我目前无法在Chrome 17.0.932.0 dev以外的浏览器上复制此内容。请让我知道是否有人可以在Chrome或其他浏览器上复制这些结果。

我认为这是一个bug在谷歌浏览器,我已经提交到他们的bug数据库:https://bugs.webkit.org/show_bug.cgi?id=72606

您需要确保最上面的代码,即javascript:之后的代码不返回任何内容。

通常这是通过在void()中包装所有内容来完成的:

javascript:void(alert(window.location.href));

这是非常奇怪的,它打破了alert()虽然,因为函数本身不返回任何东西…

如果javascript: url返回一个字符串,它将被用来创建一个新的文档:

javascript:'foo bar baz';

如果您不知道要注意它,这可能是一个很难调试的问题。如果您使用返回字符串的函数,或者在bookmarklet结束时使用设置字符串值的行,则可能会弹出:

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;