16

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

如果有一个小扩展,它需要几行 JS 并在某个站点的页面加载后运行它们,那将非常有用。但这不是通用汽车所做的。使用 GM,您必须处理多个帧以及那些层层令人讨厌的安全问题和范围。即使您只是忽略正确的程序并使用 unsafewindow 或其他黑客之一,它通常仍然无法正常工作。

想出 JS 非常容易,你可以在浏览器控制台中运行它来做你想做的事情,但是当转移到用户脚本时这永远不会起作用。我可以更改greasemonkey中的任何设置或完全面向易用性的不同扩展吗?

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

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

4

1 回答 1

13

没有比 Firefox 的 Greasemonkey 或 Chrome 的自动运行用户 JS 的用户脚本更简单的替代方案了。您可以编写自己的扩展/附加组件,但没有太多意义。

如果您不关心 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),但您的代码仍会在文档加载时触发。

于 2012-06-09T05:34:47.613 回答