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

jam*_*ase 2 javascript firefox bookmarklet

我正在制作一个中等复杂的Bookmarklet,它可以在Chrome中运行得很好,但我无法在Firefox中使用它.当我在Firefox中运行我的Bookmarklet时,它会重定向到仅true在其上显示的新页面.

我已经将原因缩小到一个非常具体的事情:当你将新函数暴露给全局命名空间时,Firefox似乎并不喜欢.

如果是这种情况,您可能对此有更多了解吗?这是否记录在任何地方,以便我可以了解更多信息?关于书签构建的细微差别的资源似乎很少,我找不到任何相关的东西.第二个问题是,是否有任何已知的解决方法.

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

重定向书签

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

我正在研究的项目

非重定向书签

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

有什么想法吗?谢谢!

目前,我计划在Knockout中使用手动订阅来获得我需要的功能.不过,知道这个问题的答案仍然很好.

DG.*_*DG. 6

它与暴露全局变量无关.它与您的书签的最终评估值有关.

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

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

此外...

javascript:!function(){...}();
Run Code Online (Sandbox Code Playgroud)

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

这是目前最常见的书签模式:

javascript:(function(){...})();
Run Code Online (Sandbox Code Playgroud)

只要您不使用a结束该匿名函数return,该模式的计算结果为undefined,并且不会发生重定向.

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