Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何重写javascript';什么是克隆诺德?_Javascript_Prototype - Fatal编程技术网

如何重写javascript';什么是克隆诺德?

如何重写javascript';什么是克隆诺德?,javascript,prototype,Javascript,Prototype,这就是我到目前为止所做的: 这就是我试图覆盖默认克隆节点的方式: Object.defineProperty(Object.prototype,“cloneNode”{ get:cloneNode2, 组别:cloneNode2 }); 但它不起作用,所以我认为Object.prototype没有克隆节点,但Element.prototype也没有 那么,假设我的方法正确,我需要使用哪个类来重写cloneNode?尝试使用: Node.prototype.cloneNode = cloneNod

这就是我到目前为止所做的:

这就是我试图覆盖默认克隆节点的方式: Object.defineProperty(Object.prototype,“cloneNode”{ get:cloneNode2, 组别:cloneNode2 });

但它不起作用,所以我认为Object.prototype没有克隆节点,但Element.prototype也没有

那么,假设我的方法正确,我需要使用哪个类来重写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"

它是Node.prototype的一个属性

Node.prototype.cloneNode=function(){}


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

这一系列的小提琴正在进行中,但它重新实现了cloneNode的功能

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


注意,在IE中,原型函数不能被重写。因此,所有cloneNode实例都必须由一个函数来替换,该函数决定使用哪个版本的cloneNode。

函数cloneNode(){[native code]}
(至少在Chrome中是这样),所以我认为你不能真正覆盖它。好吧,我只需要在Firefox中覆盖它,因为cloneNode默认情况下会将样式属性中的颜色格式从十六进制更改为rgb。。。这使得克隆不是一个精确的副本。它仍然是FF中的本机代码。您希望它做什么?如果在
cloneNode2
中添加一个
警报
,则表明它使用的是
cloneNode2
,而不是本机警报(编辑:至少在Chrome中)认为这在技术上是可行的,应该在
节点上完成。原型
在实际定义的地方。如果你有一个不是元素(比如文本节点)的节点实例oops,它就不起作用了,即使文档说它是在节点上定义的,浏览器似乎认为它是在元素@TheLindyHop上定义的,我很确定我们确定它不可能done@TheLindyHop哪个浏览器?它在Chrome中对我有效。我知道它在IE中不起作用。我相信Chrome是唯一允许你修改它的浏览器。哦,Firefox。我不需要在其他浏览器中重写,因为FF中的cloneNode已损坏。这意味着无法完成:(顺便说一句,克隆节点函数没有正确设置节点本身的任何属性,也就是说,如果div包含任何属性,则不会将其复制到克隆节点。)node@TheLindyHop我认为outerHTML在Firefox中不起作用。fiddle在我的版本中不起作用,尽管它是一个非常旧的版本(3.6),但它可能在新的版本中起作用