2016-09-01 39 views
0

我有了很多這樣的功能的一個JavaScript腳本攔截雙重性質的JavaScript函數一樣的document.getElementById

document.getElementById(id) 

的我不想腳本停止從該功能的任何不確定的回報,所以,解決的辦法是攔截與一個掛鉤類似功能的任何電話,我用這個代碼做攔截:

var f = document.getElementById.bind(document); 
    document.getElementById = function (id) { 
     if(f(id) !== null) return true; 
    return false; 
} 
window.onload = function() { 
    document.getElementById('ajax').style.display = "block"; 
} 

現在,這個腳本的第一個學位鏈接像這樣性質的工作大

document.getElementById("html").innerHtml = "Hello" 

document.getElementById("txt").disabled = true; 

和腳本將繞過功能,並沒有拋出虛假返回任何錯誤,但添加另一個propoerty像這樣的時候:

document.getElementById('ajax').style.display = "block"; 

腳本將拋出:

TypeError: document.getElementById(...).style is undefined

如果我們有什麼東西導致腳本死的時候從函數鉤子發現結果是null(沒有帶該id的DOM元素),這將解決問題,但我找不到除返回false之外的其他模塊或退出函數。

+1

'所以解決方案是攔截任何與鉤類似功能的呼叫'我不同意這裏。然而,你的問題是你在遍歷一個對象樹之前沒有進行空值檢查。所以很確定,'document.getElementById'不能返回null,但沒有說它的子對象不能爲null。 – CollinD

+1

你返回一個布爾值,如果它發現元素或不。如果它確實找到了需要返回該元素的元素,而不是true。 – ste2425

回答

0

您的替換函數返回truefalse。它永不返回實際的原始返回值document.getElementById()

如果你真的想做出類似這樣的工作,你需要返回一個對象,該對象模仿了許多代碼可能期望從真實DOM節點獲得的DOM API。只是返回false不會讓事情變得更好。

+0

你能顯示一些代碼嗎? – JohnTaa

+0

@JohnTaa一個模擬任意DOM節點的JavaScript機制並不簡單。在我看來,當getElementById()返回null時,修復失敗的代碼會更好。或者,你可以考慮使用像jQuery這樣的庫來爲你處理。 – Pointy