2016-07-14 62 views
1

所以基本上我遇到的問題是我正在爲一個網站一個簡單的小型JS庫,並遇到了一點問題。 該網站託管在使用火箭優化器的cloudflare上。現在我的代碼創建了一個腳本元素,然後它加載的腳本應該調用服務器以保持常量ping,並在此過程中服務器記錄各種信息。這個庫在其他環境中工作,但火箭優化器正在殺死它。在JS中調用本地方法時,它們超載

var dd = document, ll = dd.createElement('script'), ss = dd.getElementsByTagName('script')[0]; 
ll.type = 'text/javascript'; ll.async = true;    
ll.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + serverDomain + "/alive?" + params; 
ss.parentNode.insertBefore(ll, ss); 

現在我遇到的問題是真的很簡單,在rocket.js圖書館從我可以告訴,超負荷使用document.createElement有自己的整齊的功能,這在腳本標記的情況下,給出了一個傳統腳本標記的「關閉」副本,儘管它爲src屬性定義了setter/getter。設置者所做的不是設置src,而是將其放入data-rocketsrc中,然後由火箭優化器處理這個數據 - rocketsrc,然後將其傳遞迴頁面服務器,然後將所有對我的服務器的調用傳回去結果。

這導致我正在追蹤和做的事情,以徹底走出各種不同的主題原因的窗口。

現在我一直在試圖找到方法來獲取原始的createElement的圖片,但問題是,因爲rocket.js首先被加載,並且目前看來我沒有辦法讓我的腳本有優先權,我有點難以解決這個問題。可能重做我自己的createElement方法的想法是一個想法,但我寧願避免,因爲它增加了我發送的內容,而且它看起來像是我不應該發送的內容。

任何想法和援助將不勝感激。

回答

0

有一些函數在指針丟失的情況下無法重用(函數被替換爲null或包含函數的變量在私有範圍內,因此您無法訪問它)。如果rocket.js將私人範圍的document.createElement函數保存起來,則它不能被重用。您需要檢查rocket.js的代碼。如果你發現這樣的東西

document.createElement = (function(a){ 
    // Some other code.... 
    return function(b){ 
     return a(b); 
    }; 
})(document.createElement); 

然後你不能得到本地功能回來。雖然,你可以嘗試document.__proto__.createElement,這可能不會被覆蓋。

+0

你可以在chrome中重寫'document.createElement',我懷疑你也可以爲大多數瀏覽器做。 – Ben

+0

我同意本,它可以做到,因爲當我使用鉻的開發工具,並嘗試步入createElement函數,它直接跳轉到rocket.js – Shadowmancer

0

您可以使用Document對象的原型來查找原始函數,並將其分配給對象上的其他名稱。

document.$createElement = Document.prototype.createElement; 

document.$createElement('div'); //The original function 
document.createElement('div'); //The library's overridden function 

注意Documentdocument是不同的對象。

+1

輝煌的答案,完全沒有想到的原型和應該與大多數瀏覽器兼容,所以它應該解決大部分問題,謝謝:) – Shadowmancer

相關問題