Перезавантажте iframe за допомогою jQuery


151

У мене є два iframe на сторінці, і один вносить зміни в інші, але інший iframe не показує зміни, поки я не оновлю. Чи є простий спосіб оновити цей iframe за допомогою jQuery?

<div class="project">
  <iframe id="currentElement" class="myframe" name="myframe" src="http://somesite.com/something/new"></iframe>
</div>

3
Чи є документ iframe для іншого домену?
Pekka

Чи маєте ви доступ до коду сайту, який з’являється в iFrame?
Метт Есбері

Показати більше коду - HTML для обох iFrames, а також код javascript, який ви використовуєте для внесення змін. Важко зрозуміти, у чому проблема бачиться лише те, що ти включив до цього часу.
Бен Лі

У мене є доступ до коду "Так", і iframe знаходиться на іншому домені
Matt Elhotiby

@Matt, кадри не можуть вносити зміни до вмісту кадрів в інших доменах. Приклади того, як обійти це обмеження сценаріїв міждоменного сайту, див. Це: softwareas.com/cross-domain-communication-with-iframes
Ben Lee

Відповіді:


174

Якщо рамка iframe не була в іншому домені, ви можете зробити щось подібне:

document.getElementById(FrameID).contentDocument.location.reload(true);

Але оскільки рамка iframe знаходиться на іншому домені, вам буде відмовлено у доступі до contentDocumentвласності iframe політикою того ж походження .

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

// hackishly force iframe to reload
var iframe = document.getElementById(FrameId);
iframe.src = iframe.src;

Якщо ви намагаєтеся перезавантажити IFRAME з іншого фрейма, ви не пощастило, що це НЕ можливо.


19
Його питання полягав у тому, як досягти цього за допомогою jQuery - не Javascript. Див. Пост Симе Відаса нижче для правильної відповіді jQuery.
FastTrack

2
Сценарій не працює в моєму IE9 (не перевіряйте іншу версію). Зміна contentDocument на contentWindow працює над IE9. document.getElementById(FrameID).contentWindow.location.reload(true);
Хань Він

3
Це не спрацювало для мене, однак я зробив щось на кшталт iframe.contentDocument.location=iframe.src; того, що працювало чудово
глітхім

3
Цей Jquery спрацював як шарм для мене:$('#map_iframe').attr('src', $('#map_iframe').attr('src'));
Topher Hunt

234
$( '#iframe' ).attr( 'src', function ( i, val ) { return val; });

2
+1 за те, що має лише одне посилання на ідентифікатор, менше шансів змінити одне, але забути інше
Matthew Lock

1
@NicolaeSurdu Також це:(function (elem) { elem.src = elem.src; }($('#iframe')[0]));
Šime Vidas

1
Для перезавантаження одного iframe з іншого змініть на: $ ('# iframe', window.parent.document) .attr ('src', функція (i, val) {return val;});
Тілліто

У Internet Explorer рішення JavaScript, як-от document.getElementById(FrameID).contentWindow.location.reload(true);, не працюють належним чином. Ця відповідь працює краще.
BeyazKaplan

55

ви також можете використовувати jquery. Це те саме, що запропонував Алекс просто за допомогою JQuery:

 $('#currentElement').attr("src", $('#currentElement').attr("src"));

3
Перевагою цього рішення є читабельність. Хоча це не так ефективно, як відповідь Відаса, очевидно, що відбувається.
Роберт Еггінтон

Я погоджуюся, я також вважаю за краще віддавати перевагу читанню цього рішення
Йонатан Наор

var f = $('#iframeX') ; f.attr( 'src', f.attr( 'src' ))може бути більш надійним у підтримці та читанні
Андреас Дітріх

9

Перезавантажте iframe за допомогою jQuery

зробити посилання всередині iframe дозволяє сказати з id = "reload", а потім використовувати наступний код

$('#reload').click(function() {
    document.location.reload();
});

і ви добре перейти з усіма браузерами.

Перезавантажте iframe за допомогою HTML (не вимагає Java Script req.)

У ньому є більш просте рішення: яке працює без javaScript в (FF, Webkit)

просто зробіть якір усередині вашого рамки

   <a href="#" target="_SELF">Refresh Comments</a>

Коли ви натискаєте на цей якір, він просто оновить ваш кадр

Але якщо у вас є параметр, надішліть свій iframe, зробіть це наступним чином.

  <a id="comnt-limit" href="?id=<?= $page_id?>" target="_SELF">Refresh Comments</a>

не потрібен жоден URL-адресу сторінки, оскільки -> target = "_ SELF" зроби це за вас


9

за допомогою jquery ви можете використовувати це:

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

Це рішення, якщо ви хочете оновити поточний iframe, де ми є. Thx багато!
DaemonHK

5

Просто відповідь відповіді Алекса, але з jQuery

var currSrc = $("#currentElement").attr("src");
$("#currentElement").attr("src", currSrc);


3

Я впевнений, що всі наведені вище приклади лише перезавантажують кадр iframe з його оригінальним src, а не його поточною URL-адресою.

$('#frameId').attr('src', function () { return $(this).contents().get(0).location.href });

Це потрібно перезавантажити, використовуючи поточний URL.


2

Якщо ви користуєтеся міждоменним доступом, просто повернення src до того ж URL-адреси не завжди може викликати перезавантаження, навіть якщо змінився хеш місця розташування.

Я зіткнувся з цією проблемою під час створення вручну кадрів кнопки Twitter, які не оновлюються, коли я оновлював адреси URL.

Кнопки, як Twitter, мають форму: .../tweet_button.html#&_version=2&count=none&etc=...

Оскільки Twitter використовує фрагмент документа для URL-адреси, зміна хешу / фрагмента не перезавантажила джерело, а цілі кнопок не відображали мій новий вміст, завантажений ajax.

Ви можете додати параметр рядка запиту для примусового перезавантаження (наприклад: "?_=" + Math.random() але це втратить пропускну здатність, особливо в цьому прикладі, коли підхід Twitter особливо намагався включити кешування.

Щоб перезавантажити щось, що змінюється лише за допомогою хеш-тегів, потрібно видалити елемент або змінити його src, дочекатися виходу потоку, а потім призначити його назад. Якщо сторінка все ще є кешованою, це не повинно вимагати звернення до мережі, але викликає перезавантаження кадру.

 var old = iframe.src;
 iframe.src = '';
 setTimeout( function () {
    iframe.src = old;
 }, 0);

Оновлення : Використовуючи цей підхід створює небажані предмети історії. Натомість щоразу видаляйте та відтворюйте елемент iframe, завдяки чому ця кнопка назад () працює як слід. Також приємно не мати таймера.


2

Просто відповідь відповіді Алекса, але з jQuery:

var e = $('#myFrame');
    e.attr("src", e.attr("src"));

Або ви можете використовувати невеликі функції:

function iframeRefresh(e) {
    var c = $(e);
        c.attr("src", c.attr("src"));
}

Я сподіваюся, що це допомагає.



1

Це можливо за допомогою простого JavaScript.

  • В iFrame1 зробіть функцію JavaScript, яка викликається при завантаженні тегу body. У мене він перевірить встановлену я бічну сторону сервера, тому він не намагається запустити функцію JavaScript у iframe2, якщо я не вжив конкретних дій у iframe1. Ви можете налаштувати це як функцію, запущену натисканням кнопки, або якби ви хочете це в iframe1.
  • Потім у iframe2 ви маєте другу функцію, яку я перелічу нижче. Функція iframe1 в основному переходить на батьківську сторінку, а потім використовує window.framesсинтаксис для запуску функції JavaScript у iframe2. Просто переконайтеся, що використовуєте id/ nameof iframe2, а не the src.
//function in iframe1
function refreshIframe2()
{
    if (<cfoutput>#didValidation#</cfoutput> == 1)
    {   
         parent.window.frames.iframe2.refreshPage();
    }
}

//function in iframe2
function refreshPage()
{   
    document.location.reload();
}

1

// оновити всі рамки на сторінці

var f_list = document.getElementsByTagName('iframe');

 for (var i = 0, f; f = f_list[i]; i++) {
                            f.src = f.src;
                        }

0
    ifrX =document.getElementById('id') //or 
    ifrX =frames['index'];

крос-браузерне рішення:

    ifrX.src = ifrX.contentWindow.location

це корисно, особливо коли <iframe> є ціллю <form>


чому jQuery ?! коли простий js доступний
Bortunac

0

РІШЕНО! Я реєструюсь у stockoverflow просто для того, щоб поділитися з вами єдиним рішенням (принаймні в ASP.NET/IE/FF/Chrome), яке працює! Ідея полягає в тому, щоб замінити внутрішнє значення HTML на div його поточним значенням innerHTML.

Ось фрагмент HTML:

<div class="content-2" id="divGranite">
<h2>Granite Purchase</h2>
<IFRAME  runat="server" id="frameGranite" src="Jobs-granite.aspx" width="820px" height="300px" frameborder="0" seamless  ></IFRAME>
</div>

І мій Javascript-код:

function refreshGranite() {           
   var iframe = document.getElementById('divGranite')
   iframe.innerHTML = iframe.innerHTML;
}

Сподіваюся, це допомагає.


Кілька помилок у цій відповіді: 1. не компонент ASP.NET, тому runat="server"не застосовується; 2. Для чого всі кришки IFRAME? 3. значення атрибутів розмірності не мають одиниць; 4. frameborderзастаріло
Раптор

0

Вам потрібно користуватися

[0] .src

щоб знайти джерело iframe та його URL-адресу, слід знаходитись в одному домені батьків.

setInterval(refreshMe, 5000);
function refreshMe() {
    $("#currentElement")[0].src = $("#currentElement")[0].src;   
}

0

ви можете зробити це так

$('.refrech-iframe').click(function(){
        $(".myiframe").attr("src", function(index, attr){ 
            return attr;
        });
    });

-5

Нижче рішення працюватиме точно:

window.parent.location.href = window.parent.location.href;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.