2010-08-01 1 views
2

Я грубо работает со следующим:JQuery и восходящей цепочки события ... СНОВА

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 РАЗ !!!.

Быстрое и очевидное решение состоит в том, чтобы разместить содержимое my_function() и поместить их в оператор управления if, прикрепленный к «# someElement», но я очень заинтересован в том, чтобы сохранить структуру, которую я изложил, и я Конечно, есть простой способ сделать это.

Любые идеи?

UPDATE

я первоначально предположил, что проблема была с вызовом функции из моего защелкивания события. Это не было, я думаю, что проблема может иметь что-то делать с вложенной «» 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 

    } 

} 

Я пропущенной константу «к», так как операторы случае оказывают «если» заявление предыдущий пример бесполезен. Приведенный выше код обеспечивает лучшую иллюстрацию проблемы, с которой я столкнулся.

Любая помощь будет очень признательна. :)

+0

Отметьте код должным образом в первую очередь. – Anders

ответ

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

+0

@ Leonard - я обновил свой ответ (см. Выше). В основном вам нужно либо избавиться от '.ajaxComplete()', и просто вызвать 'my_function()' в вашем обратном вызове, или если вы хотите '.ajaxComplete()', только вызывать его * один раз *. Прямо сейчас вы вызываете его один раз для * каждого * ajax-ответа. – user113716

Смежные вопросы