popstateイベントのwebkitでの奇妙な行為


1、背景:同僚は学校に行って休みを取って、今日彼にh 5 bug 2を修正して、出会った问题:モバイル端末Appはあるホームページを开けて自动的に1つのダイアログボックスを弾いて、このダイアログボックスの现れたのは时宜に合わないで、ページがいくつかの操作をした后に原生の上部の戻るボタンをクリックして更にダイアログボックスを弾いて3、具体的な问题はpopstateがもたらしたのです
4、元のコード:
window.addEventListener('popstate', function() {
var btnArray = ['    ', '    '];
mui.confirm('     ,      ?', '  ', btnArray, function(e) {
if(e.index == 1) {
pushHistory();
} else {
setBack();
}
})
},false);

5、修正後のコード:
window.addEventListener('load', function() {
setTimeout(function() {
window.addEventListener('popstate', function() {
var btnArray = ['    ', '    '];
mui.confirm('     ,      ?', '  ', btnArray, function(e) {
if(e.index == 1) {
pushHistory();
} else {
setBack();
}
})
});
}, 0);
});

6、ひとまず問題を解決し、今後も深く研究する時間がある
しばらく研究する.
7、過去を話す
以前のブラウザ操作ブラウザ履歴は主にhistoryオブジェクトに基づいていました.そのprotoにはback、forward、goなどの関数が継承されていますが、popStateとは何ですか.簡単に言えば、HTML 5にブラウザ履歴を制御するためのapiが追加されました.
8、どう使いますか.
HTML 5の新しいAPIがwindowを拡張しました.historyは、歴史記録点をさらに開放した.現在の履歴ポイントpushState、現在の履歴ポイントreplaceStateの置き換え、リスニング履歴ポイントpopstateを格納できます.
history.pushState(data,title,url); //最初のパラメータdataはstateに与える値である.2番目のパラメータtitleはページのタイトルですが、現在のすべてのブラウザはこのパラメータを無視して、空の文字列を伝えればいいです.3番目のパラメータurlはあなたが行きたいリンクです.
例:history.replaceState("トップページ",",location.href+"#web");
両者の違い:pushStateはhistoryを変更します.だがreplaceStateは変更しないlength
9、穴はありますか.
popstateイベントはwebkitで奇妙です.popstateはHTML 5のHistoryシリーズのイベントですが、webkitでの行為はかなり卵が痛いです.今回はIE 10までFirefox側に立ちましたが、少なくともこちらの方が実用性が高いです.公式のドキュメントにはpopstateの記述も詳細には記載されていませんが、私の論理で判断すると、この商品はwebkitのBUGです.
Html 5というApIは従来のhistoryとは異なり、あるいはこのAPIは「session history entries」である.
注意:Htmlの5種類のHistoryAPIはページをジャンプさせません.アドレスバーと対応するstate属性を操作するだけで、手動で操作します.ブラウザのデフォルトのHistoryは、ブラウザで同じ「履歴スタック」を使用していますが、従来のものです.
この違いに対する認識がwebkitにおける奇妙な行為の原因である.WebkitはHTML 5のHistoryと従来の区別はなく、公式ドキュメントのpopstateの記述によれば、アクセス履歴さえあればpopstateをトリガーします.従来のHistoryでは、ページへのアクセスと生産履歴が同時に行われています.だからwebkitでは、新しいページをリフレッシュしてもアクセスしてもpopstateがトリガーされます.他のブラウザではこのpopstateはHTML 5のHistoryにのみ作用し、従来のHistoryには応答せず、新しいページのリフレッシュやアクセスは言うまでもありません.
原因が見つかりましたが、解決策は?
1.popstateにバインドを遅らせる方法.popstateはページのロードが完了してから間もなくトリガーされるので、settimoutがしばらくしてからイベントをバインドする.popstateの1回目は簡単にwebkitに奪われない.2、ブラウザが再調整すると判断し、webkitがページのロードが完了してから初めてトリガーされるpopstateに対して直接マスクする