Firefox Bookmarklet:向全局命名空间公开函数



我正在开发一个中等复杂的Bookmarklet,它在Chrome中运行得很好,但我无法让它在Firefox中运行。当我在Firefox中运行Bookmarklet时,它会重定向到一个只显示true的新页面。

我已经将原因归结为一件非常具体的事情:Firefox似乎不喜欢向全局命名空间公开新函数。

如果是这样的话,你能了解更多吗?这件事有记录吗,这样我就可以了解更多了?关于bookmarklet构建的细微差别的资源似乎很少,我找不到任何相关的东西。第二个问题是,是否存在已知的解决方案。

对于一些例子(记住,要测试它们,只需将这些代码行复制到Firefox中的bookmarklet中。然后在任何页面上运行它们)。

重定向书签

javascript:!function(){window.okay={test:function(){}}}();

我正在进行的项目

非重定向bookmarklet

javascript:!function(){window.okay={test:!0}}();

有什么想法吗?谢谢

现在,我计划在Knockout中使用手动订阅来获得我需要的功能。不过,知道这个问题的答案还是很好的。

它与公开全局变量无关。它与bookmarklet的最终评估值有关。

任何被求值的JS代码总是返回一个来自代码的最后一行或最后一个块的值。

对我来说,在Firefox中,您的两个示例都会重定向,因为它们都返回true。您可以通过将代码直接粘贴到Firefox控制台来测试这一点。

此外。。。

javascript:!function(){...}();

这很奇怪。我从未见过这种模式。

这是目前最常见的bookmarklet模式:

javascript:(function(){...})();

只要不以return结束该匿名函数,该模式的计算结果将为undefined,并且不会发生重定向。

实现相同结果的旧方法是始终使用void(0);作为最后一行代码。它的计算结果也是undefined,如果它是最后一行,那么整个脚本的计算结果是undefined,不会发生重定向。

最新更新