私が扱っているジレンマは、jquery-bbq codeでは、IE6とIE7はhashchange
をサポートしていないため、ヒストリ状態を持つためにページを2度読み込んでいるためです。document.open呼び出しで開くhrefを定義する標準的な方法はありますか?
これは、コードがサーバー側とクライアント側の両方で2回実行されるため、悪影響を及ぼします。
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());
}
javascript:0
のSRCと空白のiframeが作成されます。IFRAMEを作成するために使用される方法はこれです。 document.open
メソッドが呼び出され、.open
で開くページのデフォルトとして、親ウィンドウのlocation.href
を取得したようです。
私は基本的にコードを修正して同じURLを2度開かないようにしなければならないので、デフォルトを上書きして、?iframe = trueのようなパラメータを指定します。
例:IEで
http://example.com/views/step-2?one=two
は、上記のページがロードされ、その後、iframe内に再ロードされます。サーバーサイドのコードはを2回、を2回実行しますが、そのようなことは起こりたくありません。
&iframe=1
をURIに追加して、iframe
パラメータが指定されている場合、サーバー側コードが実行されないようにしたいと考えています。
二つの最も明白なものは以下のとおりです。
- は、IFRAMEのSRCを設定しますが、これはマイナスの影響を与える可能性があり、私はそれが理由でありますかなり確信しています。
document.open.close
の代わりにiframe.location.href
を使用し、手動でhrefに設定します。
誰かがiframeハッキングを経験していれば、私はいくつかのヒントを大いに感謝しています。
EDIT:1に等しい「iframeloading」のセッション変数を作成し、私は、IFRAMEがdocument.open
を行う前に、セッションのVARを設定しIFRAME/AJAXによるページをロードされるだろうと思った別の回避策、および標準はあります」について
$('<iframe src="/iframe-loading.php"/>').hide().appendTo('body');
document.open().close()
$(document.defaultView).load(function() {
$('<iframe src="iframe-doneloading.php/>').hide().appendTo('body');
});
jqueryでハッシュ変更イベントを処理する別の方法を教えても問題が解決しない場合は、 – ygaradon
ハッシュチェンジの読み込みを2回修正することができれば、時間を大幅に節約できます。 jQuery BBQのドキュメントには、「以前はなく、document.readyの「hashchange」イベントにバインドしてください。そうしないと、IE6/7で失敗する可能性があります。それはあなたの問題じゃないですか?また、プロジェクトのGitHubページ(https://github.com/cowboy/jquery-bbq/issues)に問題を投稿することもできます –