2010-04-03 1 views
1
//deep linking 
$.fn.ajaxAnim = function() { 
    $(this).animW(); 
    $(this).html('<div class="load-prog">loading...</div>'); 
} 

$("document").ready(function(){ 
    contM = $('#main-content'); 
    contS = $('#second-content'); 
    $(contM).hide(); 
    $(contM).addClass('hidden'); 
    $(contS).hide(); 
    $(contS).addClass('hidden'); 
    function loadURL(URL) { 
     //console.log("loadURL: " + URL); 
     $.ajax({ url: URL, 
       beforeSend: function(){$(contM).ajaxAnim();}, 
       type: "POST", 
       dataType: 'html', 
       data: {post_loader: 1}, 
       success: function(data){ 
        $(contM).html(data); 
        $('.post-content').initializeScroll(); 
        } 
     }); 
    } 

    // Event handlers 
    $.address.init(function(event) { 
     //console.log("init: " + $('[rel=address:' + event.value + ']').attr('href')); 
    }).change(function(event) { 
     evVal = event.value; 
     if(evVal == '/'){return false;} 
     else{ 
      $.ajax({ url: $('[rel=address:' + evVal + ']').attr('href'), 
        beforeSend: function(){$(contM).ajaxAnim();}, 
        type: "POST", 
        dataType: 'html', 
        data: {post_loader: 1}, 
        success: function(data){ 
         $(contM).html(data); 
         $('.post-content').initializeScroll(); 
      }}); 
     } 
     //console.log("change"); 
    }) 

    $('.update-main a, a.update-main').live('click', function(){ 
     loadURL($(this).attr('href')); 
     return false; 
    }); 

    $(".update-second a, a.update-second").live('click', function() { 
    var link = $(this); 
     $.ajax({ url: link.attr("href"), 
       beforeSend: function(){$(contS).ajaxAnim();}, 
       type: "POST", 
       dataType: 'html', 
       data: {post_loader: 1}, 
       success: function(data){ 
        $(contS).html(data); 
        $('.post-content').initializeScroll(); 
     }}); 
     return false; 
    }); 

}); 

Я использую адреса jquery для обновления содержимого, сохраняя при этом полезный URL-адрес. При нажатии на ссылки в главном навигаторе URL-адрес обновляется правильно, но когда ссылки загружаются динамически с помощью ajax, функция адреса URL-адреса прерывается.Адреса jquery и метод live

Я сделал «щелчки» в прямом эфире, позволяя загружать контент через динамически загруженные ссылки, но я не могу заставить прослушиватель событий в реальном времени жить, но это, кажется, единственный способ сделать эту работу , Является ли мой синтаксис неправильно, если я изменить это:

$.address.change(function(event) { 

к этому:

$.address.live('change', function(event) { 

или же живой метод не работает с этим плагином?

ответ

1

пошел в файл JQuery адрес подключаемого модуля и заменить эту строку:

$.fn.address = function (fn) { 
    $(this).click(function() { 

с этим:

$.fn.address = function (fn) { 
     $(this).live('click',function() { 

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

0

Живой метод работает только с элементами jquery dom. Не с плагинами.

Живой метод определяет, был ли элемент dom динамически добавлен в HTML и привязывает к нему событие. То, что вы пытаетесь сказать, есть: «Если в html появляется плагин« адрес », привяжите к нему событие« change ». Плагин «адрес» не является элементом dom, он не работает.

+0

Это is * not * как работает '.live()'. '.live()' прислушивается к событиям, чтобы пузыриться в DOM, когда событие достигает корня DOM, где работает обработчик событий .live() ', он проверяет, соответствует ли он селектору, с которым связано событие live , если он это делает, то он выполняется. Просто не важно, является ли элемент DOM новым или старым, просто он соответствует селектору. –

+0

ok Я принимал в качестве предположения, что он знал, что live также работает для элементов, уже существующих в dom – fmsf

0

Во-первых, короткий ответ: Нет, это не работает :)

почему часть: .live() отрабатывает события, это не волнует, если они на заказ, и т.д. (в большинстве случаев). Горячее это работает, когда вы звоните .live(), как это, например:

$(".myThing").live('click', functionToRun); 

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

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

+0

Итак, есть ли способ заставить плагин прослушивать событие, вызванное динамически загружаемыми элементами (ссылками)? – Jay

+0

@Jay - До сих пор существует плагин '.liveQuery', который может запускать что-либо на элементе, когда он впервые появляется ...но я не уверен, как ваш адресный плагин работает внутри: http://plugins.jquery.com/project/livequery/ –

+0

Я попробую, но после прочтения описания это похоже на плагин .liveQuery. функциональность как метод .live() в более старых версиях jquery – Jay