Подтвердить что ты не робот

Почему это событие jQuery ajax click срабатывает несколько раз?

Я попытался отменить событие click, но он срабатывает иногда дважды, иногда 5 раз! Теперь немного надоело!

Код от modal.asp

$("input[name=add_associate]").live("click",function(){
    var addassociateID = $(this).attr("id")

    $.ajax({
       type: 'POST',
       url: '/data/watchlist_save.asp',
       data: {m : 'share_watchlist_add', watchListID : <%=WatchListID%>, a : addassociateID},
       async:true,
       success: function(data) {
           $(".associate_users").load("/data/sub_watch_members.asp?watchListID=<%=WatchListID%>",
           {cache:false},function() {
               $(".search_note").html(data)         
               $(this).unbind('click').bind('click',handler);                                                                                                
           })
       },
       error: function(data){
           $(".search_note").html(data)
       }
    });     
})

ОБНОВЛЕНИЕ:
В основном я вызываю следующий код в .associate_users

<div id="associate_list">
    <div class="associate_record">
        <div class="left" style="padding:8px;"><img src="../imgs/nopic-m.png" style="width:30px;height:30px;" class="img_border" /></div>
        <div class="left" style="padding-top:15px;">5)Neil Burton</div>
        <div class="right" style="padding-top:10px;margin-right:5px;"><input type="button" class="btn-blue" name="add_associate" id="890" value="Add"></div>
        <div style="clear:both;"></div>
    </div>
    <div style="clear:both;"></div>
</div>

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:
Это происходит только тогда, когда я запускаю событие, закрываю модальный диалог, а затем повторно открываю его с помощью другого watchListID

СТРУКТУРА ДАННЫХ:

  • main.asp: НАГРУЗКИ >
  • modal.asp: modal.asp содержит jquery сверху + два div на этой странице с параметрами panel1.asp и panel2.asp...
  • panel1.asp: содержит HTML-код выше...
  • panel2.asp: не содержит ничего связанного... просто чистого HTML.
4b9b3361

Ответ 1

Я решил эту проблему сейчас, я использовал

$(document).ready

в загруженном содержимом ajax вместе с...

<script src="/js/jquery-ui.js"></script>

Поэтому я предполагаю, что он удваивает "живую" функцию!

Большое спасибо за ответы.

Ответ 2

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

Что касается событий, связанных с live(), они должны быть несвязаны, вызывая die(). Он имеет те же параметры, что и unbind(). Посмотрите документацию.

function ajaxHandler(){
    var addassociateID = $(this).attr("id");
    var $this = $(this);
    $this.die('click');

    $.ajax({
        type: 'POST',
        url: '/data/watchlist_save.asp',
        data: {m : 'share_watchlist_add', watchListID : <%=WatchListID%>, a : addassociateID},
        async: true,
        success: function(data) {
            $(".associate_users").load("/data/sub_watch_members.asp?watchListID=<%=WatchListID%>",{cache:false},function(){
                $(".search_note").html(data);
                $this.bind('click',handler);
            });
        },
        error: function(data){
            $(".search_note").html(data);
            $this.live('click', ajaxHandler);
        }
    });     
}

$("input[name=add_associate]").live("click", ajaxHandler);

Изменить: Забыл добавить некоторые важные моменты. Вы должны развязать свое прямое событие прямо в обработчике кликов и переустановить его при ошибке, как показано в @stefan.

Также убедитесь, что вы сохранили объект this в переменной, поскольку он не указывает на ваш элемент DOM в функции обратного вызова ajax. В качестве альтернативы вы можете использовать свойство context в своем аякс-запросе, проверьте документацию.

Ответ 3

Как я вижу, все, что вы хотите сделать, это связать событие один раз и затем умереть. В последних версиях jQuery есть метод .one(), который свяжет событие только один раз.

Пример:

$('#myDiv').one('click', function() {
    alert('clicked once...');
});

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

Подробнее в http://api.jquery.com/one/

Ответ 5

Вы можете решить свою проблему двумя способами:

1) Переместите свой javascript-код в main.asp, вместо modal.asp.

Это мгновенно устранит проблему с двойным огнем. Вам придется немного изменить свой код, чтобы вытащить значение WatchListID из некоторого HTML внутри modal.asp, а не кодировать его напрямую, поскольку вы (поскольку main.asp еще не имеет этого значения.)

2) Сохраняйте свой код javascript там, где он есть, но прекратите использование живых событий.

Используйте простой вызов .click(function() { "вместо".live('click', function() {".

Вы перезагружаете modal.asp каждый раз, когда открывается диалоговое окно, что означает, что ваш javascript запускается каждый раз, когда он загружается. Если вы сохраняете свой javascript-код в modal.asp, тогда live(), вероятно, не подходит.

Ответ 6

Сначала вы отключаете успех. Вам нужно отвязать его в обработчике кликов, а затем снова добавить его в onerror.

Ответ 7

Я решил это так:

    var liveActionRemove = $('#ajax-list-action-remove');

    $(liveActionRemove).live('click', function(){
        $(liveActionRemove).die('click');

        $.ajax({
            url: '/someurl',
            success: function(data){
            }
        });
    }); 

Ответ 8

Просто позвоните .off() прямо перед вызовом .on().

Это удалит все обработчики событий:

$(element).off().on('click', function() {
    // function body
});

Чтобы удалить только зарегистрированные обработчики событий click

$(element).off('click').on('click', function() {
    // function body
});

Ответ 9

После одного щелчка, когда я нажимаю любой элемент html-элемента последнего клика, если он запущен, Я решаю его, используя ubind событие click ----, используя следующий код...

.

$( "selcetor" ) отвязать ('click');