2013-05-29 3 views
2

У меня есть система, которую я изменяю, которая использует jquery 1.5.1, что означает .on не существует.Jquery delegate/live не работает

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

<tr> 
     <td class="view_detail_label"> 

     </td> 
     <td> 

      @Html.ActionLink(
      training.Name.Name, 
      "AddSurvey", 
      new 
      { 
       employeeId = Model.Id, 
       trainingId = training.Id 
      }, 
      new 
      { 
       @class = "addSurvey" 
      } 
     ) 

      <div class="result" style="display:none;"></div> 

     </td> 

    </tr> 

В первой функции ниже я открыть всплывающее окно, и он прекрасно работает, за исключением, когда вы закроете всплывающее окно, вы не можете возобновить его по ссылке снова. Чтобы решить эту проблему, я подписал свое событие живым и использовал делегат и функцию live. Но при отслеживании его с консоли я не вижу никакого вывода из инструкции консоли: console.log($(this).next('.result'));.

$('.addSurvey').click(function() { 
      $.ajax({ 
       url: this.href, 
       type: 'GET', 
       cache: false, 
       context: this, 
       success: function (result) { 
        $(this).next('.result').html(result).dialog({ 
         autoOpen: true, 
         title: 'Anket', 
         width: 500, 
         height: 'auto', 
         modal: true 

        }); //end of dialog 
        //console.log($(this).next('.result')); 
       } //enf of success function 

      }); //end of ajax call 
      return false; 
     }); 

     $('a.addSurvey').live('click', function() { 

      $.ajax({ 
       url: this.href, 
       type: 'GET', 
       cache: false, 
       context: this, 
       success: function (result) { 
        $(this).next('.result').html(result).dialog({ 
         autoOpen: true, 
         title: 'Anket', 
         width: 500, 
         height: 'auto', 
         modal: true 

        }); //end of dialog 
       console.log($(this).next('.result')); 
       } //enf of success function 

      }); //end of ajax call 

     }); //end of live 

Почему так я использовал метод делегата, и он тоже не работает. Мой делегат функции:

$(document).delegate(".addSurvey", "click", function() { 

     $.ajax({ 
      url: this.href, 
      type: 'GET', 
      cache: false, 
      context: this, 
      success: function (result) { 
       $(this).next('.result').html(result).dialog({ 
        autoOpen: true, 
        title: 'Anket', 
        width: 500, 
        height: 'auto', 
        modal: true 

       }); //end of dialog 
       console.log($(this).next('.result')); 
      } //enf of success function 

     }); //end of ajax call 

    });//end of delegate 

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

* EDIT 1 После того, как вы открыли всплывающее окно, когда я нажимаю на него, он дублирует ответы, как только его щелкают дважды, и когда я обновляю страницу и нажимаю на нее, а затем закрываю ответы тройками. Что может вызвать эту неловкую ситуацию? * ** EDIT2 Я решил проблему выше, используя close: function() { console.log("onClose"); $('.surveyTable').load('Home/DetailsSurvey', {id:@Model.Id}); }. При этом я перезагружаю таблицу div и могу щелкнуть любую всплывающую подсказку.

+0

Вы проверили, был ли у вас активирован обратный вызов вашего успеха? Вы можете создать обратные вызовы 'error' или' complete', чтобы проверить это. – Vishal

+0

В целом я сделал следующее; 'complete: function() {console.log ("Test");}'. Это записывает тест ответа на консоль каждый раз, когда я нажимаю на ссылку, и я сделал то же самое для ошибки, на которую он не дает ответа в консоли. Кажется, что работает – Eneramo

ответ

0

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

$('a.addSurvey').live('click', function (e) { 
     var $this = $(this); 
     e.preventDefault(); 
     $.ajax({ 
      url: this.href, 
      type: 'GET', 
      cache: false, 
      context: this, 
      success: function (result) { 
       $(this).next('.result').html(result).dialog({ 
        autoOpen: true, 
        title: 'Anket', 
        width: 500, 
        height: 'auto', 
        modal: true, 
        close: function() { console.log("onClose"); $('.surveyTable').load('Home/DetailsSurvey', {id:@Model.Id}); } 
       }); //end of dialog 
       console.log($(this).next('.result')); 
      }, //enf of success function 
      complete: function() { 
       console.log("Complete"); 
      }, 
      error: function() { 
       console.log("Error"); 
      } 
     }); //end of ajax call 
    }); //end o 
-1

использовать .on вместо того, чтобы жить. жить осуждается ..

$('a.addSurvey').on('click', function() { 

} 
+2

Он использует jQuery 1.5.1, который не поддерживает 'on', который был добавлен в 1.7 – jammykam

+0

ah ... ok..sorry my bad ... –

1

Если вы используете live, то вам не нужен первый вызов. Попробуйте preventDefault(), а не return false.

$('a.addSurvey').live('click', function (e) { 

     e.preventDefault(); 
     $.ajax({ 
      url: this.href, 
      type: 'GET', 
      cache: false, 
      context: this, 
      success: function (result) { 
       $(this).next('.result').html(result).dialog({ 
        autoOpen: true, 
        title: 'Anket', 
        width: 500, 
        height: 'auto', 
        modal: true 

       }); //end of dialog 
      console.log($(this).next('.result')); 
      } //enf of success function 

     }); //end of ajax call 

    }); //end of live 
+0

Используя предоставленный код, я могу видеть ответ в консоли, но все же всплывающая ссылка не работает после закрытия всплывающего окна. Что может вызвать этот случай? Должен ли делегировать работу или делегировать работу по-разному? – Eneramo

+0

См. Ответ, только что добавленный @undefined – jammykam

+0

Я думаю, что его ответ удален Я кеширую его, но он заменил контент, а скорее всплывающее окно – Eneramo

-2

метод on() - новая замена для методов bind(), live() и delegate(). Используйте().

+1

Он указал, что использует jQuery 1.5.1. Я уверен, что он не хочет обновляться ради одного звонка. – CodingIntrigue

0

Изменить это:

$(".addSurvey").die().live("click", function (event) { event.stopPropagation(); 

....... остальной код.

+0

благодарю вас за ваш ответ judson, но это не сработает, он не дает никакого ответа на консоли (не стреляя в ajax-код). Он не открывается, но он заменяет содержимое страницы. – Eneramo

+0

Вы пытались уничтожить диалоговое окно закрытия? –

+0

Вы пробовали уничтожить диалог на закрытии? Добавьте закрытое событие в диалог, затем закройте: function() {$ (this) .dialog ('destroy'). Remove(); } –