8

我正在處理的兩難問題是在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參數。

兩個最明顯的事情是:

  1. 設置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'); 
}); 
+0

如果我給你另一種方式來處理jQuery的hashchange事件它colud解決你的問題? – ygaradon

+0

如果你可以修復hashchange加載兩次的問題,它會爲你節省很多時間。 jQuery BBQ文檔提到:「確保綁定到document.ready上的」hashchange「事件,而不是之前,否則它可能會在IE6/7中失敗。」那不是你的問題,是嗎?此外,您可以將您的問題發佈到https://github.com/cowboy/jquery-bbq/issues上的項目GitHub頁面 –

回答

1

關於「有沒有一個標準定義在document.open調用中打開的href的方式?

不,沒有。

相關問題