0

我們有一個包含類似的代碼這一串編碼IE9在我們的局域網形式:的JavaScript原型屬性鏡子他人財產

var dept = req.responseXML.selectNodes("//Dept")[0].text; 

我們剛剛升級我們所有的電腦到IE10和的selectNodes的是現在已經過時和已換上querySelectorAll,這樣的代碼修正位將是:

var dept = req.responseXML.querySelectorAll("Dept")[0].textContent; 

所有這些形式使用共享的JS文件將請求發送出來,所以我想如果我可以定義一些原型功能/性能我能解決這個不觸及任何形式的不兼容性。我取得了一些進展,用能的selectNodes映射到querySelectorAll:

Document.prototype.selectNodes = function(param) { 
    return this.querySelectorAll(param.replace("//", "")); 
} 

但是我現在遇到了問題映射文字的textContent。以下似乎不工作:

Element.prototype.text = function() { 
    return this.textContent; 
}; 

如果任何人有任何書於我將不勝感激,我真的不希望跟蹤所有這些形式了。謝謝!

回答

0

看來你應該修正你的代碼,而不是破解DOM方法,以避免修復你的代碼。想象一下,隨着時間的推移,這會如何建立起來,並且你的代碼越來越遠離編程到一個標準的DOM,然後在某些時候,你甚至可能會碰到瀏覽器中發生變化的名稱衝突。

如果你想使elem.text回報elem.textContent,然後因爲這些性能的參考,而不是函數調用,你需要使用一個getter這樣的破解代碼:

Object.defineProperty(HTMLElement.prototype, "text", { 
    get: function() { 
     return this.textContent || this.innerText; 
    }, 
    set: function(txt) { 
     if (this.textContent) { 
      this.textContent = txt; 
     } else { 
      this.innerText = txt; 
     } 
    } 
}); 
+0

這是解決方案!您的建議是正確的,但是我的環境要求舊IE9代碼仍能在IE10中運行。 –

+0

@JaredFeldman - 處理舊版瀏覽器兼容性的更好方法是將代碼更改爲使用更新的界面(在較新的瀏覽器中工作),然後爲舊版瀏覽器添加填充。這將使您的代碼保持標準,防止未來發生衝突,因爲您只在代碼中使用標準屬性,並使代碼更易於理解將來出現的用戶(因爲它使用已知標準)。你正在做的是相反的 - 編碼到一箇舊的專有接口,並試圖使新的瀏覽器仍然實現。 – jfriend00