Загрузка Jquery в диалоге повторяется экспоненциально - PullRequest
1 голос
/ 09 марта 2012

У меня действительно раздражающая проблема с jQuery и / или диалоговым окном пользовательского интерфейса jQuery.

После нажатия на специальную ссылку появится модальное диалоговое окно с некоторым загруженным содержимым (ajax) и внутри этого загруженного содержимогоновые ссылки / кнопки, которые загружают свои URL-адреса внутри одного и того же блока div, поэтому диалог по-прежнему загружается, но с новым содержимым.Проблема в том, что если вы ссылаетесь на эту ссылку (внутри недавно загруженного диалогового окна и на недавно загруженном веб-сайте), она работает как надо, но при втором щелчке она загружает URL-адрес дважды, а третий - 4 раза... Это растет экспоненциально с каждой новой ссылкой, загруженной в диалоге.Я проверяю это с помощью счетчика, хранящегося внутри $ _SESSION.

Это код Javascript:

var somedialog = $('<div></div>').dialog({
  autoOpen: false,
  resizable: false,
  modal: true,
  /*show: 'fade',
  hide: 'puff',*/
  closeOnEscape: true,
  close: function(){
  }
 });
 function openInDialog(url, title, width, height)
 {
  somedialog.empty();
  somedialog.dialog("option", "width", width);
  somedialog.dialog("option", "height", height);
  somedialog.dialog("option", "title", title);
  somedialog.load(url,{},function (responseText, textStatus, XMLHttpRequest)
   {
    somedialog.dialog('open');
   }
  );

  //somedialog.load(url,{},function (responseText, textStatus, XMLHttpRequest){
  // dialogdiv.somedialog('open');
  //});
 }

 $('a.ajaxBuyItemDialog').on('click',function(){
  openInDialog(this.href, this.title, 400, 300);
  //prevent the browser to follow the link
  return false;
 });

Похоже, что другие люди с этим вопросом, но это не очень эффективное обсуждение: https://stackoverflow.com/questions/6471360/jquery-load-after-load-repeated-results-problem

Спасибоза вашу помощь!

РЕДАКТИРОВАТЬ: Это часть кода, который находится в загруженном скрипте:

$("#_BUYITEM_FORM").live('submit', function(){
    $.ajax({ // create an AJAX call...
        data: $(this).serialize(), // get the form data
        type: $(this).attr('method'), // GET or POST
        url: $(this).attr('action'), // the file to call
        success: function(response){ // on success..
            $("#_BUYITEM_CONTENT").html('<p class="AjaxLoaderImg"><span>Einen Moment bitte...</span></p>');
            $("#_BUYITEM_CONTENT").html(response); // update the DIV
        }
    });
    return false; // cancel original event to prevent form submitting
});

Без него я не могу заставить его обновить диалоговое окно с новымсодержание.

Ответы [ 3 ]

1 голос
/ 09 марта 2012

Похоже, ваш код javascript копируется на каждой целевой странице $('a.ajaxBuyItemDialog'), на которую вы нажали. Повторное добавление этого скрипта в диалоговое окно при каждом щелчке приводит к тому, что событие вызывается более одного раза.

0 голосов
/ 15 марта 2012

«Грязный» раствор

function watchBuyItemForm(){
        $("#_BUYITEM_FORM").submit(function(){
            $.ajax({ // create an AJAX call...
                data: $(this).serialize(), // get the form data
                type: $(this).attr('method'), // GET or POST
                url: $(this).attr('action'), // the file to call
                success: function(response){ // on success..
                    somedialog.html(ajaxLoader);
                    somedialog.html(response); // update the DIV
                    watchBuyItemForm();
                }
            });
            return false; // cancel original event to prevent form submitting
        });
    }
0 голосов
/ 13 марта 2012

Если вы перезагрузите скрипт несколько раз, он будет добавлять новый обработчик отправки в форму каждый раз, когда вы используете live ().

live () делегирует обработчик документу и, следовательно, должен либо вызываться только один раз, либо вам нужно вызывать die () перед каждой загрузкой скрипта.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...