我可以替换像removeChild这样的标准DOM函数吗?

时间:2013-04-22 13:14:11

标签: javascript

在将一些节点从父节点中删除之前,我可以替换像removeChild这样的标准DOM函数来显示例如警报吗?这样的事情,但我的例子有错误

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

4 个答案:

答案 0 :(得分:2)

如果您想在整个文档中应用此功能

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

如果您只想将更改应用于所选节点,则

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

答案 1 :(得分:1)

首先,new关键字的使用完全不正确。这将严重改变行为。 functionFunction的一个实例,是所有JavaScript函数的“母舰”。

使用new关键字时,该函数将立即执行,其行为与您的预期完全不同。有关如何创建函数对象的更多详细信息,请参阅 ECMA语言规范第13节。请阅读here,第98页。

其次,强烈建议不要更改任何本机对象prototype。它导致了人类历史上最繁琐,最痛苦的错误。在您编辑代码后进入的任何人都会花费很长时间才能确定警报的来源。

将这两个动作分开,它们完全不相关。将它们包装在prototype函数中是非常糟糕的设计,因为上述原因还有更多,例如:

  1. 使用for in循环。如果忘记使用hasOwnProperty,您将迭代更多属性。
  2. 你自己和其他开发人员将很难弄清楚为什么随机事情会因为基本的DOM Node删除操作而出现问题。(你会忘记,发生在每个人身上)。

答案 2 :(得分:1)

我将是激进的,只是说不。虽然它可能在技术上适用于您关心的浏览器并且是prototype.js的基础,但您绝不应该像这样修改DOM对象或它们的原型。

主题上有一篇很长的帖子:http://perfectionkills.com/whats-wrong-with-extending-the-dom/但是TL; DR是这些是“托管对象”,并且无法保证对其行为的修改。今天它可能在浏览器x上工作,但明天不保证浏览器y甚至x。

答案 3 :(得分:-2)

您的实现看起来很好,除了您不需要在其中传递original作为参数。

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