History API pushState () создает две записи

Как указано в заголовке, когда я использую pushState () для изменения истории, он по какой-то причине добавляет мою запись в стек дважды, даже если щелкнул только один раз. Итак, когда я пытаюсь вернуться назад с помощью кнопки «Назад», я получаю всплывающее сообщение только при каждом втором нажатии кнопки. И когда я регистрирую состояние в консоли, каждый раз, когда я получаю «всплывающее сообщение», он показывает «ноль».

Вот как выглядит история:

http://example.com/foo/bar/question/8/
http://example.com/foo/bar/question/8/
http://example.com/foo/bar/question/3/
http://example.com/foo/bar/question/3/
http://example.com/foo/bar/question/27/
http://example.com/foo/bar/question/27/

Я пытаюсь перезагрузить iframe (и изменить текст h1) при щелчке по ссылке, не перезагружая всю страницу, но при этом сохранив историю, которую можно перемещать и добавлять в закладки (это слово?) ... Похоже, это должно быть будь простым, и я просмотрел примеры на MDN и других руководствах, но безрезультатно.

Мой код ниже. Я уверен, что делаю что-то совершенно не так, но любая помощь / понимание будут очень благодарны!

$(".vidlinks a").on('click', function(e) {
    var frsrc = 'https://player.vimeo.com'+$(this).attr('data-iframe')+'?title=0&byline=0&portrait=0&badge=0&autopause=0&player_id=0&autoplay=1',
        targetUrl = $(this).attr('href'),
        pgtitle = $(this).attr('title'),
        obj = {url:targetUrl,ttl:pgtitle};
        $("iframe").attr('src', frsrc );
        $(".vidtitle h1").fadeOut("fast", function() {
            $(this).text(pgtitle);
        });
        $(".vidtitle h1").fadeIn("fast");

        window.history.pushState(obj, document.title, targetUrl);
        return false;
    });

   window.onpopstate = function(e) {
        $(".vidtitle h1").fadeOut("fast", function() {
            $(this).text(e.state.ttl);
        });
        $(".vidtitle h1").fadeIn("fast");
   }

РЕДАКТИРОВАТЬ: Я также пробовал использовать replaceState () вместо pushState (). Такой способ устранил проблему двойной записи, но использование кнопки «Назад» не меняет состояние в браузере с использованием этого метода. Это было протестировано в Chrome, Safari и FF.

РЕДАКТИРОВАТЬ РЕДАКТИРОВАТЬ: Как ни странно, если я полностью закомментирую оператор pushState () и нажму кнопку «Назад», iframe перезагрузится к предыдущему видео, но больше ничего не изменится.


3 (РЕДАКТИРОВАТЬ): Вот код iframe ...

<iframe src="https://player.vimeo.com/video/VIDEOID?title=0&amp;byline=0&amp;portrait=0&amp;badge=0&amp;autopause=0&amp;player_id=0&amp;autoplay=1" width="1920" height="1080" frameborder="0" title="THETITLE" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>

VIDEOID и THETITLE - это просто строки, изначально переданные из PHP.

На этот раз я запустил console.log, и вот что он делает. Я щелкаю ссылку (один раз), которая передает новый iframe src в iframe, но при этом создаются две записи в истории. При первом нажатии кнопки «Назад» окно iframe перезагружается к предыдущему видео, но без всплывающего сообщения. При втором нажатии кнопки «назад» я получаю всплывающее сообщение со всеми свойствами.


person Spartacus    schedule 28.09.2016    source источник
comment
пробовали ли вы это использовать e.preventDefault() .. return false делает то же самое, но стоит спросить   -  person charlietfl    schedule 28.09.2016
comment
да. Это было первое, что я сделал, потом поменял на return false   -  person Spartacus    schedule 28.09.2016
comment
Кажется, ваш код мне подходит. Можете ли вы поставить debugger или console.log под window.history.pushState, чтобы подтвердить, что push вызывается только один раз за клик. Если возможно, не могли бы вы опубликовать большую часть кода вместе с HTML.   -  person Gökhan Kurt    schedule 01.10.2016
comment
@Spartacus, вы можете добавить HTML-код, который вы используете? Или, если возможно, добавьте полный рабочий jsfiddle, чтобы продемонстрировать проблему.   -  person Dekel    schedule 01.10.2016
comment
Может быть, что-то связано с DOM или мышью!   -  person vijayst    schedule 03.10.2016
comment
Я отредактировал свой ответ, добавив новую информацию. Спасибо!   -  person Spartacus    schedule 03.10.2016


Ответы (1)


При изменении src iframe добавляются два pushState. Уловка / хак / обходной путь состоит в том, чтобы удалить текущий iframe, создать новый фрагмент iframe и вставить его. Затем вызовите ваш pushState.

Источник: Обновление iframe, история и URL. Затем заставить его работать с кнопкой "Назад"

person Eric N    schedule 03.10.2016
comment
Вот и все ... Черт, я рвал волосы, думая, что что-то не так запрограммировал. Спасибо! - person Spartacus; 04.10.2016
comment
Ага, это первое предложение; спасатель. Удаление iframe устраняет проблемы с двойным состоянием, которые у меня были в связи с этим! - person Scott Byers; 23.06.2020