我正在處理的兩難問題是在jquery-bbq code中,因爲IE6和IE7不支持hashchange
,所以它們加載兩次頁面以獲得歷史記錄狀態。是否有定義在document.open調用中打開的href的標準方式?
這有負面影響,因爲代碼在服務器端和客戶端都運行兩次。用於創建的IFRAME的方法是這樣的:
if (is_old_ie) {
// Create hidden IFRAME at the end of the body.
iframe = $('<iframe src="javascript:0"/>').hide().appendTo('body')[0].contentWindow;
// Get history by looking at the hidden IFRAME's location.hash.
get_history = function() {
return get_fragment(iframe.document.location.href);
};
// Set a new history item by opening and then closing the IFRAME
// document, *then* setting its location.hash.
set_history = function(hash, history_hash) {
if (hash !== history_hash) {
var doc = iframe.document;
doc.open().close();
doc.location.hash = '#' + hash;
}
};
// Set initial history.
set_history(get_fragment());
}
空白的iframe與javascript:0
一個src被創建。 document.open
方法被調用,它看起來像抓取父窗口的location.href
作爲以.open
打開的頁面的默認值。
我基本上必須修改代碼,以便它不會打開兩次相同的URL,所以我期待重寫默認值並指定一個參數,如?iframe = true。
實施例:
http://example.com/views/step-2?one=two
在IE中,在網頁上面被加載並且然後得到的iframe中再次加載。服務器端代碼執行兩次,但我不希望發生這種情況。
我想追加&iframe=1
到URI,所以我可以防止我的服務器端代碼運行,如果指定iframe
參數。
兩個最明顯的事情是:
- 設置iframe的SRC,但是這可能有負面影響,我敢肯定它的存在是有原因的。請使用
iframe.location.href
並手動將其設置爲href。
如果任何人有過使用iframe黑客入侵的經驗,我將不勝感激一些提示。
編輯:另一個解決方法我想到了將通過IFRAME/AJAX可以加載頁面的iframe之前設置會話變種做了document.open
,創建「iframeloading」的會話變量等於1,和設置IFRAME負荷的負荷事件處理程序將其設置回0,並調整自己的服務器端代碼不執行,如果會話變量被設置爲1。喜歡的東西:
$('<iframe src="/iframe-loading.php"/>').hide().appendTo('body');
document.open().close()
$(document.defaultView).load(function() {
$('<iframe src="iframe-doneloading.php/>').hide().appendTo('body');
});
如果我給你另一種方式來處理jQuery的hashchange事件它colud解決你的問題? – ygaradon
如果你可以修復hashchange加載兩次的問題,它會爲你節省很多時間。 jQuery BBQ文檔提到:「確保綁定到document.ready上的」hashchange「事件,而不是之前,否則它可能會在IE6/7中失敗。」那不是你的問題,是嗎?此外,您可以將您的問題發佈到https://github.com/cowboy/jquery-bbq/issues上的項目GitHub頁面 –