Браузер обратно действует на вложенный iframe перед самой страницей - есть ли способ избежать этого?

У меня есть страница с динамическими данными, загруженными некоторым ajax и большим количеством javascript.

страница содержит список, из которого пользователь может выбирать, и каждое выбранное значение загружает новые данные на страницу.

Одним из этих элементов данных является URL-адрес, предоставленный iframe.

Я использую jQuery BBQ: кнопка "Назад" и библиотека запросов для имитации поведения браузера.

Все работает хорошо, за исключением того факта, что когда я нажимаю кнопку «Назад» в первый раз, iframe возвращается в свое предыдущее местоположение, а затем мне нужно снова щелкнуть, чтобы страница вернулась.

Есть ли способ отключить обратное поведение iframe?


person kfiroo    schedule 11.02.2010    source источник
comment
Меня интересует ответ на это; мое понимание (возможно, неправильное) заключается в том, что страница практически не контролирует действия браузера с помощью кнопки «Назад». Или кнопку вперед, если на то пошло.   -  person Pointy    schedule 11.02.2010


Ответы (6)


arrow_upward
71
arrow_downward

Я нашел ответ на свою проблему, думаю, это может быть полезно для других.

Проблема заключалась в том, как я назначал новые URL-адреса своему Iframe, я использовал Jquery, поэтому это выглядело примерно так:

$('#myIFrame').attr('src',newUrl);

При назначении URL-адреса таким образом он добавляет новую запись в список посещенных URL-адресов браузера для возврата.
Это было нежелательным поведением, поэтому после некоторого поиска в Google я обнаружил, что вы можете назначить новый URL-адрес для Объект iframe без добавления его в «бэк-список», это выглядит так:

var frame = $('#myIFrame')[0];
frame.contentWindow.location.replace(newUrl);

Таким образом, моя кнопка «Назад» ведет себя точно так, как ожидалось.

Кстати, я получил ответ от здесь.

Надеюсь, это было полезно для вас, как это было для меня.

person kfiroo    schedule 13.02.2010
comment
Спасибо, это была именно та проблема, которая у меня была. Действительно помогло. - person dev; 10.01.2013
comment
Это работает только для iframe с тем же доменом, что и веб-сайт, на который он встроен. Не будет работать для междоменных фреймов. - person tjmehta; 07.03.2013
comment
Как я могу использовать этот код, когда я отправляю форму с target=myIFrame, чтобы указать на iframe?? - person ShivarajRH; 02.12.2013
comment
Вы спасли мой день, мой хороший сэр! Вау - Какой странный опыт! - person Chilipote; 16.10.2020
comment
Ты спас мой день бро!!! - person perezmlal; 05.03.2021

arrow_upward
5
arrow_downward

Принятый ответ, похоже, не работает, если вы пытаетесь установить междоменный URL-адрес для IFrame. В качестве обходного пути я отсоединил IFrame от DOM перед установкой src (используя jQuery).

// remove IFrame from DOM before setting source,
// to prevent adding entries to browser history
var newUrl = 'http://www.example.com';
var iFrame = $('#myIFrame');
var iFrameParent = iFrame.parent();

iFrame.remove();
iFrame.attr('src', newUrl);
iFrameParent.append(iFrame);
person Georg Patscheider    schedule 24.08.2017
comment
Холли Корова, ты гений! - person Daphoque; 24.06.2021

arrow_upward
1
arrow_downward

Я предлагаю вам создать гиперссылку в вашем iframe. назовите его «Назад» и поместите href как javascript:history.back(-1) Это лучшее, что вы можете сделать, я думаю.

person Mateen Kadwaikar    schedule 27.08.2014

arrow_upward
0
arrow_downward

В основном вам нужно предотвратить добавление новых записей истории в iframe, history.replaceState, представленный в HTML5, будет работать в большинстве случаев.

history.pushState(state, title, url);
person Igor G.    schedule 12.04.2016
comment
Внутри iframe? Как мне сказать iframe сделать это, например, если src="http:/google.com"? - person trusktr; 10.01.2018

arrow_upward
0
arrow_downward

Я управляю междоменным iframe внутри модального окна начальной загрузки, единственное решение, которое работает для меня, — это поместить следующий код в заголовок каждой страницы iframe:

    history.pushState(null, null, location.href);
    window.onpopstate = function () {
      history.go(1);
    };

Это не будет работать для всех, так как вам нужно контролировать содержимое iframe, кроме того, это нарушает цепочку истории родительского окна.

person Daphoque    schedule 14.09.2020

arrow_upward
-4
arrow_downward

Нет, это полностью зависит от браузера.

person jumpin 88    schedule 13.02.2010