JQuery Live не работает, как ожидалось - PullRequest
0 голосов
/ 18 октября 2011

У меня проблемы с ajax-запросами и просто <input type="submit"/>.

Я использую для загрузки представлений внутри других представлений, я имею в виду модульный, с использованием jquery .load(url) из одного представления в другое. проблема в том, что если я загружаю view_2 внутри view_1, а js-скрипт для view_2 находится внутри view_1, мне нужно использовать live('click'), например, для запуска запроса xhr из view_2, поэтому при попытке запускается 3 (multiple) xhr at same time вместо 1, не знаю почему.

единственное, что я знаю:

  1. с использованием live('click') в view_1 запускается 3-х кратный XHR.
  2. использование click() в view_1 не работает (очевидно, я так думаю).
  3. использование click() непосредственно внутри view_2 это работает (но я не могу использовать JS в загруженных представлениях я могу использовать js только в представлениях "родителей")

функции действительно просты, действительно не знаю, почему у меня есть эта проблема (я также отключил отправку в ajax beforeSend), проверьте, что это код view_1, который запускается в загруженном view_2 и запускает 3 XHR для клика: |

$(document).ready(function(){ 
   $('#save-doc').live('click',function(){
    var _title = $('#doc-title').val();
    var _doc = $('#doc-doc').val();
    update_doc(url_update_doc,{'title':_title,'doc':_doc,'id_doc':_choosed_doc,'id_project':id_project},this);
    });
});
function update_doc(_url,_data,_starter){
    $.ajax({
        type:'POST',
        data:_data,
        url:_url,
        dataType:'json',
        beforeSend:function(){
            $('.ajax-loading').show();
            $(_starter).attr('disabled','disabled');
        },
        error:function(){
            $('.ajax-loading').hide();
            $(_starter).removeAttr('disabled');
        },
        success:function(json){
            $('.ajax-loading').hide();
            $(_starter).removeAttr('disabled');
            if(json.error){
                $('#error-title').html(json.error_title);
                $('#error-doc').html(json.error_doc);
                $.scrollTo('.append-form-edit-doc','fast');
            }
            if(json.confirm){
               $.scrollTo('#top','fast');
               $.gritter.add({
                   title:'Document Saved',
                   text:json.confirm
               });
           }
        }
    });
}

Ответы [ 2 ]

2 голосов
/ 18 октября 2011

Помните, что .live () привязывает обработчик событий к самому документу .Имея это в виду, он ищет # save-doc по всему документу при каждом клике.

Если в документе несколько элементов с идентификатором 'save-doc', то все они будут запущены.

Однако, я уверен, что с вами происходит то, что у вас может быть несколько многоуровневых форм, которые все выполняются этим одним входом.

Редактировать: Третья возможность, это то, что упоминает Пойнти.Выполнение отправки с помощью вашего обработчика событий и другая отправка, происходящая из-за поведения браузера.

Пожалуйста, предоставьте HTML и то, что загружается в них.

2 голосов
/ 18 октября 2011

Если это кнопка отправки внутри формы , то, если вы не запретите действие по умолчанию, форма будет отправлена.(Это было бы 2 ПОСТА, но не три.)

...