gpt4 book ai didi

jquery - 复制 HTML 并保留事件

转载 作者:行者123 更新时间:2023-12-01 08:16:32 25 4
gpt4 key购买 nike

我希望克隆一个元素的 innerhtml (#clone) 并将其插入另一个元素 (#newLocation)。

使用clone()的问题是,我将首先删除#newLocation中当前的元素(如果有),然后迭代中的每个元素>#clone 并将其附加到 #newLocation。这不是世界末日,但我希望有一种更简单的方法。

相反,我想我应该使用 html()。由于这不会保留事件,因此我必须使用 ON 委托(delegate)事件。我原以为这会起作用,但事实并非如此。

有什么建议我做错了吗?另外,即使我可以使 html() 解决方案正常工作,您认为使用 clone() 解决方案会更有效吗?

编辑:刚刚编写了我的第一个插件:http://jsfiddle.net/Wnr65/这似乎有效。使用好主意吗?当然可以写得更好。

$(document).ready(function(){
$("#cloneIt").click(function(){$('#newLocation').cloneInnerHtml('clone').css('color', 'red');});
$("#clone a").click(function(){alert("click");});
$("#clone select").change(function(){alert("change");});
});

(function( $ ){
$.fn.cloneInnerHtml = function( id ) {
this.empty();
var $t=this;
$('#'+id).each(function() {$t.append($(this).clone(true));});
return this;
};
})( jQuery );


<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Clone INNERHTML</title>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.js" language="javascript"></script>
<script type="text/javascript">

$(document).ready(function(){
$("#cloneIt").click(function(){$('#newLocation').html($('#clone').html());});

//Only works on original clone
$("#clone a").on("click", function(){alert("click");});
$("#clone select").on("change", function(){alert("change");});

//Doesn't work at all
$("#newLocation a").on("click", function(){alert("click");});
$("#newLocation select").on("change", function(){alert("change");});

});

</script>

</head>
<body>
<input type="button" value="Clone it" id="cloneIt" />

<p>Original clone is shown below</p>
<div id="clone">
<a href="#">Click Me</a>
<select><option>Hello</option><option>Goodby</option></select>
</div>
<hr />
<p>Insert new clones below.</p>
<div id="newLocation">
<p class="someOldElement">someOldElement</p>
</div>

</body>
</html>

最佳答案

​您的代码没有按照您想要的方式使用react是正常的。当你这样做时

$("#clone a").on("click", function() {
alert("click");
});

它将把click事件绑定(bind)到与#clone a选择器匹配的元素。这些要素是在执行时确定的。在您的情况下,此行将事件绑定(bind)到页面中存在的第一个也是唯一的链接

相同的规则适用于代码

$("#newLocation a").on("click", function() {
alert("click");
});

但这里的区别在于,在执行时,#newLocation内部没有a元素,所以选择的是空并且处理程序根本没有绑定(bind)。

然后,当你这样做时

$('#newLocation').html( $('#clone').html() );

它会从一个元素获取 HTML 内容并将其复制到另一个元素中,但这只是关于 HTML 内容,因此事件绑定(bind)仍然与“复制操作”之前相同。

on 方法有不同的语法,只有一种允许事件委托(delegate):

// get all current "a" elements inside the "#clone"
// and bind the click event
$( "#clone a" ).on( "click", handler );

// get the "#clone" element, bind a click event to it
// BUT trigger the event only when the origin of the event is an "a" element
// here the event delegation is enabled
// it means that future "a" elements will trigger the handler
$( "#clone" ).on( "click", "a", handler );

// if you want it to work with your code
// you could do something like below
// this add a click handler to all present and future "a" elements
// which are inside "#clone" or "#newLocation"
// but this is not the recommended way to do this, check below the clone method
$("#clone, #newLocation").on("click", "a", handler);
<小时/>

clone 方法不会删除元素,这是一个工作演示 http://jsfiddle.net/pomeh/G34SE/

HTML 代码

<div class="source">
<a href="#">Some link</a>
</div>
<div class="target">
</div>​

CSS代码

div {
width: 100px;
height: 25px;
}

.source {
border: solid red 1px;
}
.target {
border: solid blue 1px;
}

Javascript代码

var $element = $("a"),
$target = $(".target"),
$clone;


$element.on("click", function( ev ) {
ev.preventDefault();
console.log("click");
});


$clone = $element.clone( true );

$clone.appendTo( $target );​

该方法还接收一个参数,指示事件处理程序是否应与元素 http://api.jquery.com/clone/ 一起复制。

关于jquery - 复制 HTML 并保留事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10317552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com