.on()事件未触发

时间:2012-01-20 17:55:51

标签: javascript jquery

不确定以下代码无效的原因。如果我将.on()更改为.live()它可以正常工作,但现场活动仍然存在,因为这样会出现在页面上和页面之外的情况,而不是一次,live会在每次点击时继续添加到事件行。我觉得短而瘦,为什么这不会开火?

$("#" + old_n).on('mousedown', function(evt) {
    console.log(old_n);

    if($(el).data('clickphase')) {
        return true;
    }

    $("#" + $.contextmenu).remove();
    $(el).data('served', true);

    if(typeof array_of_a[a_index][1] == 'function') {
        array_of_a[a_index][1](evt, el);
    }

    // console.log(array_of_a[a_index]);            
    // array_of_a[a_index][1](evt, el);
    $(el).removeData('served');
});

old_n是点击的当前<li>的ID,也有hover个事件,但这不应该破坏mousedown事件吗?

3 个答案:

答案 0 :(得分:3)

$("#" + old_n).on('mousedown', function(evt) {

仅在呈现页面时存在old_n时才有效。这是一个直接绑定的事件,与

相同
$("#" + old_n).bind('mousedown', function(evt) {

您需要委派事件:

$(document).on("mousedown", "#" + old_n, function(evt) {

这将导致文档中任何位置的所有mousedown事件被jQuery“监听”,如果任何来自与old_n的selector-id相匹配的元素 - 则事件处理程序将触发。


当然,在文档中的任何地方收听每个mousedown事件都有点浪费。如果你知道这个元素只会存在于id为foo的div中(并且在呈现页面时存在foo),那么为什么不只是监听事件即将到来foo

$("#foo").on("mousedown", "#" + old_n, function(evt) {

答案 1 :(得分:1)

您的代码不是从liveon的正确翻译。试试这个:

$(document).on("mousedown", "#" + old_n, function (evt) {
    /*...*/
});   

答案 2 :(得分:1)

on不是live的替代品。请尝试在列表项的ul级别进行监控。这更有效,并且on的好处。

$('ul').on('click', 'li', function() {
    //get clicked list item's id
    var id = $('this').prop('id');
});

由于您正在ul级别进行监控,因此您需要从列表项中检索所需信息。