如何覆盖javascript's克隆节点

How do I override javascript's cloneNode?

本文关键字:节点 javascript 何覆盖 覆盖      更新时间:2023-09-26

这就是我目前所拥有的:http://jsfiddle.net/beCVL/5/

这就是我试图覆盖默认cloneNode的方式:Object.defineProperty(Object.prototype,"cloneNode"{get:cloneNode2,集合:克隆节点2});

但它不起作用,所以,我认为Object.prototype没有cloneNode,但Element.prototype也没有。

那么,假设我的方法是正确的,我需要使用哪个类来覆盖cloneNode?

它是Node.prototype的一个属性https://developer.mozilla.org/En/DOM/Node.cloneNode

Node.prototype.cloneNode = function() {}

然而,修改内置对象可能会在将来给你带来悲伤。如果可能的话,您应该创建一个不同的函数并使用它,这样,使用cloneNode的现有代码就不会中断。

尝试使用:

Node.prototype.cloneNode = cloneNode2;

Object.defineProperty不用于此目的。这里有一个使用它的例子:

var o = {};
Object.defineProperty(o, 'blah', {
    'get': function () { return 'asdf'; },
    'set': function (x) { alert(x); }
});
alert(o.blah); // alerts 'asdf'
o.blah = 'fdsa'; // alerts 'fdsa'

显然,这只适用于Chrome。

为了解决实际问题,它应该足够简单,只需用等效的十六进制代码替换RGB代码。

function decToHex(a) {
    return ('00' + (+a).toString(16)).substr(-2);
}
function replaceRGB(str) {
    return str.replace(/rgb'(('d{1,3}), ('d{1,3}), ('d{1,3})')/, function (_, r, g, b) {
        return "#" + decToHex(r) + decToHex(g) + decToHex(b);
    });
}
replaceRGB("color: rgb(255, 0, 0)") // "color: #ff0000"

这一系列的fiddle正在进行中,但它重新实现了cloneNode的功能。http://jsfiddle.net/beCVL/19/

截至美国东部时间4月4日上午10:53,它需要使用IE,因为IE没有Node对象。

注意,在IE中,原型函数不能被覆盖。因此,cloneNode的所有实例都必须替换为一个函数,该函数确定要使用哪个版本的cloneNode。