Voglio chiamare una funzione JavaScript della finestra principale da un iframe.
<script>
function abc()
{
alert("sss");
}
</script>
<iframe id="myFrame">
<a onclick="abc();" href="#">Call Me</a>
</iframe>
Voglio chiamare una funzione JavaScript della finestra principale da un iframe.
<script>
function abc()
{
alert("sss");
}
</script>
<iframe id="myFrame">
<a onclick="abc();" href="#">Call Me</a>
</iframe>
Risposte:
<a onclick="parent.abc();" href="#" >Call Me </a>
Vedi window.parent
Restituisce un riferimento al genitore della finestra o del sottotelaio correnti.
Se una finestra non ha un genitore, la sua proprietà genitore è un riferimento a se stessa.
Quando una finestra viene caricato in una <iframe>
, <object>
o <frame>
, il suo genitore è la finestra con l'elemento incorporamento finestra.
alert
verrà invocata; la alert
funzione parent o iframe alert
, nel caso in cui parent.abc();
viene chiamato iframe?
window.postMessage()
(o window.parent.postMessage()
) esiste. Controlla la risposta di @Andrii
Di recente ho dovuto scoprire perché anche questo non ha funzionato.
Il javascript che vuoi chiamare dall'iframe figlio deve essere nella testa del genitore. Se è nel corpo, lo script non è disponibile nell'ambito globale.
<head>
<script>
function abc() {
alert("sss");
}
</script>
</head>
<body>
<iframe id="myFrame">
<a onclick="parent.abc();" href="#">Click Me</a>
</iframe>
</body>
Spero che questo aiuti chiunque si imbatte nuovamente in questo problema.
Questo metodo consente la cross-origin
comunicazione in sicurezza .
E se si ha accesso al codice della pagina padre, è possibile chiamare qualsiasi metodo padre e tutti i dati da cui è possibile passare direttamente Iframe
. Ecco un piccolo esempio:
Pagina principale:
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);
}
Codice Iframe:
window.parent.postMessage({
'func': 'parentFunc',
'message': 'Message text from iframe.'
}, "*");
// Use target origin instead of *
AGGIORNAMENTI:
Nota sulla sicurezza:
Fornire sempre un targetOrigin specifico, NON *
, se si sa dove dovrebbe trovarsi il documento dell'altra finestra. Non fornire un target specifico rivela i dati inviati a qualsiasi sito dannoso interessato (commento di ZalemCitizen ).
Riferimenti:
Ho pubblicato questo come una risposta separata in quanto non è correlata alla mia risposta esistente.
Questo problema è stato recentemente ripreso per accedere a un genitore da un iframe che fa riferimento a un sottodominio e le correzioni esistenti non hanno funzionato.
Questa volta la risposta è stata quella di modificare document.domain della pagina padre e iframe in modo che fossero gli stessi. Ciò ingannerà gli stessi controlli di politica di origine nel pensare che coesistano esattamente nello stesso dominio (i sottodomini sono considerati un host diverso e non superano lo stesso controllo di politica di origine).
Inserisci quanto segue in <head>
della pagina nell'iframe in modo che corrisponda al dominio principale (modifica per il tuo tipo di documento).
<script>
document.domain = "mydomain.com";
</script>
Si noti che ciò genererà un errore nello sviluppo di localhost, quindi utilizzare un segno di spunta come il seguente per evitare l'errore:
if (!window.location.href.match(/localhost/gi)) {
document.domain = "mydomain.com";
}
example.com
iframe abc.example.com
, quindi sia parent che iframe devono chiamaredocument.domain = "example.com"
Puoi usare
window.top
vedi quanto segue.
<head>
<script>
function abc() {
alert("sss");
}
</script>
</head>
<body>
<iframe id="myFrame">
<a onclick="window.top.abc();" href="#">Click Me</a>
</iframe>
</body>
abc()
funzionerebbe solo se function abc()
fosse stata dichiarata nell'iframe invece che nella pagina padre. window.top.abc()
esce dall'iframe nel documento principale.
Un'altra aggiunta per chi ne ha bisogno. La soluzione di Ash Clarke non funziona se usano protocolli diversi, quindi assicurati che se stai usando SSL, anche il tuo iframe sta usando SSL o interromperà la funzione. La sua soluzione ha funzionato per i domini stessi, quindi grazie per quello.
La soluzione fornita da Ash Clarke per i sottodomini funziona alla grande, ma tieni presente che devi includere document.domain = "mydomain.com"; sia nell'intestazione della pagina iframe che nell'intestazione della pagina padre, come indicato nel link stesso controllo della politica di origine
Un'estensione importante della stessa politica di origine implementata per l'accesso al DOM JavaScript (ma non per la maggior parte degli altri tipi di controlli della stessa origine) è che due siti che condividono un dominio di primo livello comune possono scegliere di comunicare nonostante non riesca lo "stesso host" controllare impostando reciprocamente la rispettiva proprietà DOM document.domain sullo stesso frammento qualificato e destro del nome host corrente. Ad esempio, se http://en.example.com/ e http://fr.example.com/ impostano entrambi document.domain su "example.com", sarebbero da quel punto considerati la stessa origine per scopo della manipolazione del DOM.
document.domain
?
localhost
o l'indirizzo IP della macchina (in genere 127.0.0.1
), a seconda di ciò che si trova nella barra degli indirizzi URL.
parent.abc () funzionerà sullo stesso dominio solo per motivi di sicurezza. ho provato questa soluzione alternativa e il mio ha funzionato perfettamente.
<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>
Spero che questo ti aiuti. :)
Con Firefox e Chrome puoi usare:
<a href="whatever" target="_parent" onclick="myfunction()">
Se myFunzione è presente sia in iframe che in parent, verrà chiamato quello parent.
Mentre alcune di queste soluzioni potrebbero funzionare, nessuna di esse segue le migliori pratiche. Molti assegnano variabili globali e potresti trovarti a effettuare chiamate a più variabili o funzioni padre, portando a uno spazio dei nomi disordinato e vulnerabile.
Per evitare ciò, utilizzare un modello di modulo. Nella finestra principale:
var myThing = {
var i = 0;
myFunction : function () {
// do something
}
};
var newThing = Object.create(myThing);
Quindi, nell'iframe:
function myIframeFunction () {
parent.myThing.myFunction();
alert(parent.myThing.i);
};
Questo è simile ai modelli descritti nel capitolo Ereditarietà del testo fondamentale di Crockford, "Javascript: le parti buone". Puoi anche saperne di più sulla pagina di w3 per le migliori pratiche di Javascript. https://www.w3.org/wiki/JavaScript_best_practices#Avoid_globals