jQuery的.live()忽略了事件

时间:2011-10-11 13:39:45

标签: javascript jquery

给出以下HTML代码段:

    Goggles <input type="checkbox" id="id_goggles_opt_in" name="goggles_opt_in">
    Approved <input type="checkbox" id="id_approved" name="approved">

和这个JavaScript:

$('#id_approved').live('click', function() {
    alert('click is fine when selected by ID');
});

var $formInputs = $('.form input[type=text], .form input:file, .form textarea, .form select, .form input[type=checkbox]');

var $checkboxes = $formInputs.filter('[type=checkbox]');
console.log("This selector actually finds the elements: " + $checkboxes.size());
console.log($checkboxes)

$checkboxes.live('click', function() {
    alert('bizarrely this is never called');
});

第二个警报永远不会被触发。 #jquery regularrs建议我只使用.delegate,但为什么这不起作用?

关于JSFiddle的示例:http://jsfiddle.net/amA3h/

2 个答案:

答案 0 :(得分:5)

来自jQuery's documentation

  

不支持DOM遍历方法来查找要发送到.live()的元素。相反,应始终在选择器后直接调用.live()方法...

答案 1 :(得分:3)

Mully是对的 - 使用.filter()干扰.live()事件。

这有效:

var $checkboxes = $('.form input[type=checkbox]');
$checkboxes.live('click', function() {
    alert('bizarrely this is never called');
});

http://jsfiddle.net/mblase75/amA3h/5/

或者,要做.delegate - 样式:

$('.form').delegate('input:checkbox','click', function() {
    alert('bizarrely this is never called');
});