在做頁面統計的時候遇到了兩個問題:
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。