iframe中的歷史記錄問題匯總及解決方案[轉]


在做頁面統計的時候遇到了兩個問題:

1.包含iframe的頁面,在IE下按后退按鈕不能刷新主頁面。隱藏Iframe的src是統計程序的url,每點一次后退,就會發出一次頁面加載時間請求。

2.由js動態創建的img標簽會發出兩個http請求,第一個請求在發出后就被aborted,但實際上統計腳本收到了該請求,造成數據重復入庫。

針對第一個問題,懷疑是IE針對iframe處理同firefox不同。后來查資料才知道,IE會把iframe訪問過的頁面也記錄進history,點擊后退按鈕時,其實是重新載入iframe中的url,因此表面上看起來是主頁面不能刷新,其實隱藏的iframe是刷新了的,因此會造成點后退按鈕發出不希望的請求。

針對第二個問題,IE處理動態創建的img,在設置img.src時會發出圖片請求,因此把img.src放到appenChild方法之后設置就可以避免這種情況。

附iframe在不同瀏覽器下的表現:

AJAX教程: 兩種iframe的區別 (怎樣控制瀏覽器的history)

瀏覽器history記錄了我們訪問的頁面。當點擊瀏覽器的后退或者前進按鈕時候,就會在history中記錄頁面之間進行跳轉。有時候,因為各種原因,程序員需要控制什么頁面被放進瀏覽器的history中,哪些頁面不放進去。把這種針對history的控制當做一種原型來看,它可以被用在更加復雜的AJAX和DHTML應用中。在這里,我會講述兩類iframe,當你面臨AJAX設計問題或者遇到這兩類iframe引起的奇怪bug時,這些知識將會非常有用。

有兩類iframe,一種是在HTML文檔中靜態存在的iframe:


另外一種是在頁面加載后動態創建的iframe:


好了,我們已經知道有兩類iframe,但是誰在意這個事實呢?但是,不同的瀏覽器在是否將他們放入history的決策上有完全不同的表現!

下面我們來看看真相。
Firefox:

如果iframe是靜態存在在HTML中時,iframe的任何src或者location改變都會被記錄到瀏覽器history中。

如果iframe是在頁面加載完成后動態創建的,那么iframe的任何src或者location改變都不會被記錄到瀏覽器history中。

IE:

兩種iframe的src或者location改變都會被記錄到瀏覽器history中。

Safari:

兩種iframe的src或者location改變都不會被記錄。

通過下面兩個例子可以看到我們的結論。兩個例子我們都會動態改變iframe的location,分別加載四個不同的頁面。

下面我們看兩個例子

在第一例中,iframe是在HTML頁面中靜態存在的,當改變幾次iframe的location后,在IE和Firefox的history中都記錄了這幾個頁面地址。點擊后退和前進按鈕時,iframe中加載的頁面會改變。
在第二例中,iframe是頁面加載完成后,由js動態創建的。Firefox下只有主頁面在瀏覽器history中,而IE下不僅主頁面,而且iframe加載的所有頁面都在history中。

注:當一個iframe在HTML頁面中靜態存在時,並且該iframe有初始化了的src屬性,如

那么改src指向的url不會被記錄在瀏覽器history中,只有iframe的src或location被成功改變后指向的url才會被記錄。

因此,我們可以使用這兩類iframe的特殊行為來實現我們想要的效果。比如,可以讓通過CSS將iframe設置為不可見,然后選擇這兩種iframe中的一種來決定是否讓瀏覽器記錄iframe加載過的頁面url。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM