如何使用Greasemonkey用我自己的实现替换JavaScript函数(从远程文件加载 - 其他代码)?

时间:2015-03-15 20:37:17

标签: javascript greasemonkey

有一页例如。 http://somesite.com运行位于路径中的一些javascript代码,例如http://somesite.com/code.js

在该文件中 - 其他代码 - 有一个函数(badFunction(x,y))。

我想更改其中一个局部变量的值,以使其与另一个(本地)变量(在另一个函数内部使用)相同,也位于那个远程javascript文件)。

因此,基于这两个答案12(即this userscript), 我尝试了以下简单的用户脚本,以便用我自己的实现替换整个badFunction,但它不起作用(即我的badFunction未注入加载的code.js - 我已经通过Firefox的调试器检查了它。

我试图用usercript完成的是,在加载code.js时,在达到badFunction定义时,注入我的函数实现,然后,让休息code.js继续正常加载。

我的用户名出了什么问题?或者我的方法完全错了?

我不希望提供前面提到的远程javascript文件的实际网址,因为它是NSFW。

// ==UserScript==
// @name           @document-start Example
// @version        1
// @namespace      
// @include        http://somesite.com/*
// @run-at         document-start
// ==/UserScript==

var changed = 1; // script need to be edited with

window.addEventListener('beforescriptexecute', function(e) {

  ///for external script:   
    src = e.target.src;
    if (src.search(/code\.js/) == "badFunction") {
        changed--;
        e.preventDefault();
        e.stopPropagation();
        append(badFunction);
    };

    ///when done, remove the listener:
    if(changed == 0) window.removeEventListener(e.type, arguments.callee, true);

}, true);


////// append with new block function:
function append(s) {     
    document.head.appendChild(document.createElement('script'))
                          .innerHTML = s.toString().replace(/^function.*{|}$/g, '');
}

function badFunction(x, y)
{
 // my code
};

2 个答案:

答案 0 :(得分:1)

我没有您网站的源代码,因此我不知道如何声明和调用badFunction。但请记住,如果在闭包内调用该函数,则需要在该闭包内的某处注入代码:

(function someClosure() {
  function hello() {
    // code
  }
  // hello is available
})();
// hello is not available

link中,他们展示了如何修改现有的源代码

window.addEventListener('beforescriptexecute', function(e) {

    ///for external script:
    src = e.target.src;
    if (src.search(/bad\.js/) != -1) {
                changed++;
        e.preventDefault();
        e.stopPropagation();
        append(NewScript1);
    };
});

所以基本上你需要搜索你的功能代码并替换它。请注意,您可以使用[\s\S]* link

在正则表达式中搜索换行符

答案 1 :(得分:1)

读完这两个答案后(当然我赞成):
How to overwrite a function using a userscript?
Stop execution of Javascript function (client side) or tweak it
(并且因为badfunction不是全局的,code.js会立即触发并且是文件,而不是内联的)
我得出的解决方案是:

  • 首先,抓取脚本的副本并对其进行所需的更改。 在本地保存。
  • 然后使用Adblock Plus阻止加载 远程脚本文件。
  • 然后使用第二个链接中提供的脚本 将我修改过的本地文件添加到页面中。

    var scriptNode = document.createElement ("script");
    scriptNode.setAttribute ("src", "Point to your modified JS file here.");
    document.head.appendChild (scriptNode);