2011-06-14 108 views
3

我有這樣的代碼:阿賈克斯只加載一次

window.onload= function() { 
    window.scrollTo(0, 0.9); 
    if (navigator.standalone) return; 
    for (var i= document.links.length; i-->0;) { 
     document.links[i].onclick= function() { 
      var req= new XMLHttpRequest(); 
      req.onreadystatechange= function() { 
       if (this.readyState!==4) return; 
       document.body.innerHTML= this.responseText; 
      }; 
      req.open('GET', this.href, true); 
      req.send(); 
      return false; 
     }; 
    } 
}; 

它基本上獲取點擊和HREF到當前的身體負荷的一個的href。現在問題是它只能工作一次。一旦內容發生變化,只要我點擊另一個鏈接(在新的頁面上),它就會重定向並且URL會發生變化。然後,阿賈克斯再次工作,因爲我「真正」改變頁面並重置整個事情。

我有點迷失在這裏。我怎樣才能重置我的功能永遠工作? 謝謝,

克里斯托弗

編輯: 好了,所以我想是這樣的:

function ajax(){ 
    if (navigator.standalone) return; 
    for (var i= document.links.length; i-->0;) { 
     document.links[i].onclick= function() { 
      var req= new XMLHttpRequest(); 
      req.onreadystatechange= function() { 
       if (this.readyState!==4) return; 
       document.body.innerHTML= this.responseText; 
      }; 
      req.open('GET', this.href, true); 
      req.send(); 
      ajax(); 
      return false; 
     };} 
    } 



window.onload= function() { 
    window.scrollTo(0, 0.9); 
    ajax(); 

}; 

但無濟於事......調用當它完成了ajax()函數是不夠明顯。任何人都可以幫助我多一點:s。這不是我的專業領域:)。

回答

2

您必須在原始<body>內容與響應爆炸後重新建立「點擊」處理程序。由於響應返回後,舊DOM中的所有內容都消失了,處理程序綁定也消失了。

+0

我試過,但它不工作,你可以看看我的編輯,告訴我是什麼錯誤? :s – cmplieger 2011-06-14 22:03:06

+1

在更新主體「innerHTML」之後,在「readystatechange」處理程序內添加對「ajax()」的調用,並查看是否有幫助。 – Pointy 2011-06-14 22:06:38

+0

哦,還有,其他調用「ajax()」發送請求後,你可以擺脫這一點。 – Pointy 2011-06-14 22:07:14

1

它被緩存嗎?將「?random =」+ Math.random添加到href中。

1

您正在替換整個文檔,包括您綁定AJAX處理程序的鏈接。

window.onload只會在文檔加載時觸發,而不是在ajax調用完成時觸發。

把你的onload處理程序放到一個新的函數中,然後手動調用它,你的就緒狀態改變處理程序。

1

當您設置document.body.innerHTML時,您將替換整個文檔,這意味着您連線的onclick事件不見了。您必須將點擊事件重新綁定到新鏈接。

-2

當您用數據替換正文時,您正在刪除鏈接。

這也是一種建議使用類似jQuery的庫的代碼。在這種情況下,幾乎所有代碼都已經降低到這一點,需要照顧的跨瀏覽器的問題,以及:

$('a').live('click', function() { 
    $.get(this.ref , function(data) { 
     $('body').html(data); 
    }); 
    return false; 
}); 
+0

這是爲什麼downvoted?這解決了這個問題(使用實時),除了建議使代碼更易於使用。 – glortho 2011-06-14 22:01:02

+0

它不回答這個問題,並使用一個巨大的js庫。該錯誤可能是2線以外的解決,所以添加jQuery來解決這個錯誤在我看來是錯誤的。 – cmplieger 2011-06-14 22:04:57

+0

它確實回答了這個問題。 – glortho 2011-06-14 22:36:48