2012-03-22 82 views
0

我正在做一些測試,試圖學習一些關於延期的更多信息。所以,我做了一個Ajax網站導航:對象超出了延期範圍?

$('ul#nav a').on('click', function(e){   
    var hash = $(this).attr('href'); 
    check(hash).fail(function(){ 
     e.preventDefault(); 
    }); 
}); 
function check(hash){ 
    var deferred = $.Deferred(); 
    if (!hash) {     
     hash = window.location.hash; 
    } 
    if (!hash) { 
     var url = window.location.pathname; 
     var file = url.substring(url.lastIndexOf('/')+1); 
     hash = file.replace(extension,''); 
    } 
    if (hash !== prev_url){ 
     prev_url= hash; 
     loadPage(hash).done(
      function(data){ 
       var html = $(data); 
       var filtered= html.find('#content'); 
       content.html(filtrado.html()); 
       deferred.resolve(); 
      } 
     ).fail(function(){ // Url doesn't exist 
      content.html('<p>Page does not exist!</p>'); 
      deferred.reject();     
     }); 
    } 
    return deferred; 
} 

一切似乎除了check.fail功能是工作的罰款有事件對象進不去,所以我無法阻止頁面的變化,因此,它失敗。

+0

我們可以看到'loadPage()'嗎? – 2012-03-22 13:50:46

回答

3

fail回調關閉e(它是一個閉包),所以它肯定應該有訪問權限(或者你會得到一個錯誤?)。

問題很可能是在執行fail回調(稍後因爲您正在執行Ajax請求,即異步),則事件處理已完成。調用e.preventDefault()不再有任何效果。


你需要做e.preventDefault();點擊後直接和承擔的頁面不存在,直到異步延遲事件告訴你,否則。

$('ul#nav a').on('click', function(e){ 
    e.preventDefault(); // Assume bad link until otherwise proven 
    var hash = $(this).attr('href'); 
    check(hash).done(function(){ 
     window.location.href = hash; // Good hash, let's go to that 
    }); 
}); 
+0

你是對的!我只需要在另一個方向思考。 – 2012-03-22 14:00:13