2014-03-03 194 views
1

假设有是包括HTML脚本代码,像这样一个外部.js文件网站:拦截和更改网站的JavaScript使用的Greasemonkey

<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

这不是你如何使用[checkForBadJavascripts](https://gist.github.com/2620135)。 (EG,参见[这个答案](http://stackoverflow.com/a/11201555/331508)。)...你也不能对通过'<脚本加载的脚本的*内容*进行即时编辑src =“...'你必须阻止脚本,然后用'GM_xmlhttpRequest'获取它们,然后编辑它们,然后插入脚本节点。 –

+0

你愿意写出如何去做刚刚描述的内容吗? ? – Joey

+0

酷,其实我解决它......我会后的溶液,作为一个答案即将 – Joey

回答

1

老问题,但我需要最近做到这一点。 下面是我使用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); 
      } 
     }); 
    } 
}); 
+0

是的,这是做正确的方式?差点忘了我曾问过这个问题! – Joey

+0

我知道,我总是觉得有必要这样回答,我遇到老悬而未决的问题! https://xkcd.com/979/ –