2016-06-28 54 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

對不起,我更新了標題欄。 –