2013-07-14 30 views
2

這是一個關於技術性問題的問題,我想在瀏覽器中更深入地瞭解JavaScript。瀏覽器javascript中是否存在持久化DOM這樣的事情?

所以情況是,第一頁上唯一的事情是一個鏈接,可能的一些JS:

<script>something</script> 
<a href="/page2.php">link</a> 

當點擊第二頁的鏈接,可一些JavaScript來「結轉」至第2頁,這樣JS可以在頁面2上運行,而不需要原始標記中的任何腳本?

我想你可以這樣做:

<a onClick="loadXMLDoc();" href="/page2.php">link</a> 

loadXMLDoc函數摘錄:

var xmlhttp; 
xmlhttp=new XMLHttpRequest(); 

xmlhttp.onreadystatechange=function() 
     { 

window.location = "/page2.php"; 

if (xmlhttp.readyState==4 && xmlhttp.status==200) 
     { 
alert('worked'); 

} 
... 
xmlhttp.open("POST","/responsedelay.php",true); 
... 

的想法是讓一個Ajax請求到一個單獨的頁面,上面有一個計時器(在PHP中),幾秒鐘後(比如說10),給出響應。到那個時候,新頁面已經加載,我們希望仍然有JavaScript訪問當前窗口的DOM。唉,這不起作用,不太出人意料,仍然試圖在箱子外面思考!有任何想法嗎?

我猜測唯一的辦法是在page1的上下文中打開page2(即將第2頁元素添加到第1頁),但也許有一種我不知道的新穎方式!

+1

您可能會感興趣[Turbolinks(https://github.com/rails/turbolinks/),剛剛取代了body元素和離開頁面,其所有的JavaScript狀態仍然完好無損。儘管我從未使用過它。 – jpsimons

+1

如果你正在談論實際上離開一個頁面,到達另一個頁面,那麼不,這些腳本需要包含在將使用它們的頁面中。但是你真的需要加載一個新頁面嗎?如果您正在進行XHR請求,爲什麼不直接用響應更新現有頁面呢? –

+0

感謝您的回答,我想調查持久DOM訪問的潛力以及可以採取多大措施,而不一定要加快或提高效率。 – user1166981

回答

1

https://html.spec.whatwg.org/multipage/browsers.html#browsing-context很好地解釋了基本概念。

無論您何時加載頁面,可以通過地址欄加載iframe,或者像您通過操作當前頁面的瀏覽上下文中提到的unique location object

簡化:如果更改位置,則當前頁面DOM被丟棄(技術上已解除引用,因此已準備好在大多數引擎中進行垃圾收集afaik),並由從新位置構建的DOM替換。

但是,您可以保留上下文和window,但切換DOM的部分,這幾乎是window下的所有內容。

在評論中提到的Turbolinks確實如此:請保留window對象和上下文,但替換文檔body

現代瀏覽器讓你編程修改幾乎一切:

  • 當前頁面的標題。
  • 瀏覽器URL輸入欄的內容。
  • 瀏覽器的歷史,所以即使後退/前進按鈕等工作(馬克Pilgrim寫了great piece on this,應進一步澄清)。

總之,你可以保持相同的頁面,但對於用戶來說,感覺就像他們會四處瀏覽。 YouTube就是一個很好的例子:當你從視頻瀏覽視頻時,window被保留,但是body,標題的部分,瀏覽器的URL和標題等都被改變了。

YouTube的好處是,他們沒有重新加載各種視頻解碼器庫等,爲每一個視頻你訪問,而是做你的首次訪問。

的缺點是,你必須真正知道自己在做什麼,錯誤複合迅速,您可以輕鬆地突破重要的用戶流量(後退按鈕等)。

相關問題