Greasemonkey的简单替代品

时间:2012-06-09 04:34:13

标签: javascript google-chrome browser greasemonkey

我喜欢GM的概念,但在实践中,除非你一直使用它并且是绝对的JS神,否则不可能使用(也许我只是吮吸?)。

如果有一些扩展需要几行JS并在页面加载后为某个站点运行它会非常有用。但这不是通用汽车所做的。通过GM,你必须处理多个框架和那些层层的烦人的安全问题和范围。 即使你只是忽略了正确的程序并使用了不安全的窗口或其他一些黑客,它仍然无法正常工作。

很容易想出JS,你可以在浏览器控制台中运行你想做的事情,但这在转移到用户脚本时永远不会有效。我可以更换greasemonkey中的任何设置,还是完全不同的扩展,以便于使用?

注意:我使用的是Chrome,因此可以获得适用于该特定浏览器的解决方案的奖励积分。

总结:我想要一种方法来自动运行与特定页面上的控制台具有相同范围/权限的脚本。

1 个答案:

答案 0 :(得分:10)

没有更简单的替代Firefox的Greasemonkey或Chrome的用户脚本自动运行用户JS。你可以write your own extension/add-on,但没有多大意义。

如果你不关心GM和用户脚本提供的强大的额外功能,并且总是希望在某个站点的页面加载后“(接受)几行JS和(运行)它们” - 忽略iframe ,然后只需使用以下代码作为所有脚本的基本模板:

// ==UserScript==
// @name    _Base template for simple, cross-browser, JS injection.
// @match   *://YOUR_SERVER.COM/YOUR_PATH/*
// @run-at  document-start
// ==/UserScript==

if (window.top != window.self)  //-- Don't run on frames or iframes.
    return;


function scriptMain () {
    // PUT ALL OF YOUR CODE HERE, INCLUDING ANY FUNCTIONS YOU CREATE.
    console.log ("Hello World!");
}

window.addEventListener ("load", scriptMainLoader, false);

function scriptMainLoader () {
    addJS_Node (null, null, scriptMain);
}

function addJS_Node (text, s_URL, funcToRun) {
    var D                                   = document;
    var scriptNode                          = D.createElement ('script');
    scriptNode.type                         = "text/javascript";
    if (text)       scriptNode.textContent  = text;
    if (s_URL)      scriptNode.src          = s_URL;
    if (funcToRun)  scriptNode.textContent  = '(' + funcToRun.toString() + ')()';

    var targ = D.getElementsByTagName ('head')[0] || D.body || D.documentElement;
    targ.appendChild (scriptNode);
}

请注意,@run-at document-start是必需的(对于Chrome),但您的代码仍会在文档加载时触发。