По сути, у меня есть iframe
встроенная страница, и iframe
есть некоторые подпрограммы JavaScript , которые мне нужно вызывать с родительской страницы.
Теперь все наоборот: вам нужно всего лишь позвонить parent.functionName()
, но, к сожалению, мне нужно как раз наоборот.
Обратите внимание , что моя проблема не меняет исходный URL из iframe
, но вызова функции , определенной в iframe
.
javascript
html
iframe
Тамас Чинеге
источник
источник
Ответы:
Предположим, что идентификатор вашего iFrame равен «targetFrame», а функция, которую вы хотите вызвать
targetFunction()
:Вы также можете получить доступ к кадру, используя
window.frames
вместоdocument.getElementById
.источник
document.getElementById('remote_iframe_0').contentWindow.my.create_element_gadget('verify_user');"
remote_iframe_0 создан программно сервером Apache Shindig, ноwindow.parent.document.getElementById('remote_iframe_0').contentWindow.my.create_element_gadget('verify_user');"
работаетЗдесь есть некоторые причуды, о которых нужно знать.
HTMLIFrameElement.contentWindow
Возможно, это более простой способ, но это не совсем стандартное свойство, и некоторые браузеры его не поддерживают, в основном старые. Это связано с тем, что стандарт HTML DOM Level 1 не имеет ничего общего сwindow
объектом.Вы также можете попробовать
HTMLIFrameElement.contentDocument.defaultView
, что разрешено парой старых браузеров, а IE - нет. Несмотря на это, в стандарте прямо не говорится, что вы возвращаетеwindow
объект по той же причине, что и (1), но вы можете выбрать несколько дополнительных версий браузера, если вам это нужно.window.frames['name']
возврат окна - самый старый и, следовательно, самый надежный интерфейс. Но тогда вам нужно использоватьname="..."
атрибут, чтобы получить кадр по имени, что немного уродливо /устарело/ является переходным. (id="..."
было бы лучше, но IE это не нравится.)window.frames[number]
это также очень надежно, но знание правильного индекса - хитрость. Вы можете сойти с рук, например. если вы знаете, у вас есть только один iframe на странице.Вполне возможно, что дочерний iframe еще не загружен или что-то пошло не так, чтобы сделать его недоступным. Возможно, вам будет проще перевернуть поток сообщений: то есть, чтобы дочерний iframe уведомил свой
window.parent
скрипт, когда он закончил загрузку и был готов к обратному вызову. Передав один из своих собственных объектов (например, функцию обратного вызова) родительскому сценарию, этот родительский элемент может затем напрямую связаться со сценарием в iframe, не беспокоясь о том, с каким HTMLIFrameElement он связан.источник
methode()
часть.Вызов родительской функции JS из
iframe
возможно, но только тогда , когда оба родителя и страница загружается вiframe
эту же из области , т.е. abc.com, и оба используют одинаковый протокол т.е. оба либо наhttp://
илиhttps://
.Вызов не будет выполнен в следующих случаях:
Любой обходной путь для этого ограничения будет крайне небезопасным.
Например, представьте, что я зарегистрировал домен superwinningcontest.com и разослал ссылки на электронные письма людей. Когда они загрузили главную страницу, я мог спрятать там несколько
iframe
секунд и прочитать их ленту в Facebook, проверить последние транзакции Amazon или PayPal или - если они использовали службу, которая не обеспечивала достаточную безопасность - перевести деньги из их учетные записи. Вот почему JavaScript ограничен тем же доменом и тем же протоколом.источник
В IFRAME сделайте вашу функцию общедоступной для объекта window:
Для доступа с родительской страницы используйте это:
источник
onclick()
событие которой просто вызываетwindow.print()
. Это выводит содержимое изiframe
прекрасно. Но когда вызывается публичная функция страницы iframewindow.print()
и если родительская страница вызывает публичную функцию, печатается содержимое родительской страницы. Как я должен кодировать это так, чтобы вызовwindow.print()
в публичной функции вел себя так же, как вonclick
событии?onclick
. Вы хотите позвонитьiframe.contentWindow.print()
.document.getElementById('myFrame').contentWindow.print();' and the pubic function
printContent () `(не обработчик события oncick), вызов которогоwindow.print()
был вызван так:document.getElementById('myFrame').contentWindow.printContent();
Если цель iFrame и содержащий документ находятся в другом домене, ранее опубликованные методы могут не работать, но есть решение:
Например, если документ A содержит элемент iframe, который содержит документ B, а сценарий в документе A вызывает postMessage () для объекта Window документа B, то для этого объекта будет сгенерировано событие сообщения, помеченное как происходящее из окна документ А. Сценарий в документе А может выглядеть следующим образом:
Чтобы зарегистрировать обработчик событий для входящих событий, сценарий будет использовать addEventListener () (или аналогичные механизмы). Например, скрипт в документе B может выглядеть так:
Этот сценарий сначала проверяет, является ли домен ожидаемым, а затем просматривает сообщение, которое он либо отображает пользователю, либо отвечает на него, отправляя сообщение обратно в документ, который отправил сообщение в первую очередь.
через http://dev.w3.org/html5/postmsg/#web-messaging
источник
Просто для записи, я столкнулся с той же проблемой сегодня, но на этот раз страница была встроена в объект, а не в iframe (так как это был документ XHTML 1.1). Вот как это работает с объектами:
(извините за уродливые разрывы строк, не помещается в одну строку)
источник
РАМКА должна быть в
frames[]
коллекции. Используйте что-то вродеисточник
method
свойство объекта iframewindow
.У Quirksmode был пост об этом .
Поскольку страница теперь повреждена и доступна только через archive.org, я воспроизвел ее здесь:
IFrames
На этой странице я даю краткий обзор доступа к фреймам со страницы, на которой они находятся. Не удивительно, что есть некоторые соображения браузера.
Iframe - это встроенный фрейм, фрейм, который, хотя и содержит совершенно отдельную страницу со своим собственным URL, тем не менее размещается внутри другой HTML-страницы. Это дает очень хорошие возможности в веб-дизайне. Проблема в том, чтобы получить доступ к iframe, например, чтобы загрузить в него новую страницу. Эта страница объясняет, как это сделать.
Рамка или объект?
Основной вопрос заключается в том, рассматривается ли iframe как рамка или как объект.
top.frames[1].frames[2]
и тому подобное). Вписывается ли iframe в эту иерархию фреймов?document.getElementById('theiframe'))
для доступа к нему. В общем, браузеры допускают оба представления «реальных» (жестко запрограммированных) фреймов, но сгенерированные фреймы не могут быть доступны как фреймы.Атрибут NAME
Самое важное правило - указывать любой iframe, который вы создаете
name
, даже если вы также используетеid
.Большинству браузеров нужен
name
атрибут, чтобы сделать iframe частью иерархии фреймов. Некоторые браузеры (особенно Mozilla) нуждаются в том,id
чтобы сделать iframe доступным как объект. Присваивая оба атрибута iframe, вы сохраняете свои опции открытыми. Ноname
гораздо важнее, чемid
.Доступ
Либо вы получаете доступ к iframe как объекту и меняете его,
src
либо вы получаете доступ к iframe как кадру и изменяете егоlocation.href
.document.getElementById ('iframe_id'). src = 'newpage.html'; frames ['iframe_name']. location.href = 'newpage.html'; Синтаксис фрейма немного предпочтительнее, потому что Opera 6 поддерживает его, но не объектный синтаксис.
Доступ к фрейму
Так что для полного кросс-браузерного опыта вы должны дать iframe имя и использовать
синтаксис. Насколько я знаю, это всегда работает.
Доступ к документу
Доступ к документу внутри iframe довольно прост при условии, что вы используете
name
атрибут. Чтобы подсчитать количество ссылок в документе в iframe, сделайтеframes['testiframe'].document.links.length
.Сгенерированные фреймы
Когда вы генерируете iframe через W3C DOM, iframe не сразу вводится в
frames
массив, иframes['testiframe'].location.href
синтаксис не будет работать сразу. Браузеру нужно немного времени, прежде чем iframe появится в массиве, время, в течение которого ни один скрипт не может быть запущен.document.getElementById('testiframe').src
Синтаксис отлично работает в любых обстоятельствах.target
Атрибут ссылка не работает , либо с сгенерированных фреймов, за исключением Opera, даже если я дал сгенерированный IFrame как наname
иid
.Отсутствие
target
поддержки означает, что вы должны использовать JavaScript для изменения содержимого сгенерированного iframe, но так как вам все равно нужен JavaScript для его генерации, я не вижу в этом особой проблемы.Размер текста в фреймах
Любопытная ошибка только в Explorer 6:
При изменении размера текста в меню «Вид» размеры текста в фреймах корректно изменяются. Однако этот браузер не изменяет разрывы строк в исходном тексте, поэтому часть текста может стать невидимой, или же могут произойти разрывы строк, в то время как строка может содержать еще одно слово.
источник
Я нашел довольно элегантное решение.
Как вы сказали, довольно легко выполнить код, расположенный в родительском документе. И это основа моего кода, сделайте как раз наоборот.
Когда мой iframe загружается, я вызываю функцию, расположенную в родительском документе, передавая в качестве аргумента ссылку на локальную функцию, расположенную в документе iframe. Родительский документ теперь имеет прямой доступ к функции iframe через эту ссылку.
Пример:
На родителя:
На фрейме:
Когда iframe загружается, он вызывает parent.tunnel (YourFunctionReference), который будет выполнять функцию, полученную в параметре.
Это просто, не имея дело со всеми нестандартными методами из разных браузеров.
источник
Некоторые из этих ответов не касаются проблемы CORS или не дают четкого представления о том, где вы размещаете фрагменты кода, чтобы сделать общение возможным.
Вот конкретный пример. Скажем, я хочу нажать кнопку на родительской странице, и сделать что-то внутри iframe. Вот как бы я это сделал.
parent_frame.html
iframe_page.html
Чтобы перейти в другом направлении (нажмите кнопку внутри iframe, чтобы вызвать метод за пределами iframe), просто переключитесь, где находится фрагмент кода, и измените это:
к этому:
источник
Продолжая с ответом JoelAnair :
Для большей надежности используйте следующее:
Работал как шарм :)
источник
Folowing ответ Нитин Бансал
и для еще большей надежности:
а также
источник
источник
То же самое, но немного проще: как обновить родительскую страницу со страницы внутри iframe . Просто вызовите функцию родительской страницы, чтобы вызвать функцию javascript для перезагрузки страницы:
Или сделать это прямо со страницы в iframe:
Обе работы.
источник
Попробуй просто
parent.myfunction()
источник
Если вы хотите вызвать функцию JavaScript в Parent из iframe, сгенерированного другой функцией ex shadowbox или lightbox.
Вы должны попытаться использовать
window
объект и вызвать родительскую функцию:источник
Используйте следующее для вызова функции фрейма на родительской странице
источник