.on()事件未触发

3

不确定为什么以下代码未能运行。如果我将 .on() 更改为 .live(),它就能工作,但是 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 事件。但这不应该影响到鼠标按下事件,对吧?


检查$("#" + old_n).length是否大于0 - Toni Michel Caubet
3个回答

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

只有在页面呈现时存在old_n才能起作用。这是一个直接绑定事件,与之相同。

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

您需要一个委托事件:

您需要一个委托事件:

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

这会导致jQuery监听文档中任何地方的所有mousedown事件,如果有任何事件来自与您选择器匹配的元素——id为old_n,则事件处理程序将触发。
当然,在整个文档中监听每个mousedown事件有点浪费资源。如果您知道此元素仅存在于具有id为foo的div中(并且在页面呈现时存在),那么为什么不只监听传入到foo的事件呢?
$("#foo").on("mousedown", "#" + old_n, function(evt) {

所以我将它改为... $("#contextmenu li").on('mousedown', "#" + old_n, function(evt),但仍然无法触发。唯一能让它触发的方法是要么附加到文档根,要么使用live调用。 - Rob
无论您在$()中放入什么,都必须在页面渲染时存在。因此,如果在页面渲染时#contextmenu不存在,那将无法工作。 - Adam Rackis
它不是一个上下文菜单,而是在右键单击对象时构建的菜单。因此,绑定一个事件到元素当它被渲染时不在页面上的唯一方法是使用live或者绑定到document? - Rob
@Rob 或者渲染页面与一个div,并在其中构建您的菜单,然后绑定到该div。或者直接绑定到文档。这就是live正在做的事情。 - Adam Rackis

1

你的代码并没有正确地将 live 翻译成 on。请尝试使用以下代码:

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

这仍然会导致其冒泡到文档根,因此当我使用它,再次使用它时,它就会被触发两次,并像实时事件一样不断累积。 - Rob
这是否意味着您在同一页上有多个具有相同“id”的元素?如果是这样,那么这是无效的HTML,并且您必须解决此问题。 - Andrew Whitaker

1

on 不是 live 的替代品。尝试在列表项的 ul 级别进行监控。这样更有效率,也是使用 on 的好处。

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

因为你正在监视 ul 级别,所以你需要从列表项中检索所需的信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接