2010-04-03 50 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地址和實時方法

我已經做了'點擊'事件,允許通過動態加載的鏈接加載內容,但我似乎無法使地址事件偵聽器生效,但是這似乎是實現此功能的唯一方法。是我錯的語法如果我改變了:

$.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元素。不帶插件。

live方法檢測dom元素是否動態添加到HTML並將事件綁定到它。你試圖說的是:「如果」地址「插件出現在html上,將事件」更改「綁定到它」。 「地址」插件不是一個DOM元素,它不起作用。

+0

這*不是* .live()'如何工作。當一個事件到達事件處理器所在的DOM根目錄時,'.live()'監聽事件向上冒泡,它檢查它是否與事件綁定到的選擇器相匹配,如果它那麼它執行。它根本不在乎DOM元素是新的還是舊的,只是它匹配選擇器。 – 2010-04-03 11:20:44

+0

好吧,我假設他知道現場也適用於dom – fmsf 2010-04-03 11:53:44

0

首先,簡短的回答:不,這是行不通的:)

的原因部分.live()工作過的事件,它沒有,如果他們定製等護理(在大多數情況下, )。熱它的工作原理是,當你調用.live()像這樣的例子:

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

.live()在DOM的等待事件冒泡給它的根創建一個事件處理程序。重要部分:新舊元素冒泡事件的方式與相同,無關緊要。當事件冒泡到達DOM根時,事件處理程序檢查它們的選擇器是否匹配具有該事件的元素,如果是,則執行它們。

有了一個插件,你想嘿新的東西,並在其上運行代碼...正如你可以看到這是非常不同於.live()實際上在內部工作。

+0

中已存在的元素,那麼有沒有辦法讓插件監聽由動態加載的元素(鏈接)觸發的事件? – Jay 2010-04-03 17:15:19

+0

@Jay - 還有一個.liveQuery插件,它可以在元素第一次出現時運行任何東西...但我不確定你的地址插件是如何在內部工作的:http://plugins.jquery.com/project/livequery/ – 2010-04-03 17:36:39

+0

我會嘗試一下,但看完描述後,聽起來像.liveQuery插件提供了相同的功能作爲老版本jQuery中的.live()方法 – Jay 2010-04-03 18:44:35