2013-04-22 22 views
2

我可以使用removeChild來替換s標準DOM函數,以便在從父節點中刪除某個節點之前顯示例如警報嗎?這樣的,但我的例子事情是有錯誤我可以用removeChild替換s標準DOM函數嗎?

var original = node.removeChild; 
node.removeChild = function(node, original){ 
    alert('message'); 
    original(node); 
} 
+1

你可以,但你沒有發抖。 – kan 2013-04-22 13:16:47

+5

@kan爲什麼不呢?不知道背景,你不能說「你不應該」。 – 2013-04-22 13:17:36

+1

@ alex23請不要對問題/答案的代碼進行重大更改。 new關鍵字的(非)存在性很重要。它只能混淆作者(他們不會了解任何內容,因爲你只是改變了代碼而沒有評論) – 2013-04-22 13:19:47

回答

2

如果你想申請這個在文檔如果你想改變只適用於所選擇的節點,然後

var original = node.removeChild; 
node.removeChild = function(node){ 
    //custom logic 
    original.apply(this, arguments); 
} 
+0

我更喜歡你第二個方法,但我有奇怪的錯誤:原來是未定義 – Nawa 2013-04-22 14:06:57

+0

原始參數在函數簽名是不必要的 – Nawa 2013-04-22 14:09:39

+0

@Nawa這是一個複製粘貼錯誤 – 2013-04-22 14:27:17

-2

你的實現看起來不錯,但你並不需要通過original作爲參數存在。

var original = node.removeChild; 
node.removeChild = function(node) { 
    alert('message'); 
    original(node); 
} 
+0

@ alex23 - 感謝您的更正。錯過了這一點。 – techfoobar 2013-04-22 13:18:18

+0

這可能會導致一個問題,因爲原始方法上下文在調用'original(node)時丟失;'在FF中查看我的回答 – 2013-04-22 13:24:04

+0

我有錯誤:值不實現接口節點。原始(節點);在鉻我有:非法調用 – Nawa 2013-04-22 13:56:04

1

首先,這樣做

var original = Node.prototype.removeChild; 
Node.prototype.removeChild = function(node) { 
    //custom logic 
    original.apply(this, arguments); 
} 

new關鍵字的用法完全不正確。這將嚴重改變行爲。 functionFunction的一個實例,它是所有JavaScript函數的「母題」。

當使用new關鍵字時,該函數將立即執行,並且行爲與期望的行爲有很大不同。有關如何創建函數對象的更多詳細信息,請參閱ECMA語言規範第13部分。請閱讀here,在第98頁。

其次,強烈建議不要改變任何本地對象prototype。它導致人類歷史上最乏味和痛苦的錯誤。在你編輯代碼之後,任何人都會花費很長時間才能確定警報源自哪裏。

保持這兩個行爲是分開的,它們是完全無關的。包裹起來的prototype功能是非常糟糕的設計,由於上述原因的任何更多的人,如:

  1. 使用for in循環。如果您忘記使用hasOwnProperty,您將遍歷更多屬性。
  2. 你自己和其他開發人員很難弄清楚隨機事件爲什麼隨着基本DOM節點的移動而發生刪除操作(你會忘記,發生在每個人身上)。
+0

這些原因實際上是令人鼓舞的,因爲'in for循環是荒謬的。除了普通對象之外,我不會去「for..in」,如果是,它不會是DOM節點。第二個原因是假設一個龐大的程序員企業團隊。這兩個原因適用於很少的人,所以這就是爲什麼你真的鼓勵這個:D – Esailija 2013-04-22 13:35:51

1

我會變得激進,只是說不。雖然它在技術上可能適用於您關心的瀏覽器並且是prototype.js的基礎,但您絕不應該像這樣修改DOM對象或其原​​型。

關於該主題有一篇很長的文章:http://perfectionkills.com/whats-wrong-with-extending-the-dom/但TL; DR是這些是「託管對象」,並且不保證對其行爲進行修改。它今天可以在瀏覽器x上運行,但是明天不能保證瀏覽器y甚至x。