2013-02-06 100 views
1

我正在嘗試編寫一個Greasemonkey腳本或者腳本來修復網站中的一個錯誤,該錯誤會處理對象的錯誤函數。我可以通過在生成函數原型的代碼行中添加斷點來手動修復問題,並使用js控制檯手動覆蓋函數原型。但是,我不認爲有什麼辦法可以用代碼來做到這一點。外部腳本被加載到html主體的末尾,但問題代碼在同一腳本中執行。在調用之前從外部腳本覆蓋對象函數

有沒有辦法以某種方式將JavaScript代碼注入到頁面中,以便當創建此Ft.prototype.J時,我可以立即修改它?問題是代碼也被混淆和縮小,所以我不確定它的一半是什麼。

這裏是代碼的基本概要:

//What does this do????? 
function A(a, b) { 
    function c() {} 
    c.prototype = b.prototype; 
    a.f = b.prototype; 
    a.prototype = new c; 
    a.prototype.constructor = a 
} 

function Ft(a, b) { 
    $.call(this, b); 
    //some stuff 
} 
//doing something with jQuery? 
A(Ft, $); 
Ft.prototype.J = function (a) { 
    //modifies the DOM content 
}; 
//Code soon after that calls some object.J 

如果我添加的代碼Ft.prototype.J = function() {} //my own function行,到我的Greasemonkey腳本,它給我回錯誤,符合市場預期,Ft not defined。但是,如果我在加載結束時執行該行,那麼破壞的函數已經運行,並且DOM已經被感染。

謝謝。

+1

'A'是普通'inherit'功能,但是我m相當肯定它不適用於jQuery – Bergi

+0

哦,我現在看到謝謝。這實際上來自Google Play網站的代碼,所以我希望他們正確地做對了... –

回答

1

我想你可以執行一些神奇的getter/setter和Object.defineProperty,因爲功能全局聲明:

(function() { 
    var Ft; 
    function myJ() { 
     // do whatever YOU want to do 
    } 
    Object.defineProperty(window, "Ft", { // use unsafeWindow in GM? 
     configurable: true, 
     enumerable: true, 
     get: function() { return Ft; }, 
     set: function(n) { 
      // Hah, we've catched the function declaration! 
      Ft = n; 

      // just making it non-writable would lead to an exception 
      Object.defineProperty(Ft.prototype, "J", { 
       get: function() { return myJ; }, 
       set: function() { /* ignore it! */ } 
      }); 
     } 
    }); 
})(); 

現在,如果有人執行你張貼在你的問題的代碼中,制定者會被調用,你可以使用你想要的值。

+0

我忘了提及它,但對象有很多功能,並且看起來像這個只處理案件,如果有一個原型。另外,爲了測試的目的,我在'console.log(「test」)中添加了',並沒有出現。 –

+0

您是否嘗試過在評論中提到的'unsafeWindow'? – Bergi

1

不知道,但你基本上可以寫一個計時器的代碼,將檢查是否英尺對象可用,然後修改功能,如

var interval = setInterval(function() { 
    if (Ft) { 
     Ft.prototype.J = function() {} //my own function 
     clearInterval(interval) 
    } 
}, 0);