JQuery обработчик кликов срабатывает несколько раз - PullRequest
0 голосов
/ 17 марта 2011

У меня проблемы с тем, что мои события нажатия saveBtn срабатывают многократно, потому что вызывается функция, указанная ниже, и регистрирует новый обработчик щелчков каждый раз, когда пользователь вызывает функцию. Как мне зарегистрировать только один обработчик событий клика?

function forceAnnotation(annotationNo,objectNo,clientNo, callBack) {

     $('#forcedAnnotation').dialog( { 
        modal: true,
        width: 385,
        height: 370,
        closeOnEscape: false,
        open: function(event, ui) { jQuery('.ui-dialog-titlebar-close').hide(); }
     });

     $('#cancelBtn').click(function() {
        callBack.onCancel();
        $('#forcedAnnotation').dialog("close")
     });

     $('#saveBtn').click(function(){
             //make ajax call
     });

  }

Ответы [ 3 ]

3 голосов
/ 17 марта 2011

Может быть, вы могли бы использовать функцию jQuery.one ().

"Присоединить обработчик к событию для элементов. Обработчик выполняется не более одного раза для элемента."

http://api.jquery.com/one/

1 голос
/ 17 марта 2011

Если вы вынуждены добавлять обработчик щелчков каждый раз, почему бы просто не отсоединять его каждый раз также с помощью:

$('#cancelBtn').unbind('click');

Чтобы убедиться, что вы просто отвязали этот конкретный обработчик щелчков, вы можете использовать пространства имен.

$('#cancelBtn').unbind('click.annotation').bind('click.annotation', function(e) {
  callBack.onCancel();
  $('#forcedAnnotation').dialog("close")
});

$('#saveBtn').unbind('click.annotation').bind('click.annotation', function(e) {
  //make ajax call
});

Это должно работать, я надеюсь

0 голосов
/ 17 марта 2011

Самый простой способ - это реорганизовать ваш код, чтобы удалить регистрацию обработчика click, находящуюся вне функции.

Если это невозможно, вы можете объявить функцию отмены вне области действияваша forceAnnotation() функция.И в вашей функции переопределите его, чтобы он был тем, что вам нужно.

 var cancelClick = function(){};

 function forceAnnotation(annotationNo,objectNo,clientNo, callBack) {

   $('#forcedAnnotation').dialog( { 
    modal: true,
    width: 385,
    height: 370,
    closeOnEscape: false,
    open: function(event, ui) { jQuery('.ui-dialog-titlebar-close').hide(); }
   });

   cancelClick =  function(){
                  callBack.onCancel();
                  $('#forcedAnnotation').dialog("close");
                }
 }


 $('#cancelBtn').click(function() {
   cancelClick();
 });

 $('#saveBtn').click(function(){
         //make ajax call
 });

Другие варианты: .one()

Прикрепите обработчик к событию дляэлементы.Обработчик выполняется не более одного раза для каждого элемента.

Или просто unbind() обработчик щелчка каждый раз.

 $('#cancelBtn').unbind("click").click(function() {
    callBack.onCancel();
    $('#forcedAnnotation').dialog("close")
 });
...