Я хочу вызвать функцию родительского окна JavaScript из iframe.
<script>
function abc()
{
alert("sss");
}
</script>
<iframe id="myFrame">
<a onclick="abc();" href="#">Call Me</a>
</iframe>
javascript
iframe
onclick
Арджун Сингх
источник
источник
Ответы:
Смотрите window.parent
Возвращает ссылку на родителя текущего окна или подкадра.
Если у окна нет родителя, его родительское свойство является ссылкой на себя.
Когда окно загружено в
<iframe>
,<object>
или<frame>
его родитель окно с элементом вложения в окне.источник
alert
будет вызван; родительскаяalert
функция или функция iframealert
, в случае, еслиparent.abc();
вызывается на iframe?window.postMessage()
(илиwindow.parent.postMessage()
) существует. Проверьте ответ @AndriiНедавно мне пришлось выяснить, почему это тоже не сработало.
Javascript, который вы хотите вызвать от дочернего элемента iframe, должен находиться в голове родительского элемента. Если он находится в теле, сценарий недоступен в глобальной области видимости.
Надеюсь, это поможет любому, кто снова столкнется с этой проблемой.
источник
Window.postMessage ()
Этот метод позволяет безопасно
cross-origin
общаться.И если у вас есть доступ к коду родительской страницы, тогда любой родительский метод может быть вызван, а любые данные могут быть переданы напрямую
Iframe
. Вот небольшой пример:Родительская страница:
Код iframe:
ОБНОВЛЕНИЕ:
Примечание по безопасности:
Всегда указывайте конкретный targetOrigin, NOT
*
, если вы знаете, где должен находиться документ другого окна. Неспособность указать конкретную цель раскрывает данные, которые вы отправляете на любой заинтересованный вредоносный сайт (комментарий ZalemCitizen ).Ссылки:
источник
Я разместил это как отдельный ответ, поскольку он не связан с моим существующим ответом.
Недавно эта проблема снова возникла для доступа к родительскому элементу из iframe, ссылающегося на поддомен, и существующие исправления не работали.
На этот раз ответом было изменить то, что document.domain родительской страницы и iframe были одинаковыми. Это обманет те же проверки политики происхождения, что они будут сосуществовать в одном и том же домене (субдомены считаются другим хостом и не пройдут ту же проверку политики происхождения).
Вставьте следующее в
<head>
страницу в iframe, чтобы соответствовать родительскому домену (с учетом вашего типа документа).Обратите внимание, что это приведет к ошибке при разработке localhost, поэтому используйте проверку, подобную следующей, чтобы избежать ошибки:
источник
example.com
iframeabc.example.com
, то и родитель, и iframe должны вызыватьdocument.domain = "example.com"
Ты можешь использовать
смотрите следующее.
источник
abc()
будет работать, только если онfunction abc()
был объявлен в iframe, а не на родительской странице.window.top.abc()
вырывается из iframe в родительский документ.Еще одно дополнение для тех, кому это нужно. Решение Эша Кларка не работает, если они используют разные протоколы, поэтому убедитесь, что если вы используете SSL, то ваш iframe также использует SSL, или он нарушит функцию. Его решение действительно работает на домены, так что спасибо за это.
источник
Решение Ash Clarke для поддоменов прекрасно работает, но учтите, что вам необходимо включить document.domain = "mydomain.com"; как в заголовке страницы iframe, так и в заголовке родительской страницы, как указано в ссылке, одни и те же проверки политики происхождения
источник
document.domain
?localhost
или IP-адрес машины (обычно127.0.0.1
), в зависимости от того, что находится в адресной строке URL.parent.abc () будет работать только на одном домене в целях безопасности. Я попробовал этот обходной путь, и мой работал отлично.
Надеюсь это поможет. :)
источник
С Firefox и Chrome вы можете использовать:
Если myfunction присутствует и в iframe, и в parent, будет вызвана родительская функция.
источник
Хотя некоторые из этих решений могут работать, ни одно из них не следует передовой практике. Многие присваивают глобальные переменные, и вы можете вызывать несколько родительских переменных или функций, что приводит к загроможденному и уязвимому пространству имен.
Чтобы избежать этого, используйте шаблон модуля. В родительском окне:
Затем в iframe:
Это похоже на паттерны, описанные в главе «Наследование» оригинального текста Крокфорда «Javascript: The Good Parts». Вы также можете узнать больше на странице w3 о лучших практиках Javascript. https://www.w3.org/wiki/JavaScript_best_practices#Avoid_globals
источник