【问题标题】:Simple Alternative to GreasemonkeyGreasemonkey 的简单替代品
【发布时间】:2012-06-13 01:49:36
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • Bookmarklets。另请参阅 bookmarklets.com,以及许多其他内容,包括 Stackapps site
  • 啊,原来如此。这些在许多情况下都会很有用,但用户脚本的优点在于它们会自动在所需的页面上运行。
  • 是的,jsFiddle “tidy up” bookmarklet 对我特别有用。
  • @JaredFarrish - “整理”按钮有什么区别?
  • 有一个 chrome 扩展可以做到这一点,但我不记得它的名字了。只需搜索 JavaScript 用户脚本或类似的东西,你就会找到它。 (不是相扑)。明天我会回来查看链接。

标签: javascript google-chrome browser greasemonkey


【解决方案1】:

没有比 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),但您的代码仍会在文档加载时触发。

【讨论】:

  • 是的,就像我说的那样,即使在实际情况下使用变通方法(不安全...、注入和地址栏使用),我也发现没有任何效果。这对我现在的特殊情况没有什么不同:“$Acb.close('Ad160x600_0', InboxPage.onSkyscraperClose);”在 hotmail.com 上(自动点击关闭广告链接,为您提供更多屏幕空间)。每次都在控制台中完美运行。
  • 您的“更简单”的替代方案会以同样的方式失败。在该页面上,在您想要的功能可用之前显然存在 AJAX 延迟。如果它“从控制台工作”,那是因为您在页面加载几秒钟后运行它。解决方案是使用计时器再等待几秒钟(或等待多长时间),或者像this answer 的第二部分那样轮询目标代码。 AJAX 延迟总是高度依赖于逐页的细节。没有更简单的方法。
  • 我只花了一个小时尝试制作一个简单的脚本。你是天赐之物
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
  • 2012-02-17
  • 2017-03-29
  • 1970-01-01
  • 1970-01-01
  • 2014-12-31
  • 1970-01-01
相关资源
最近更新 更多