Первый ответ на заданный вами вопрос - что на самом деле происходит с вами.Вы должны внимательно прочитать его и лучше понять.
Вы извлекаете один элемент из истории, затем текущий элемент истории загружается и снова перемещается в историю, следовательно, в истории два раза один и тот же элемент в истории.
Когда вы извлекаете элемент истории и загружаете новый элемент, вы НЕ должны снова помещать этот последний элемент в историю, так как текущий элемент истории - это тот, который вы пытаетесь вставить.
Вы можете проверить последний элемент истории и посмотреть, является ли он тем же, и не нажимать на него, или вы можете передать флаг, чтобы не нажимать на него, когда вы загружаете элемент из-за появления.Последний вариант самый простой.
Например:
$(window).bind("popstate", function (e) {
[...]
ajaxLoadPage(location.href, true); // Notice the second argument
});
var ajaxLoadPage = function (url, isPopState) {
update_flavors_and_collection(url, isPopState);
}
function update_flavors_and_collection(ajax_page, isPopState){
$("#collection_and_filters").load(ajax_page+" #collection_and_filters",
ajax=true, update_history(ajax_page, isPopState));
}
function update_history(url, isPopState){
if (!isPopState && (!history.state || history.state.page!=url))
history.pushState({ "page": url }, '', url);
}