我有一个jQuery函数,基本上可以使整个表行可单击,但复制一个链接并复制该行中每个子单元格中的链接。在我的项目中,一些链接可能有onclick javascript事件,所以我需要我的功能也能够复制这些事件,但我在这方面遇到了麻烦。
这是我目前的职能:
jQuery.fn.linker = function(selector) {
$(this).each(function() {
var from = $(selector, this);
if (from.length > 0) {
var href = from.attr('href');
if (href) {
var link = $('<a href="' + $(selector, this).attr('href') + '"></a>').css({
'text-decoration': 'none',
'display': 'block',
'padding': '0px',
'cursor': 'pointer',
'color': $(this).css('color')
});
$(this).children()
//.css('padding', '0')
.wrapInner(link);
}
}
});
};
我尝试过不同的方法来复制事件,但似乎无法让它发挥作用:
1)来自[0] .events总是未定义:
if (from.size() && from[0].events && link.size()) {
var events = from[0].events;
link.each(function() {
for (var type in events) {
for (var handler in events[type]) {
jQuery.event.add(this, type, events[type][handler], events[type][handler].data);
}
}
});
}
2)这个似乎执行正常,但点击复制的链接不会做任何事情
link.attr('onclick',from.attr('onclick'));
答案 0 :(得分:1)
从jQuery 1.4开始,您可以使用.clone()
it now has a .clone(true)
overload。
指示它复制数据和事件(事件保存在.data('events')
)。
您的链接创建可以是这样的:
var link = from.clone(true).css({
'text-decoration': 'none',
'display': 'block',
'padding': '0px',
'cursor': 'pointer',
'color': $(this).css('color')
});
答案 1 :(得分:0)
为事件处理程序继续对元素进行存在。你不能使用
$('bla')。点击......或任何实现它的东西
相反,您必须使用以下方法之一:
$('bla').live('click', function(){...});
或
$("table").delegate("tr", "click", function(){
.....
});
live和delegate之间的区别在于委托可以很容易地存在于链中。反对生活。委托是一个新功能。
对于使用clone()函数的单个元素,您需要在clone中传入一个true参数以保留原始事件处理程序。这不是你的情况,但知道它是有用的。
$('.bla').clone(true).appendTo('body or something');
答案 2 :(得分:0)
您可以在复制后重新绑定事件。但新的克隆要好得多。