Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/75.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 `$().clone(true)`在chrome扩展中中断事件处理程序(在jsbin上工作)_Javascript_Jquery_Google Chrome Extension_Event Handling_Clone - Fatal编程技术网

Javascript `$().clone(true)`在chrome扩展中中断事件处理程序(在jsbin上工作)

Javascript `$().clone(true)`在chrome扩展中中断事件处理程序(在jsbin上工作),javascript,jquery,google-chrome-extension,event-handling,clone,Javascript,Jquery,Google Chrome Extension,Event Handling,Clone,我正在开发一个chrome扩展,它可能会改变数千个DOM元素。出于性能方面的考虑,我希望在内存中执行此操作,而不是反复接触DOM。正如您在下面的代码片段中所看到的,这一点非常有用 $(文档).ready(函数(){ $(“#单击我”)。在(“单击”、()=>{ $(“#单击计数”).html((idx,num)=>++num) }) $(“#带克隆”)。单击(函数(){ 使用克隆($elem)=>{ $elem.find(“h1”).text(“通过克隆更改(仍然有效)”) }) }) $(“

我正在开发一个chrome扩展,它可能会改变数千个DOM元素。出于性能方面的考虑,我希望在内存中执行此操作,而不是反复接触DOM。正如您在下面的代码片段中所看到的,这一点非常有用

$(文档).ready(函数(){
$(“#单击我”)。在(“单击”、()=>{
$(“#单击计数”).html((idx,num)=>++num)
})
$(“#带克隆”)。单击(函数(){
使用克隆($elem)=>{
$elem.find(“h1”).text(“通过克隆更改(仍然有效)”)
})
})
$(“#无克隆”)。单击(函数(){
不进行克隆($elem)=>{
$elem.find(“h1”).text(“未经克隆而更改(仍有效)”)
})
})
})
具有克隆功能(mutateDom){
变量$elem=$(“主体”)
//'true'参数保留绑定
var$clone=$elem.clone(true)
变异(克隆)
$elem.replaceWith($cloned)
}
不带克隆的函数(mutateDom){
突变域($(“主体”))
}

JS-Bin
点击我!
单击计数:0

替换而不克隆 以克隆取代
您正在执行的操作可能会中断事件处理程序。不能使用jQuery方法克隆或替换事件处理程序(由jQuery方法添加的事件除外)。因此,用克隆副本替换DOM的内容将导致删除事件处理程序

jQuery
.clone()
无法克隆非jQuery事件 当没有通过jQuery方法添加事件侦听器时,jQuery无法知道元素上有哪些事件。因此,通过普通DOM方法(即
.addEventListener()
)添加的任何事件都不会被jQuery的
.clone()
克隆

下面是一个使用
addEventListener()
添加计数事件处理程序的示例。您可以看到jQuery
.clone()
不会克隆它,但会克隆jQuery事件(还包括):

$(文档).ready(函数(){
document.querySelector(“单击我”).addEventListener(“单击”,()=>{
$(“#单击计数”).html((idx,num)=>++num)
})
$(“#带克隆”)。单击(函数(){
使用克隆($elem)=>{
$elem.find(“h1”).text(“随着克隆而更改(计数无效)”)
})
})
$(“#无克隆”)。单击(函数(){
不进行克隆($elem)=>{
$elem.find(“h1”).text(“未经克隆而更改(仍有效)”)
})
})
})
具有克隆功能(mutateDom){
变量$elem=$(“主体”)
//'true'参数保留绑定
var$clone=$elem.clone(true)
变异(克隆)
$elem.replaceWith($cloned)
}
不带克隆的函数(mutateDom){
突变域($(“主体”))
}

JS-Bin
点击我!
单击计数:0

替换而不克隆 以克隆取代
您正在执行的操作可能会中断事件处理程序。不能使用jQuery方法克隆或替换事件处理程序(由jQuery方法添加的事件除外)。因此,用克隆副本替换DOM的内容将导致删除事件处理程序

jQuery
.clone()
无法克隆非jQuery事件 当没有通过jQuery方法添加事件侦听器时,jQuery无法知道元素上有哪些事件。因此,通过普通DOM方法(即
.addEventListener()
)添加的任何事件都不会被jQuery的
.clone()
克隆

下面是一个使用
addEventListener()
添加计数事件处理程序的示例。您可以看到jQuery
.clone()
不会克隆它,但会克隆jQuery事件(还包括):

$(文档).ready(函数(){
document.querySelector(“单击我”).addEventListener(“单击”,()=>{
$(“#单击计数”).html((idx,num)=>++num)
})
$(“#带克隆”)。单击(函数(){
使用克隆($elem)=>{
$elem.find(“h1”).text(“随着克隆而更改(计数无效)”)
})
})
$(“#无克隆”)。单击(函数(){
不进行克隆($elem)=>{
$elem.find(“h1”).text(“未经克隆而更改(仍有效)”)
})
})
})
具有克隆功能(mutateDom){
变量$elem=$(“主体”)
//'true'参数保留绑定
var$clone=$elem.clone(true)
变异(克隆)
$elem.replaceWith($cloned)
}
不带克隆的函数(mutateDom){
突变域($(“主体”))
}

JS-Bin
点击我!
单击计数:0

替换而不克隆 以克隆取代
请将您的代码从JS-Bin移动/复制到一个。@Makyen谢谢您的提示,我以后一定会这样做。请将您的代码从JS-Bin移动/复制到一个。@Makyen谢谢您的提示,我以后一定会这样做。谢谢,您的第二个代码片段让我很容易看到我面临的问题。我想我只是用水管冲洗过,需要重新调整一下要求吗?@HenryBaughman,基本上是的。正如您所看到的,jQuery的
.clone(true)
不能作为一种通用的克隆方法,同时包含所有事件。不幸的是,没有允许确定已添加事件的接口。一种可能的替代方法是克隆内容,将克隆的内容交换到页面中,同时保留对当前内容的引用。然后,修改内容(您仍将销毁实际替换的元素上的任何事件侦听器),然后交换原始的、现在已修改的内容。不知道,还没有尝试过这种方法。@HenryBaughman,但是,您应该真正考虑在活动DOM中执行“变异”。浏览器是智能的。除非您执行了需要重新评估页面的操作,或使用异步方法,否则页面的实际显示不应更新,直到您所做的所有更改完成(即,您结束当前处理,或以其他方式停止执行(例如,调用异步方法并等待回调))。如果您确实需要执行异步操作以获取t的信息