您应该尝试使用.on(),而不是使用.delegate() 或.live()。假设你正在克隆一个类名为 item 的元素,那么你可以使用下面的代码来绑定一个事件,比如点击事件:
$(document).on('click', '.item', function() {
// Do magic here that changes things in both the original item and its cloned counterpart
});
.on() 的工作原理是它监听事件以在 DOM 树中冒泡,直到它到达您选择的感兴趣的元素,在本例中为 document。需要注意的是,当执行 jQuery 时,您正在监听事件冒泡的元素必须存在于 DOM 中,document 是最安全的方法。当然,您也可以在 DOM 中存在的其他静态元素上使用 .on(),例如 <body>。
OP 提供了其他信息。 OP 似乎希望对一个元素所做的更改传播到其克隆的副本,而不是简单地将相同的处理程序绑定到克隆的元素。
$(document).ready(function () {
var $selectMenu = $('.selectMenu');
$selectMenu.on('click', 'li', function () {
$(this).css('background','red');
});
$selectMenu.clone(true).appendTo('body');
});
在这种情况下,我会提倡在元素的父级上下文中使用索引(使用.index())进行 DOM 横向。
$(document).ready(function () {
var $selectMenu = $('.selectMenu');
$selectMenu.on('click', 'li', function () {
$(".selectMenu").find('li:eq('+$(this).index()+')').css('background','red');
});
$selectMenu.clone(true).appendTo('body');
});
在此处查看小提琴:http://jsfiddle.net/teddyrised/4Jxv2/2/
此外,还有一些可能的改进:
- 添加/删除类而不是直接操作元素的内联 CSS
- 使用
.on(),这样您就可以在克隆之前绑定最初未绑定到元素的事件。
见下面的修改功能:
$(document).ready(function () {
// Clone first, worry about binding events later
$('.selectMenu').clone(true).appendTo('body');
// Bind events
$(document).on('click', '.selectMenu li', function() {
$('.selectMenu')
.find('li:eq('+$(this).index()+')')
.addClass('highlighted');
});
});
.highlighted 类可用于声明背景颜色 :) 请参见此处的小提琴:http://jsfiddle.net/teddyrised/4Jxv2/3/