1

我的代码

var post = {};
post.DivPostContent = $('.content');
post.DivPostContent.live({
    mouseenter:
        function()
        {
            var post_id = $(this).attr('data-post_id');
            var content_id = $('#content' + '_' + post_id);
            var link = $('#link' + '_' + post_id);
            content_id.find('.post_ratings').hide();
            content_id.find('.post_actions').show();
            //I removed the click event on a whim, i have no clue why it works
            link.unbind('click');
            link.click(function(){
                post.link_action(post_id);

            });


        },
    mouseleave:
        function()
        {
            //does something


        }
});

post.link_action = function(){
//Does some Ajax request
}

在我从“链接”中解绑点击事件之前,它四次调用“post.link_action”,我试图弄清楚它为什么这样做。在一遍又一遍地阅读我的代码几个小时后,我心想,让我们尝试删除点击事件,我错误地将那行放在错误的位置(我猜是出于沮丧)。我运行了代码,中提琴!有效!如何?我没有线索。

现在我的问题是,为什么在添加单击事件之前取消绑定单击事件会阻止该过程重复自身?我真的很想知道为什么。谢谢。

4

2 回答 2

2

因为每次您的鼠标进入对象 post.DivPostContent 时,它都会将一个新的点击事件绑定到您的链接对象;它触发了 4 次,因为您将鼠标悬停了 4 次。

忘记 .live & .click; 改用 .on 并在 mouseenter 事件之外绑定一次,或者如果您坚持在其中绑定它,请在之前使用 .off

 $elem.off("click").on("click",function() {});

但是在你的mouseenter之外做一次

于 2013-01-15T01:49:38.157 回答
1

现在我的问题是,为什么在添加单击事件之前取消绑定单击事件会阻止该过程重复自身?

编码:

link.click(function(){
    post.link_action(post_id);
});

click如果您多次注册,则向事件添加回调,例如在您的情况下onmouseenter,您最终将多次触发相同的事件。

unbind函数会删除任何先前对特定事件的回调,因此这就是回调只触发一次的原因。

By the way, unless your jQuery version is 1.4.3 or less you shouldn't be unsing live.
Use on which is available from version 1.7 ore delegate which is avaiable from version 1.4.4.

于 2013-01-15T01:53:34.740 回答