使用greasemonkey拦截并更改网站的javascript

时间:2014-03-03 07:43:11

标签: javascript greasemonkey

假设有一个网站在html脚本标记中包含一个外部.js文件,如下所示:

<script src="somescript.js">

我希望greasemonkey拦截每个这样的脚本,并在它们执行之前改变它们中的一些值。例如,我想在其中将所有出现的值“400”更改为“300”,然后继续加载页面,就像脚本使用这些值而不是原始值一样。目前我在greasemonkey中使用以下代码:

function replaceTargetJavascript (scriptNode) {
    var scriptSrc   = scriptNode.textContent;
    scriptSrc       = scriptSrc.replace (
        /'400'/,
        "'300'"
    );

    addJS_Node (scriptSrc);
}

document.addEventListener("beforescriptexecute", function(e) {

    checkForBadJavascripts ( [
        [false, /'400'/, replaceTargetJavascript]
    ] );
}, true);

根据我的消息来源,这是正确的方法,但它不起作用。有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:3)

老问题,但我最近需要这样做。 以下是我使用GreaseMonkey的方法。

添加beforescriptexecute侦听器,等待加载目标脚本,检查src标记以识别正确的脚本。

然后你停止加载该脚本并使用GM_xmlhttpRequest自己获取脚本源。

然后您可以随意修改脚本并将其重新插入DOM。

// ==UserScript==
// @name        Test
// @namespace   Test
// @description TEST
// @include     http://the.website.com/*
// @version     1
// @grant       GM_xmlhttpRequest
// @run-at      document-start
// ==/UserScript==

function addScript(text) {
    text = text.replace(/replaceThis();/g, "");
    var newScript = document.createElement('script');
    newScript.type = "text/javascript";
    newScript.textContent = text;
    var head = document.getElementsByTagName('head')[0];
    head.appendChild(newScript);
}

window.addEventListener('beforescriptexecute', function(e) {
    src = e.target.src;
    if (src.search(/script_to_modify\.js/) != -1) {
        e.preventDefault();
        e.stopPropagation();        
        GM_xmlhttpRequest({
            method: "GET",
            url: e.target.src,
            onload: function(response) {
                addScript(response.responseText);
            }
        });
    }
});