выяснил, почему мой код не работал, а также нашел хакерский обходной путь.Но мне все еще интересно узнать, как лучше это сделать -
<script type="text/javascript">
//<![CDATA[
var A = {
"test" : function(loc) {
$.ajax({
..
success : function(res) {
..
**** > history.pushState(null, null, loc);
}
});
}
};
$(document).ready(function() {
window.setTimeout(function() {
window.addEventListener("popstate", function(e) {
++++ > A.test(location.href);
}, false);
}, 1);
});
//]]>
</script>
В приведенном выше коде каждый раз вызывался history.pushState()
(строка помечена **), местоположение былоправильно вставлен в стек.Когда popstate
был вызван в результате нажатия кнопки возврата в браузере (строка отмечена ++++), он работал нормально с первого раза, но при этом он снова вызывал history.pushState()
, выдвигая новый loc в стеке.снова по кругу.Итак, если я перешел из A -> B -> C, у меня были A, B и C в стеке.Когда я нажал назад, я вернулся к B, но при этом я снова толкнул B в стек.Нажатие назад теперь означало, что я снова вернусь к B и попаду в этот цикл.
Я изменил приведенный выше код, как показано ниже, и теперь он работает
<script type="text/javascript">
//<![CDATA[
var A = {
"test" : function(loc, how) {
$.ajax({
..
success : function(res) {
..
if (how !== "back") {
**** > history.pushState(null, null, loc);
}
});
}
};
$(document).ready(function() {
window.setTimeout(function() {
window.addEventListener("popstate", function(e) {
++++ > A.test(location.href, "back");
}, false);
}, 1);
});
//]]>
</script>
Какя могу сделать выше, лучше?