2016-06-28 53 views
2

我正在尝试编写浏览器扩展插件,以在第三方网站上添加一些功能并重新格式化某些数据。使用FireFox Extension在本地更改远程网站的JavaScript?

我安装了Firefox Developer Edition。然后,我根据Beastify创建了一个简单的附加扩展。

我写了一个简单的脚本来监视span元素的innerHTML何时发生变化,然后做一些处理。

此代码的工作,但它不是我想要做的事情的方式:

function fixformat(){ 
    var value = document.getElementById("value"); 

    var valueFloat = parseFloat(value.innerHTML); 

    if (valueFloat < 1000) valueFloat += 1000; 

    value.innerHTML = valueFloat; 
} 
setInterval(fixformat, 100); 

在它与下面的代码更新实时值的远程服务器:

totValue += _currentValue; 
value = document.getElementById("value"); 
value.innerHTML = totValue; 

但我想,以取代这一行:

value.innerHTML = totValue; 

有了这个:

value.innerHTML = totValue + 1000; 

此代码被埋在一个巨大的远程JavaScript文件中,当我浏览他们的网站时,它会被加载大约二十个javascript文件。这个JavaScript文件有大约4000行代码。当新信息可用时,它每1-15秒执行一次。

有没有一些方法来编程钩入该远程JavaScript文件?做一些简单的搜索和替换该代码行,这将使其他一切正常执行?

+0

也许你可以创建脚本的副本,让你需要的修改。然后,当页面加载时,删除原始脚本标记并添加修改后的脚本。 –

+0

那么这可能会工作,但它似乎是一个维护的噩梦,无论何时第三方网站更新的东西。我正在计划编写大量的小UI界面,在这里和那里搜索和替换一行代码要比保留数千行代码的本地副本要好得多。 –

+0

感谢您的建议,虽然,我正在调查[这](嗯,这是吗?)(http://stackoverflow.com/questions/38071258/changing-a-remote-websites-javascript-locally-with-a-webextension) –

回答

3

您将使用beforescriptexecute事件侦听器并更改脚本的.textContent

https://developer.mozilla.org/en-US/docs/Web/Events/beforescriptexecute

下面是一个例子:

document.addEventListener("beforescriptexecute", function(e) { 
     src = e.target.src; 
     content = e.target.text; 

     if (src.search("i18n.js") > -1) { 
      // Stop original script 
      e.preventDefault(); 
      e.stopPropagation(); 
      window.jQuery(e.target).remove(); 

      var script = document.createElement('script'); 

      script.textContent = 'script you want'; 

      (document.head || document.documentElement).appendChild(script); 
      script.onload = function() { 
       this.parentNode.removeChild(this); 
      } 
     } 
    } 
} 
+1

嗯,这个不适用于WebExtension,但我会尝试使用xpi样式的扩展。似乎adblock plus能够从执行中删除javascripts,所以我只需要一种方法来替换它们。去研究ABP源代码。 –

+1

感谢您的帮助,您的想法奏效了,我只是无法弄清楚如何在浏览器扩展中做到这一点,但我找到了一种方法来与GreaseMonkey合作:) –

+0

非常感谢分享。 – Noitidart

2

好吧,我放弃了对浏览器扩展的想法,现在因为我可以做我有Greasemonkey脚本的愿望。这是我写的脚本,努力创建“钩”到远程JavaScript来代替一行代码:

// ==UserScript== 
// @name  test load 
// @namespace testing 
// @description testing 
// @include  https://addons.mozilla.org/en-US/firefox/addon/greasemonkey/ 
// @version  1 
// @grant  none 
// @run-at document-start 
// ==/UserScript== 
document.addEventListener("beforescriptexecute", function(e) { 
    src = e.target.src; 
    content = e.target.text; 
    console.log("src: " + src); 
    if (src.search("script.js") > -1) { 
     var newContent = ""; 
     $.ajax({ 
      async: false, 
      type: 'GET', 
      url: '/script.js', 
      success: function(data) { //inject code via search and replace 
       newContent=data.replace('totValue += value;', 'totValue += value + 1000;'); 
      } 
     }); 
     // Stop original script 
     e.preventDefault(); 
     e.stopPropagation(); 
     window.jQuery(e.target).remove(); 
     var script = document.createElement('script'); 
     script.textContent = newContent; 
     (document.head || document.documentElement).appendChild(script); 
     script.onload = function() { 
      this.parentNode.removeChild(this); 
     } 
    } 
}); 
+0

非常感谢分享。您应该尝试使用WebExtension。您应该将内容脚本设置为在页面开始时加载,然后在那里执行。它应该工作。 – Noitidart

+0

我试过了,无法弄清楚。我决定虽然我正在朝不同的方向发展,现在我发现了[CefSharp](http://stackoverflow.com/questions/38096349/modifying-remote-javascripts-as-they-load-with-cefsharp )。一旦我弄清楚,我会在那里发布我的解决方案。 –

+0

对不起,我更新了标题栏。 –