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

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

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

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

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

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

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


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


Ответы (6)


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

Проблема заключалась в том, как я назначал новые 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

Принятый ответ, похоже, не работает, если вы пытаетесь установить междоменный 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

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

person Mateen Kadwaikar    schedule 27.08.2014

В основном вам нужно предотвратить добавление новых записей истории в 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

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

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

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

person Daphoque    schedule 14.09.2020

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

person jumpin 88    schedule 13.02.2010