JQuery和事件冒泡......再次

时间:2010-08-01 23:39:07

标签: jquery event-handling event-bubbling

我正在大致使用以下内容:

var i;
var k = 5;
$('document').ready(function () {
    $('#someElement').click(function (e) {
        e.stopImmediatePropagation();
        i++;
        if (i >= k) {
            my_function();
        });
    }
});
my_function() {
    alert(i);
    $('#myDisplay').text("You have clicked on '#someElement' " + i + "times");
}
当我按预期点击'#someElement'时,'my_function()'会触发,但警告框会弹出5次!!!。

一个快速而明显的解决方案是放置my_function()的内容并将它们放入附加到'#someElement'的if控制语句中,但我非常希望保留我概述的结构,并且我确定这是一种简单的方法。

有什么想法吗?

更新

我最初认为问题出在我的'click'事件中的函数调用。事实并非如此,我认为这个问题可能与嵌套的'ajaxComplete'调用有关:

var i = 0;

$('document').ready(function () {

    $('<div id="someElement">Click me</div>').appendTo('body');
    $('<div id="myDisplay"></div>').appendTo('body');
    $('#someElement').click(function (e) {
        i++;
        $.get("test.html", function(html)
        {       
            $(html).ajaxComplete(function()
            {
                my_function(i);
            });
        });

    });

});

function my_function(n)
{

    switch (n)
    {

    case 1:
        alert(n);
        $('#myDisplay').text("this is case " + n);
        break
    case 2:
        alert(n);
        $('#myDisplay').text("this is case " + n);
        break
    case 3:
        alert(n);
        $('#myDisplay').text("this is case " + n);
        break

    default:
        alert('A great detective always breaks the case. :)');
        break

    }

}

我省略了常量'k',因为case语句使前一个例子中的'if'语句无用。上面的代码更好地说明了我遇到的问题。

任何帮助将不胜感激。 :)

1 个答案:

答案 0 :(得分:3)

根据更新后的问题进行修改:

问题是您在回调中呼叫$.ajaxComplete()。你应该摆脱它。您只需要匿名回调函数。

$.ajaxComplete()的目的是设置一个默认函数,以便在任何 ajax请求完成时运行。如果这是您想要的,您应该将其从当前回调中取出,并将其放在.ready()调用中,以便它只运行一次。

您现在正在采取的方式,对于每次点击(以及成功的响应),您都要添加另一个相同的处理程序。因此,在您单击5次后,它现在有5个相同的单击处理程序。

来自文档: http://api.jquery.com/ajaxComplete/

  

每当Ajax请求完成时,jQuery就会触发ajaxComplete事件。已经使用.ajaxComplete()方法注册的任何和所有处理程序都会在此时执行。


原始回答

这不一定是你的实际代码,因为它不会以你拥有的方式运行。

您的功能没有function声明。您需要使用i之类的值初始化0,而click处理程序的右括号是错误的。

那就是说,纠正后你的代码对我来说很好。

试一试: http://jsfiddle.net/sGWjL/1/

如果警报弹出5次,则需要粘贴更多(或实际)正在使用的代码。

var i = 0;
var k = 5;

$('document').ready(function () {
    $('#someElement').click(function (e) {
        e.stopImmediatePropagation();
        i++;
        if (i >= k) {
            my_function();
        }
    });
});

function my_function() {
    alert(i);
    $('#myDisplay').text("You have clicked on '#someElement' " + i + "times");
}​