14

ウィンドウに次のstatechangeイベントが設定されています。

History.Adapter.bind(window,'statechange',function(e){ 
 console.log("statechange event occured ");
 //more code
    var newDoc = document.open();
    newDoc.write(file);
    newDoc.close();
});

私は history.js を使用していますが、これは statechange を定期的にバインドするため、この場合は問題ではありませんfile

今、私はこのコード (および他のコード) を外部 js ファイル内に配置し、そのファイル内ですべてのaタグを反復処理し、次のクリック イベントを適用します。

    $(element).on("click",function(e){
    e.preventDefault();
    //more code

    History.pushState({file : file},title, fullHref);


});

クリックするとドキュメントが期待どおりに変更されますが、戻る/進むボタンを使用しようとするとstatechangeイベントが発生しません。

このjsは、読み込み中のファイルにも含まれていることに注意してください。

したがって、私の最初の考えは、ドキュメントは変更されてもウィンドウは変更されないため、イベントは残るというものでした。これは、statechange イベントを複数回適用するため、正しくありません。だから私は一度クッキーを使ってイベントを適用しようとしましたが、それでも同じことをします。

ドキュメントを変更する代わりに、単に jQuery で適用すると.html()、statechange イベントが期待どおりに発生するので、ドキュメントに関連していると思います。

なぜこれが起こるのでしょうか?ドキュメントを変更したときにウィンドウ イベントがどうなるかをもっと理解すれば、この問題を解決できると思います。

試行:

  • popstateまた、通常の History API を介してイベントにバインドしようとしましたが、それでも同じ結果が得られます。pushStatepopstate は起動しませんが、戻るボタンは起動しますが、状態はありません。
  • 私は history.js を使用すべきではないという結論に達しました。そこから問題が発生したのではないかと疑っているので、popstate に関する問題を「解決」しました。まだ詳細情報を探しています
  • を使用してみましたがon、同じ結果です

情報:

  • この例でHistoryを使用しているのは history.js が原因です。通常の history API を使用しても同じ問題が発生します。

私はmdnでそれを読んだ:

{{ gecko_minversion_note("1.9.2", "Gecko 1.9.2 から、document.open() は

プリンシパルをスタックからフェッチする代わりに、URI を使用するドキュメントのプリンシパル。その結果、wrappedJSObject を使用しても、chrome から信頼できないドキュメントに document.write() を呼び出すことはできなくなりました。") }}

よくわかりませんが、この問題に関連している可能性があると思います

4

4 に答える 4

2

最終的に、ドキュメントを変更するだけで、ウィンドウ イベントがドキュメント内にあるときに削除されることがわかりました。

History.js で問題が発生したのは、ドキュメントを変更しているという事実がある時点で問題が発生したためだと思います。

私がしたことは、ネイティブの HTML5 履歴 API を使用popstateし、新しいドキュメントでイベントを再バインドすることでした。

于 2012-11-27T09:13:06.973 に答える
0

ドキュメントをロードするために使用する必要がiframeあり、ドキュメントを簡単に変更できます。次に、次のようなクリックイベントをリッスンできます。

$("#iframe").load(function () {
    $(this.contentWindow).click(function () {
        // do your click events here
    });
});

src属性値を別のドキュメントとして変更すると、iframeがリロードされます。

于 2012-11-26T09:55:46.643 に答える
0

document.open() メソッドでターゲットを設定しようとしましたか ( http://www.w3schools.com/jsref/met_doc_open.aspを参照)。そうでない場合は、実際には空白のウィンドウに書き込みを行っているため、History オブジェクトが失われている可能性があります。

于 2012-11-27T09:09:48.613 に答える
0

要素を LIVE にバインドしようとしましたか?

$(element).click(function(e){
    e.preventDefault();
    //more code
    History.pushState({file : file},title, fullHref);
});

になる

$(element).live('click',function(e){
        e.preventDefault();
        //more code
        History.pushState({file : file},title, fullHref);
    });
于 2012-11-23T16:54:35.187 に答える