2013-10-25 11 views
3

Я проверил все перезагрузки iframe из других сообщений iframe в stackoverflow ... и я пробовал все их решения, но мне это, похоже, не помогает! Поэтому моя проблема в том, что у меня есть две iframe на одной странице. Источниками iframe являются php-файлы, которые взаимодействуют друг с другом, однако мне нужны фреймы для перезагрузки таким образом, как будут показаны изменения. Я пробовал много разных способов (о чем я расскажу ниже). Эти фреймы из одного домена. Может быть, это что-то еще, что испортило это? Заранее спасибо.Перезагрузка iframe из отдельного iframe

Различные заявления вызываются из одного фрейма:

parent.document.getElementById(id).src = parent.document.getElementById(id).src; 
parent.getElementById(id).location.reload(); 

Попытка вызвать родительскую функцию, которая работает в родительском окне:

Внутри IFRAME - работает функция

parent.refresh(id); 

окно Родитель -

function refresh(id) { 
document.getElementById(id).src = document.getElementById(id).src; 
} 
+0

Являются ли оба фреймы отправлены из того же домена, что и ваш php-скрипт? Вы не можете изменять другие фреймы домена. – Skarlinski

+0

Да, они есть. Извините, я забыл включить это. –

+0

Что произойдет, если вы запустите команду refresh ("idString") вручную ftom-консоли после завершения первого окончания iframe? – Skarlinski

ответ

6

Если вы назначили name по номеру iframe, большинство браузеров предоставит вам доступ к объекту iframe10 с разрешением name. Это отличается от ссылки на iframe своим имуществом id, которое даст вам ссылку на элемент iframe (от его владельца document), а не iframewindow.

Простой пример: (из родительского документа)

<iframe name='iframe1Name' id='iframe1Id'></iframe> 
<script> 
    // option 1: get a reference to the iframe element: 
    var iframeElem = document.getElementById('iframe1Id'); 

    // update the element's src: 
    iframeElem.src = "page.html"; 

    // option 2: get a reference to the iframe's window object: 
    var iframeWindow = window.iframe1Name;  

    // update the iframe's location: 
    iframeWindow.location.href = "page.html"; 
</script> 

Давайте рассмотрим код:

parent.document.getElementById(id).src = parent.document.getElementById(id).src; 

Это работает, если выполняется внутри iframe, при условии, что вы используете правильный id. Вы можете использовать отладчик, чтобы убедиться, что parent.document.getElementById(id) возвращает ссылку на правильный элемент и проверит вашу консоль, чтобы проверить, не выбрасываются ли какие-либо исключения (попробуйте нажать F12). Поскольку вы не опубликовали свой полный код (включая разметку), я не могу подумать, чтобы сказать, в чем проблема.

Отладочные советы:

  • проверки parent.location.href, чтобы убедиться, что вы обращаетесь в окно вы думаете, вы,
  • проверка parent.document.getElementId(id), чтобы убедиться, что вы получите объект элемента (в отличие от null или undefined) ,
  • проверка parent.document.getElementById(id).tagName, чтобы убедиться, что вы используете правильный идентификатор (tagName должен === «IFRAME»)

Эта линия:

parent.getElementById(id).location.reload(); 

имеет две проблемы:

  1. getElementById() является функцией document, но она вызывается из parent который является window объектом, а
  2. location является свойством объекта window. Вы пытаетесь получить доступ к элементу iframe элемента location, которого нет. Вам нужна ссылка на iframewindow, а не на его элемент.

Кроме того, метод name, есть и другие способы, чтобы получить iframe «s объект окна:

  1. document.getElementById('iframeId').contentWindow; // for supported browsers
  2. window.frames["iframeName"]; // assumes name property was set on the iframe
  3. window.frames[i]; // where i is the ordinal for the frame

Если изменение src из iframe элемента не работает для вас, эти другие исправления может:

parent.document.getElementById(id).contentWindow.location.reload();

или

parent.frames["yourIframeName"].location.reload(); // requires iframe name attribute

или

parent.frames[0].location.reload(); // frames of immediate parent window

или

top.frames[0].location.reload(); // frames of top-most parent window

Внимание: При использовании метода name быть осторожным, чтобы не использовать общее значение для name, как «дом», например, как он конфликтует с функцией FireFox называется home() и поэтому Firefox не будет автоматически создавать ссылка на окно iframe, если оно называется home.Наиболее надежный метод, вероятно, использовать window.frames[], как я считаю, что было вокруг в течение долгого времени (работает в FF/Chrome/Safari/IE6 + (по крайней мере))

Более углубленный (но довольно минимален) пример следует, испытаны в Chrome, FF, и IE:

Файл № 1: frametest.html (родительское окно)

<!DOCTYPE html> 
<html> 
<body> 
    <iframe id="frame1Id" name="frame1Name" src="frame1.html"></iframe> 
    <iframe id="frame2Id" name="frame2Name" src="frame2.html"></iframe> 
</body> 
</html> 

Файл № 2: frame1.html (кадр 1 в SRC)

<!DOCTYPE html> 
<html> 
<body> 
FRAME 1 
<script> 
    document.body.style.backgroundColor="#ccc"; 
    setTimeout(function(){document.body.style.backgroundColor="#fff";},100); 
    document.write(new Date()); 
</script> 
<input type="button" onclick="parent.document.getElementById('frame2Id').src=parent.document.getElementById('frame2Id').src;" value="Refresh frame 2 by ID"/> 
<input type="button" onclick="parent.frame2Name.location.reload();" value="Refresh frame 2 by Name"/> 
</body> 
</html> 

Файл № 3: frame2.html (кадр 2 в SRC)

<!DOCTYPE html> 
<html> 
<body> 
FRAME 1 
<script> 
    document.body.style.backgroundColor="#ccc"; 
    setTimeout(function(){document.body.style.backgroundColor="#fff";},100); 
    document.write(new Date()); 
</script> 
<input type="button" onclick="parent.document.getElementById('frame1Id').src=parent.document.getElementById('frame1Id').src;" value="Refresh frame 2 by ID"/> 
<input type="button" onclick="parent.frame1Name.location.reload();" value="Refresh frame 2 by Name"/> 
</body> 
</html> 

Этот пример демонстрирует, как определить и манипулировать iframe S с помощью id и name, и как влияют друг на iframe изнутри другого iframe. В зависимости от настроек браузера может применяться политика происхождения, но вы уже сказали, что ваш контент был из одного домена, поэтому вы должны быть в порядке.

+0

Это был, безусловно, очень находчивый пост! Это помогло мне с моей проблемой, и я многому научился. Спасибо :) –

Смежные вопросы