我可以使用removeChild來替換s標準DOM函數,以便在從父節點中刪除某個節點之前顯示例如警報嗎?這樣的,但我的例子事情是有錯誤我可以用removeChild替換s標準DOM函數嗎?
var original = node.removeChild;
node.removeChild = function(node, original){
alert('message');
original(node);
}
我可以使用removeChild來替換s標準DOM函數,以便在從父節點中刪除某個節點之前顯示例如警報嗎?這樣的,但我的例子事情是有錯誤我可以用removeChild替換s標準DOM函數嗎?
var original = node.removeChild;
node.removeChild = function(node, original){
alert('message');
original(node);
}
你的實現看起來不錯,但你並不需要通過original
作爲參數存在。
var original = node.removeChild;
node.removeChild = function(node) {
alert('message');
original(node);
}
@ alex23 - 感謝您的更正。錯過了這一點。 – techfoobar 2013-04-22 13:18:18
這可能會導致一個問題,因爲原始方法上下文在調用'original(node)時丟失;'在FF中查看我的回答 – 2013-04-22 13:24:04
我有錯誤:值不實現接口節點。原始(節點);在鉻我有:非法調用 – Nawa 2013-04-22 13:56:04
首先,這樣做
var original = Node.prototype.removeChild;
Node.prototype.removeChild = function(node) {
//custom logic
original.apply(this, arguments);
}
的new
關鍵字的用法完全不正確。這將嚴重改變行爲。 function
是Function
的一個實例,它是所有JavaScript函數的「母題」。
當使用new
關鍵字時,該函數將立即執行,並且行爲與期望的行爲有很大不同。有關如何創建函數對象的更多詳細信息,請參閱ECMA語言規範的第13部分。請閱讀here,在第98頁。
其次,強烈建議不要改變任何本地對象prototype
。它導致人類歷史上最乏味和痛苦的錯誤。在你編輯代碼之後,任何人都會花費很長時間才能確定警報源自哪裏。
保持這兩個行爲是分開的,它們是完全無關的。包裹起來的prototype
功能是非常糟糕的設計,由於上述原因的任何更多的人,如:
for in
循環。如果您忘記使用hasOwnProperty
,您將遍歷更多屬性。這些原因實際上是令人鼓舞的,因爲'in for循環是荒謬的。除了普通對象之外,我不會去「for..in」,如果是,它不會是DOM節點。第二個原因是假設一個龐大的程序員企業團隊。這兩個原因適用於很少的人,所以這就是爲什麼你真的鼓勵這個:D – Esailija 2013-04-22 13:35:51
我會變得激進,只是說不。雖然它在技術上可能適用於您關心的瀏覽器並且是prototype.js的基礎,但您絕不應該像這樣修改DOM對象或其原型。
關於該主題有一篇很長的文章:http://perfectionkills.com/whats-wrong-with-extending-the-dom/但TL; DR是這些是「託管對象」,並且不保證對其行爲進行修改。它今天可以在瀏覽器x上運行,但是明天不能保證瀏覽器y甚至x。
你可以,但你沒有發抖。 – kan 2013-04-22 13:16:47
@kan爲什麼不呢?不知道背景,你不能說「你不應該」。 – 2013-04-22 13:17:36
@ alex23請不要對問題/答案的代碼進行重大更改。 new關鍵字的(非)存在性很重要。它只能混淆作者(他們不會了解任何內容,因爲你只是改變了代碼而沒有評論) – 2013-04-22 13:19:47