2

我可以替换像 removeChild 这样的标准 DOM 函数以在从父节点删除某些节点之前显示例如警报吗?类似的东西,但我的例子有错误

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

4 回答 4

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);
}
于 2013-04-22T13:23:07.933 回答
1

首先,new关键字的使用是完全错误的。这将严重改变行为。function是 的一个实例Function,它是所有 JavaScript 函数的“母舰”。

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

其次,强烈建议不要更改任何原生对象prototype。它导致了人类历史上最乏味和最痛苦的错误。任何在你之后编辑代码的人都会花很长时间才能弄清楚警报的来源。

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

  1. 使用for in循环。如果您忘记使用 ,您将遍历更多应该使用的属性hasOwnProperty
  2. 您自己和其他开发人员将很难弄清楚为什么随机的事情会随着基本的 DOM 节点删除操作而发生。(您会忘记,每个人都会发生)。
于 2013-04-22T13:31:38.290 回答
1

我将变得激进,只是说不。虽然它在技术上可以在您关心的浏览器上运行并且是prototype.js 的基础,但您永远不应该像这样修改DOM 对象或其原​​型。

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

于 2013-04-22T14:02:26.410 回答
-2

您的实现看起来不错,只是您不需要在original那里作为参数传递。

var original = node.removeChild;
node.removeChild = function(node) {
    alert('message');
    original(node);
}
于 2013-04-22T13:15:44.880 回答