Я хочу вызвать функцию родительского окна JavaScript из iframe.
<script>
function abc()
{
alert("sss");
}
</script>
<iframe id="myFrame">
<a onclick="abc();" href="#">Call Me</a>
</iframe>
Я хочу вызвать функцию родительского окна JavaScript из iframe.
<script>
function abc()
{
alert("sss");
}
</script>
<iframe id="myFrame">
<a onclick="abc();" href="#">Call Me</a>
</iframe>
Ответы:
<a onclick="parent.abc();" href="#" >Call Me </a>
Смотрите window.parent
Возвращает ссылку на родителя текущего окна или подкадра.
Если у окна нет родителя, его родительское свойство является ссылкой на себя.
Когда окно загружено в <iframe>
, <object>
или <frame>
его родитель окно с элементом вложения в окне.
alert
будет вызван; родительская alert
функция или функция iframe alert
, в случае, если parent.abc();
вызывается на iframe?
window.postMessage()
(или window.parent.postMessage()
) существует. Проверьте ответ @Andrii
Недавно мне пришлось выяснить, почему это тоже не сработало.
Javascript, который вы хотите вызвать от дочернего элемента iframe, должен находиться в голове родительского элемента. Если он находится в теле, сценарий недоступен в глобальной области видимости.
<head>
<script>
function abc() {
alert("sss");
}
</script>
</head>
<body>
<iframe id="myFrame">
<a onclick="parent.abc();" href="#">Click Me</a>
</iframe>
</body>
Надеюсь, это поможет любому, кто снова столкнется с этой проблемой.
Этот метод позволяет безопасно cross-origin
общаться.
И если у вас есть доступ к коду родительской страницы, тогда любой родительский метод может быть вызван, а любые данные могут быть переданы напрямую Iframe
. Вот небольшой пример:
Родительская страница:
if (window.addEventListener) {
window.addEventListener("message", onMessage, false);
}
else if (window.attachEvent) {
window.attachEvent("onmessage", onMessage, false);
}
function onMessage(event) {
// Check sender origin to be trusted
if (event.origin !== "http://example.com") return;
var data = event.data;
if (typeof(window[data.func]) == "function") {
window[data.func].call(null, data.message);
}
}
// Function to be called from iframe
function parentFunc(message) {
alert(message);
}
Код iframe:
window.parent.postMessage({
'func': 'parentFunc',
'message': 'Message text from iframe.'
}, "*");
// Use target origin instead of *
ОБНОВЛЕНИЕ:
Примечание по безопасности:
Всегда указывайте конкретный targetOrigin, NOT *
, если вы знаете, где должен находиться документ другого окна. Неспособность указать конкретную цель раскрывает данные, которые вы отправляете на любой заинтересованный вредоносный сайт (комментарий ZalemCitizen ).
Ссылки:
Я разместил это как отдельный ответ, поскольку он не связан с моим существующим ответом.
Недавно эта проблема снова возникла для доступа к родительскому элементу из iframe, ссылающегося на поддомен, и существующие исправления не работали.
На этот раз ответом было изменить то, что document.domain родительской страницы и iframe были одинаковыми. Это обманет те же проверки политики происхождения, что они будут сосуществовать в одном и том же домене (субдомены считаются другим хостом и не пройдут ту же проверку политики происхождения).
Вставьте следующее в <head>
страницу в iframe, чтобы соответствовать родительскому домену (с учетом вашего типа документа).
<script>
document.domain = "mydomain.com";
</script>
Обратите внимание, что это приведет к ошибке при разработке localhost, поэтому используйте проверку, подобную следующей, чтобы избежать ошибки:
if (!window.location.href.match(/localhost/gi)) {
document.domain = "mydomain.com";
}
example.com
iframe abc.example.com
, то и родитель, и iframe должны вызыватьdocument.domain = "example.com"
Ты можешь использовать
window.top
смотрите следующее.
<head>
<script>
function abc() {
alert("sss");
}
</script>
</head>
<body>
<iframe id="myFrame">
<a onclick="window.top.abc();" href="#">Click Me</a>
</iframe>
</body>
abc()
будет работать, только если он function abc()
был объявлен в iframe, а не на родительской странице. window.top.abc()
вырывается из iframe в родительский документ.
Еще одно дополнение для тех, кому это нужно. Решение Эша Кларка не работает, если они используют разные протоколы, поэтому убедитесь, что если вы используете SSL, то ваш iframe также использует SSL, или он нарушит функцию. Его решение действительно работает на домены, так что спасибо за это.
Решение Ash Clarke для поддоменов прекрасно работает, но учтите, что вам необходимо включить document.domain = "mydomain.com"; как в заголовке страницы iframe, так и в заголовке родительской страницы, как указано в ссылке, одни и те же проверки политики происхождения
Важное расширение той же политики происхождения, реализованной для доступа к DOM JavaScript (но не для большинства других разновидностей проверок одного и того же происхождения), заключается в том, что два сайта, совместно использующие общий домен верхнего уровня, могут предпочесть связь, несмотря на отказ «одного хоста» проверьте путем взаимной установки соответствующего свойства DOM document.domain к тому же квалифицированному правому фрагменту их текущего имени хоста. Например, если http://en.example.com/ и http://fr.example.com/ оба установят document.domain в «example.com», они будут с этого момента считаться одним источником для цель манипулирования DOM.
document.domain
?
localhost
или IP-адрес машины (обычно 127.0.0.1
), в зависимости от того, что находится в адресной строке URL.
parent.abc () будет работать только на одном домене в целях безопасности. Я попробовал этот обходной путь, и мой работал отлично.
<head>
<script>
function abc() {
alert("sss");
}
// window of the iframe
var innerWindow = document.getElementById('myFrame').contentWindow;
innerWindow.abc= abc;
</script>
</head>
<body>
<iframe id="myFrame">
<a onclick="abc();" href="#">Click Me</a>
</iframe>
</body>
Надеюсь это поможет. :)
С Firefox и Chrome вы можете использовать:
<a href="whatever" target="_parent" onclick="myfunction()">
Если myfunction присутствует и в iframe, и в parent, будет вызвана родительская функция.
Хотя некоторые из этих решений могут работать, ни одно из них не следует передовой практике. Многие присваивают глобальные переменные, и вы можете вызывать несколько родительских переменных или функций, что приводит к загроможденному и уязвимому пространству имен.
Чтобы избежать этого, используйте шаблон модуля. В родительском окне:
var myThing = {
var i = 0;
myFunction : function () {
// do something
}
};
var newThing = Object.create(myThing);
Затем в iframe:
function myIframeFunction () {
parent.myThing.myFunction();
alert(parent.myThing.i);
};
Это похоже на паттерны, описанные в главе «Наследование» оригинального текста Крокфорда «Javascript: The Good Parts». Вы также можете узнать больше на странице w3 о лучших практиках Javascript. https://www.w3.org/wiki/JavaScript_best_practices#Avoid_globals