Я меняю IFRAME src
, чтобы перезагрузить его, его работоспособность и запуск события onload
при загрузке HTML.
Но он добавляет запись в историю, которую я не хочу. Есть ли способ перезагрузить IFRAME и все же не повлиять на историю?
Я меняю IFRAME src
, чтобы перезагрузить его, его работоспособность и запуск события onload
при загрузке HTML.
Но он добавляет запись в историю, которую я не хочу. Есть ли способ перезагрузить IFRAME и все же не повлиять на историю?
Вы можете использовать javascript location.replace
:
window.location.replace('...html');
Заменить текущий документ на один по предоставленному URL. отличие от метода assign() что после использования replace() текущий страница не будет сохранена в сеансе история, то есть пользователь не будет возможность использования кнопки "Назад" для перейдите к нему.
Использование replace() - это только опция с вашими собственными доменными iframes. Он не работает на удаленных сайтах (например: кнопка щебета) и требует определенных знаний, связанных с браузером, для надежного доступа к дочернему окну.
Вместо этого просто удалите элемент iframe и создайте новый в том же месте. Элементы истории создаются только при изменении атрибута src
после того, как он находится в DOM, поэтому обязательно установите его перед добавлением.
Изменить: JDandChips справедливо упоминает, что вы можете удалить из DOM, modifiy и повторно добавить. Построение свежего не требуется.
Как сказал Грег выше, функция .replace() - это как это сделать. Я не могу понять, как ответить на его ответ *, но трюк заключается в ссылке на свойство iFrames contentWindow.
var ifr = document.getElementById("iframeId");
ifr.contentWindow.location.replace("newLocation.html");
* Просто узнал, что мне нужно больше репутации, чтобы прокомментировать ответ.
Альтернативным методом воссоздания iframe будет удаление iframe из DOM, изменение src и последующее добавление его.
Во многом это похоже на предложение replace()
, но у меня были некоторые проблемы, когда я попытался использовать этот подход с History.js и вручную управлять состояниями.
var container = iframe.parent();
iframe.remove();
iframe.attr('src', 'about:blank');
container.append(iframe);
Одним из решений является использование тега object
, а не тега iframe
.
Замените это:
<iframe src="http://yourpage"/>
Таким образом:
<object type="text/html" data="http://yourpage"/>
позволит вам обновить атрибут data
, не затрагивая историю. Это полезно, если вы используете декларативную структуру, такую как React.js
, где вы не должны выполнять какую-либо императивную команду для обновления DOM.
Подробнее о различиях между iframe
и object
: Использование тега Iframe или Object для встраивания веб-страниц в другое
Попробуйте использовать эту функцию для замены старого iframe новым iframe, который скопирован из старого:
function setIFrameSrc(idFrame, url) {
var originalFrame = document.getElementById(idFrame);
var newFrame = document.createElement("iframe");
newFrame.id = originalFrame.getAttribute("id");
newFrame.width = originalFrame.getAttribute("width");
newFrame.height = originalFrame.getAttribute("height");
newFrame.src = url;
var parent = originalFrame.parentNode;
parent.replaceChild(newFrame, originalFrame);
}
Используйте его следующим образом:
setIFrameSrc("idframe", "test.html");
Этот путь не добавит URL-адрес iframe в историю браузера.
Используйте метод replace
, чтобы обойти добавление URL-адреса iframe в историю:
HTML:
<iframe id="myIframe" width="100%" height="400" src="#"></iframe>
JavaScript:
var ifr = document.getElementById('mIframe')
if (ifr) {
ifr.contentWindow.location.replace('http://www.blabla.com')
}
Самое простое и быстрое загрузочное решение
Используйте window.location.replace
, чтобы не обновлять историю при загрузке страницы или фрейма.
Для ссылок это выглядит так:
<a href="#" onclick="YourTarget.location.replace ('http://www.YourPage.com');">
The targeted Link</a>
или
<a href="javascript:YourTarget.location.replace ('http://www.YourPage.com');">
The targeted Link</a>
Но, если вы хотите, чтобы он не действовал со ссылкой, но чтобы действовать автоматически при загрузке фрейма, а затем из iframe вы должны поместить его в раздел тела файла iframe:
onload="window.location.replace ('http://www.YourPage.com');"
Если по какой-то причине onload не загружается в iframe, тогда вместо синтаксиса введите в качестве синтаксиса имя целевого фрейма, например:
onload="YourTarget.location.replace ('http://www.YourPage.com');"
ПРИМЕЧАНИЕ.. Для этого script будут работать все onclick
, onmouseover
, onmouseout
, onload
и href="javascript:"
.
Ответ JDandChips у меня работал на iframe перекрестного происхождения (youtube), вот он в vanilla JS (без JQuery):
const container = iframe.parentElement;
container.removeChild(iframe);
iframe.setAttribute('src', 'about:blank');
container.appendChild(iframe);