我可以替换像 removeChild 这样的标准 DOM 函数以在从父节点删除某些节点之前显示例如警报吗?类似的东西,但我的例子有错误
var original = node.removeChild;
node.removeChild = function(node, original){
alert('message');
original(node);
}
我可以替换像 removeChild 这样的标准 DOM 函数以在从父节点删除某些节点之前显示例如警报吗?类似的东西,但我的例子有错误
var original = node.removeChild;
node.removeChild = function(node, original){
alert('message');
original(node);
}
如果您想在整个文档中应用它,请执行此操作
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);
}
首先,new
关键字的使用是完全错误的。这将严重改变行为。function
是 的一个实例Function
,它是所有 JavaScript 函数的“母舰”。
使用new
关键字时,该函数将立即执行,其行为与您所期望的非常不同。有关如何创建函数对象的更多详细信息,请参阅ECMA 语言规范的第 13 节。在此处阅读,第 98 页。
其次,强烈建议不要更改任何原生对象prototype
。它导致了人类历史上最乏味和最痛苦的错误。任何在你之后编辑代码的人都会花很长时间才能弄清楚警报的来源。
将这两个动作分开,它们完全不相关。将它们包装在一个prototype
函数中是非常糟糕的设计,因为上述原因还有很多,例如:
for in
循环。如果您忘记使用 ,您将遍历更多应该使用的属性hasOwnProperty
。我将变得激进,只是说不。虽然它在技术上可以在您关心的浏览器上运行并且是prototype.js 的基础,但您永远不应该像这样修改DOM 对象或其原型。
关于该主题有一篇很长的帖子:http: //perfectionkills.com/whats-wrong-with-extending-the-dom/但 TL;DR 是这些是“托管对象”并且不能保证对其行为进行修改. 它今天可能在浏览器 x 上工作,但不能保证明天浏览器 y 甚至 x 。
您的实现看起来不错,只是您不需要在original
那里作为参数传递。
var original = node.removeChild;
node.removeChild = function(node) {
alert('message');
original(node);
}