复制onclick事件

时间:2010-03-26 18:23:38

标签: jquery javascript-events

我有一个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'));

3 个答案:

答案 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)

您可以在复制后重新绑定事件。但新的克隆要好得多。