2

我大致使用以下内容:

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 控制语句中,但我非常热衷于保留我概述的结构,并且确信有一个简单的这样做的方法。

有任何想法吗?

更新

我最初认为问题出在我的“点击”事件中的函数调用上。不是,我认为问题可能与嵌套的“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”语句无用。上面的代码更好地说明了我遇到的问题。

任何帮助都感激不尽。:)

4

1 回答 1

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");
}​
于 2010-08-02T00:01:25.407 回答