如何将书签转换为Greasemonkey用户脚本?

时间:2011-08-02 00:28:06

标签: javascript greasemonkey bookmarklet userscripts tampermonkey

有一种简单的方法可以做到这一点。还有什么需要改变的,因为它的运行方式不同?

2 个答案:

答案 0 :(得分:5)

最简单的方法:

  1. 通过URL decoder运行bookmarklet代码。例如,javascript:alert%20('Hi%20Boss!')%3B变为:
    javascript:alert ('Hi Boss!');

  2. 删除前导javascript:。结果:alert ('Hi Boss!');

  3. 将此代码添加到Greasemonkey文件的末尾。例如,创建一个名为
    的文件 Hello World.user.js ,代码如下:

    // ==UserScript==
    // @name            Hello World!
    // @description     My first GM script from a bookmarklet
    // @include         https://stackoverflow.com/questions/*
    // @grant           none
    // ==/UserScript==
    
    alert ('Hi Boss!');
    
  4. 使用Firefox打开 Hello World.user.js Ctrl O )。 Greasemonkey将提示安装脚本。

  5. 现在,bookmarklet代码将自动在您使用@include@exclude指令指定的任何页面上运行。

  6. 更新:为确保最大兼容性,请使用Greasemonkey和Tampermonkey的更高版本中添加的@grant none指令。


  7. 重要:

答案 1 :(得分:1)

由于“普通”JS和Greasemonkey之间的差异,这是avoid common pitfalls的一篇非常好的文章。

一开始最重要的事情:

  • 不要将函数用作字符串,例如: window.setTimeout("my_func()", 1000); 而是 window.setTimeout(my_func, 1000);window.setTimeout(function(){doSomething(); doSomethingOther();}, 1000);
  • 请勿设置 element.onclick ,而是设置element.addEventListener("click", my_func, true);
  • 在Greasemonkey环境中,一些通常返回各种DOM对象的代码会返回包含在XPCNativeWrapper中的对象。这是出于安全原因。

    某些方法和属性是“透明的”,您可以在包装对象上调用它们,但有些则不能。请阅读上述文章,了解如何规避这一点;你也可以使用(这不是一般的建议,但是用于测试等)wrappedJSObject属性。当obj.something / obj.something()在Greasemonkey中不起作用时,请尝试obj.wrappedJSObject.something / obj.wrappedJSObject.something()