2010-08-01 103 views
2

我大致有以下工作:jQuery和事件冒泡... AGAIN

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"); 
} 

'创建my_function(),' 火灾时,我点击 '#someElement',符合市场预期,但alertbox弹出5 TIMES !!!

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

任何想法?

UPDATE

我本来认为这个问题是从我的“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”,视情况报表呈现的“如果”的声明前面的例子没用。上面的代码提供了我遇到的问题的更好的说明。

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

+0

首先正确缩进代码。 – Anders 2010-08-01 23:40:55

回答

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"); 
}​ 
+0

谢谢您的及时回复!顺便说一句,我真的很喜欢那个jsfiddle.net应用程序。 ;) 我也会努力在发布之前缩进我的代码。 除了我用未声明的变量所犯的基本错误之外,代码的确能正常工作。 我已经编辑了我原来的帖子,提出了一个更能反映我遇到的问题的代码示例。 为大家喝彩。 :) – Leonard 2010-08-02 02:35:22

+0

@Leonard - 我更新了我的答案(参见上文)。基本上你或者需要抛弃'.ajaxComplete()',并且只需在你的回调函数中调用'my_function()',或者如果你想'.ajaxComplete()',只调用一次*。现在你为每个* ajax响应调用一次。 – user113716 2010-08-02 03:10:32