2010-03-26 192 views
1

我有一个基本上使整个表行可点击的jQuery函数,但复制链接并复制行中每个子单元格中的链接。在我的项目中,一些链接可能包含javascript事件onclick,所以我需要我的函数来复制这些事件,但我在这样做时遇到了麻烦。复制onclick事件

这是我当前的功能:

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

为事件处理程序继续对元素进行存在。你不能使用

$(“BLA”)点击......或任何实现它像

相反,你必须使用下列方法之一:

$('bla').live('click', function(){...}); 

$("table").delegate("tr", "click", function(){ 
    ..... 
}); 

live和delegate之间的区别在于委托可以很容易地存在于一个链中。作为反对生活。代表是一项新功能。

对于使用clone()函数的情况下的单个元素,您需要在clone中传入一个true参数以保留原始事件处理程序。这不是你的情况,但它是有用的知道。

$('.bla').clone(true).appendTo('body or something'); 
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') 
      }); 
0

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

+0

这有什么关系? ;) – mway 2010-10-21 16:48:06

+1

是的,事实并非如此。写作时我一定没有完全意识到... – naugtur 2010-10-22 09:42:19