Какой лучший способ перезагрузить / обновить iframe?

185

Я хотел бы перезагрузить <iframe> с помощью JavaScript. Лучший способ, который я нашел до сих пор, - установить атрибут iframes src для себя, но это не очень чисто. Любые идеи?

  • 3
    Есть ли причина, по которой установка атрибута src сама по себе не является чистой? Кажется, это единственное решение, которое работает в разных браузерах и доменах.
Теги:
iframe

21 ответ

177
Лучший ответ
document.getElementById('some_frame_id').contentWindow.location.reload();

Будьте осторожны, в Firefox window.frames[] нельзя индексировать по id, а по имени или индексу

  • 87
    Это не будет работать, если оно не в том же домене.
  • 20
    На самом деле, этот подход не работает для меня в Chrome. Не было свойства 'contentWindow'. Хотя можно было использовать document.getElementById ('some_frame_id'). Location.reload (); Метод, который работал как для FF, так и для Chrome, был document.getElementById ('iframeid'). Src = document.getElementById ('iframeid'). Src
Показать ещё 13 комментариев
147
document.getElementById('iframeid').src = document.getElementById('iframeid').src

Он перезагрузит iframe, даже через домены! Протестировано с помощью IE7/8, Firefox и Chrome.

  • 63
    document.getElementById('iframeid').src += ''; также работает: jsfiddle.net/Daniel_Hug/dWm5k
  • 3
    Раньше он работал с Chrome, но теперь перестал работать с Chrome 19 ...
Показать ещё 7 комментариев
55

Если вы используете jQuery, это работает:

$('#your_iframe').attr('src', $('#your_iframe').attr('src'));

Я надеюсь, что это не слишком уродливо для stackoverflow.

  • 6
    Это без jQuery: var iframe = document.getElementById("your_iframe"); iframe.src = src;
  • 0
    Пожалуйста, обратите внимание всем будущим людям, что это (и простое решение js) лучше всего использовать, поскольку оно кроссплатформенное и работает в разных доменах.
Показать ещё 2 комментария
12
window.frames['frameNameOrIndex'].location.reload();
  • 9
    это работает, только если у вас есть тот же домен для iframe
5

Добавить пустое пространство также перезагружает iFrame автоматически.

document.getElementById('id').src += '';
5

Из-за той же политики происхождения, это не сработает при изменении iframe, указывающего на другой домен. Если вы настроите таргетинг на более новые браузеры, рассмотрите возможность использования обмена сообщениями HTML5 с несколькими документами. Вы просматриваете браузеры, которые поддерживают эту функцию здесь: http://caniuse.com/#feat=x-doc-messaging.

Если вы не можете использовать функциональность HTML5, вы можете следовать следующим трюкам: http://softwareas.com/cross-domain-communication-with-iframes. Эта запись в блоге также неплохо помогает определить проблему.

3

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

var url = iframeEl.src;
iframeEl.src = 'about:blank';
setTimeout(function() {
    iframeEl.src = url;
}, 10);
  • 0
    Я только что протестировал тот же подход, но без setTimeout - и он работал для меня. на самом деле, просто iframe.setAttribute ('src', iframe.getAttribute ('src'))
3

для нового URL

location.assign("http:google.com");

Метод assign() загружает новый документ.

перезарядка

location.reload();

Метод reload() используется для перезагрузки текущего документа.

3

Уточнение позиции yajra... Мне нравится эта мысль, но ненавижу идею обнаружения браузера.

Я скорее возьму ppk-взгляд на использование обнаружения объекта вместо обнаружения браузера, (http://www.quirksmode.org/js/support.html), потому что тогда вы на самом деле проверяете возможности браузера и действуете соответственно, а не то, что, по вашему мнению, может быть в то время браузером. Кроме того, не требуется так много уродливого разбора синтаксического кода браузера, и не исключает отлично работающих браузеров, о которых вы ничего не знаете.

Итак, вместо того, чтобы смотреть на navigator.AppName, почему бы не сделать что-то подобное, фактически тестируя элементы, которые вы используете? (Вы можете использовать try {} блоки, если хотите стать еще более привлекательными, но это сработало для меня.)

function reload_message_frame() {
    var frame_id = 'live_message_frame';
    if(window.document.getElementById(frame_id).location ) {  
        window.document.getElementById(frame_id).location.reload(true);
    } else if (window.document.getElementById(frame_id).contentWindow.location ) {
        window.document.getElementById(frame_id).contentWindow.location.reload(true);
    } else if (window.document.getElementById(frame_id).src){
        window.document.getElementById(frame_id).src = window.document.getElementById(frame_id).src;
    } else {
        // fail condition, respond as appropriate, or do nothing
        alert("Sorry, unable to reload that frame!");
    }
}

Таким образом, вы можете попробовать как можно больше различных перестановок, как вам нравится или необходимо, без ошибок javascript и делать что-то разумное, если все остальное терпит неудачу. Это немного больше, чтобы проверить свои объекты перед их использованием, но IMO делает лучший и более безопасный код.

Работала для меня в IE8, Firefox (15.0.1), Chrome (21.0.1180.89 м) и Opera (12.0.2) в Windows.

Возможно, я мог бы сделать еще лучше, фактически тестируя функцию перезагрузки, но это достаточно для меня прямо сейчас.:)

2

Если вы используете Jquery, тогда есть один код строки.

$('#iframeID',window.parent.document).attr('src',$('#iframeID',window.parent.document).attr('src'));

и если вы работаете с одним и тем же родителем, то

$('#iframeID',parent.document).attr('src',$('#iframeID',parent.document).attr('src'));
2

Рассматривали ли вы добавление к URL-адресу бессмысленного параметра строки запроса?

<iframe src="myBaseURL.com/something/" />

<script>
var i = document.getElementsById("iframe")[0],
    src = i.src,
    number = 1;

//For an update
i.src = src + "?ignoreMe=" + number;
number++;
</script>

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

2

Я только что столкнулся с этим в хроме, и единственное, что работало, это удаление и замена iframe. Пример:

$(".iframe_wrapper").find("iframe").remove();
var iframe = $('<iframe src="' + src + '" frameborder="0"></iframe>');
$.find(".iframe_wrapper").append(iframe);

Довольно простой, не описанный в других ответах.

2

Используйте перезагрузку для IE и установите src для других браузеров. (перезагрузка не работает на FF) проверены на IE 7,8,9 и Firefox

if(navigator.appName == "Microsoft Internet Explorer"){
    window.document.getElementById('iframeId').contentWindow.location.reload(true);
}else {
    window.document.getElementById('iframeId').src = window.document.getElementById('iframeId').src;
}
  • 0
    Мне показалось, что это нормально работает на Firefox.
2

В IE8 с использованием .Net установка iframe.src в первый раз в порядке, но второй раз iframe.src не поднимает page_load страницы iframed. Чтобы решить эту проблему, я использовал iframe.contentDocument.location.href = "NewUrl.htm".

Откройте его при использовании jQuery thickBox и попытайтесь повторно открыть ту же страницу в толстопанельном iframe. Затем он просто показал более раннюю страницу, которая была открыта.

  • 0
    ты только что спас мой бекон с этим - здорово
  • 0
    в любое время яя ..
1

Если все вышеперечисленное не работает для вас:

window.location.reload();

Это почему-то обновило мой iframe вместо всего script. Может быть, потому, что он помещается в самом кадре, а все эти решения getElemntById работают, когда вы пытаетесь обновить кадр из другого фрейма?

Или я не понимаю это полностью и болтаю, так или иначе, это работало для меня как шарм:)

0

Теперь, чтобы выполнить эту работу на chrome 66, попробуйте следующее:

const reloadIframe = (iframeId) => {
    const el = document.getElementById(iframeId)
    const src = el.src
    el.src = ''
    setTimeout(() => {
        el.src = src
    })
}
0

Другое решение.

const frame = document.getElementById("my-iframe");

frame.parentNode.replaceChild(frame.cloneNode(), frame);
  • 0
    Недостатком этого является изменение дерева DOM корневого документа, что приведет к перерисовке. Я использовал var url = ifr.src; ifr.src = null; ifr.src = url;
  • 0
    Я думаю, что перезагрузка iframe всегда вызывает перерисовку независимо от используемого кода.
0

Для целей отладки можно открыть консоль, изменив контекст выполнения на фрейм, который он хочет обновить, и выполните document.location.reload()

0

Использование self.location.reload() перезагрузит iframe.

<iframe src="https://vivekkumar11432.wordpress.com/" width="300" height="300"></iframe>
<br><br>
<input type='button' value="Reload"  onclick="self.location.reload();" />
0

Если вы попробовали все другие предложения и не могли заставить их работать (например, я не мог), здесь вы можете попробовать, что может быть полезно.

HTML

<a class="refresh-this-frame" rel="#iframe-id-0">Refresh</a>
<iframe src="" id="iframe-id-0"></iframe>

JS

$('.refresh-this-frame').click(function() {
    var thisIframe = $(this).attr('rel');
    var currentState = $(thisIframe).attr('src');
    function removeSrc() {
        $(thisIframe).attr('src', '');
    }
    setTimeout (removeSrc, 100);
    function replaceSrc() {
        $(thisIframe).attr('src', currentState);
    }
    setTimeout (replaceSrc, 200);
});

Сначала я попытался сэкономить время на RWD и кросс-браузерном тестировании. Я хотел создать быструю страницу, в которой размещалась куча iframe, организованная в группы, которые я бы показывал/скрывал по своему усмотрению. Логически вы хотите иметь возможность легко и быстро обновлять любой данный фрейм.

Я должен отметить, что проект, над которым я сейчас работаю, тот, который используется на этом тестовом посте, - это сайт с одной страницей с индексированными местоположениями (например, index.html # home). Возможно, это имело какое-то отношение к тому, почему я не смог получить какие-либо другие решения для обновления моего конкретного фрейма.

Сказав это, я знаю, что это не самая чистая вещь в мире, но она работает для моих целей. Надеюсь, это поможет кому-то. Теперь, если бы я мог понять, как сохранить iframe от прокрутки родительской страницы каждый раз, когда анимация внутри iframe...

EDIT: Я понял, что это не "обновляет" iframe, как я надеялся. Однако он перезагрузит исходный источник iframe. Все еще не могу понять, почему я не мог получить какие-либо другие варианты работы.

UPDATE: Причина, по которой я не мог получить какие-либо другие методы для работы, заключается в том, что я тестировал их в Chrome, а Chrome не разрешает вам получать доступ к содержимому iframe (Объяснение: Это вероятно, что будущие выпуски Chrome поддерживают contentWindow/contentDocument, когда iFrame загружает локальный файл html из локального html файла?), если он не происходит из того же места (насколько я понимаю). При дальнейшем тестировании я также не могу получить доступ к contentWindow в FF.

ИЗМЕНЕННЫЙ JS

$('.refresh-this-frame').click(function() {
    var targetID = $(this).attr('rel');
    var targetSrc = $(targetID).attr('src');
    var cleanID = targetID.replace("#","");     
    var chromeTest = ( navigator.userAgent.match(/Chrome/g) ? true : false );
    var FFTest = ( navigator.userAgent.match(/Firefox/g) ? true : false );      
    if (chromeTest == true) {
        function removeSrc() {
            $(targetID).attr('src', '');
        }
        setTimeout (removeSrc, 100);
        function replaceSrc() {
            $(targetID).attr('src', targetSrc);
        }
        setTimeout (replaceSrc, 200);
    }
    if (FFTest == true) {
        function removeSrc() {
            $(targetID).attr('src', '');
        }
        setTimeout (removeSrc, 100);
        function replaceSrc() {
            $(targetID).attr('src', targetSrc);
        }
        setTimeout (replaceSrc, 200);
    }       
    if (chromeTest == false && FFTest == false) {
        var targetLoc = (document.getElementById(cleanID).contentWindow.location).toString();
        function removeSrc() {
            $(targetID).attr('src', '');
        }
        setTimeout (removeSrc, 100);
        function replaceSrc2() {
            $(targetID).attr('src', targetLoc);
        }
        setTimeout (replaceSrc2, 200);
    }
});
0
<script type="text/javascript">
  top.frames['DetailFrame'].location = top.frames['DetailFrame'].location;
</script> 
  • 1
    Не тот выбор, которым я бы воспользовался, но, думаю, это подойдет С некоторым дополнительным кодом, который вы могли бы добавить.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню