Saya ingin memanggil fungsi JavaScript jendela induk dari iframe.
<script>
function abc()
{
alert("sss");
}
</script>
<iframe id="myFrame">
<a onclick="abc();" href="#">Call Me</a>
</iframe>
Saya ingin memanggil fungsi JavaScript jendela induk dari iframe.
<script>
function abc()
{
alert("sss");
}
</script>
<iframe id="myFrame">
<a onclick="abc();" href="#">Call Me</a>
</iframe>
Jawaban:
<a onclick="parent.abc();" href="#" >Call Me </a>
Lihat window.parent
Mengembalikan referensi ke induk dari jendela saat ini atau subframe.
Jika sebuah jendela tidak memiliki induk, properti induknya adalah referensi untuk dirinya sendiri.
Ketika jendela dimuat dalam <iframe>
, <object>
atau <frame>
, induknya adalah jendela dengan elemen embedding jendela.
alert
akan dipanggil; alert
fungsi orang tua atau fungsi iframe alert
, jika parent.abc();
dipanggil iframe?
window.postMessage()
(atau window.parent.postMessage()
) ada. Periksa @Andrii jawab
Baru-baru ini saya harus mencari tahu mengapa ini tidak berhasil juga.
Javascript yang ingin Anda panggil dari iframe anak harus di kepala orang tua. Jika ada di badan, skrip tidak tersedia dalam cakupan global.
<head>
<script>
function abc() {
alert("sss");
}
</script>
</head>
<body>
<iframe id="myFrame">
<a onclick="parent.abc();" href="#">Click Me</a>
</iframe>
</body>
Semoga ini bisa membantu siapa saja yang menemukan masalah ini lagi.
Metode ini dengan aman memungkinkan cross-origin
komunikasi.
Dan jika Anda memiliki akses ke kode halaman induk maka metode induk apa pun dapat dipanggil serta data apa pun dapat diteruskan langsung dari Iframe
. Ini adalah contoh kecil:
Halaman induk:
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);
}
Kode iframe:
window.parent.postMessage({
'func': 'parentFunc',
'message': 'Message text from iframe.'
}, "*");
// Use target origin instead of *
PEMBARUAN:
Catatan keamanan:
Selalu berikan target tertentu, BUKAN *
, jika Anda tahu di mana dokumen jendela lain harus berada. Gagal memberikan target spesifik mengungkapkan data yang Anda kirim ke situs berbahaya apa pun yang tertarik (komentar oleh ZalemCitizen ).
Referensi:
Saya telah memposting ini sebagai jawaban terpisah karena tidak terkait dengan jawaban saya yang ada.
Masalah ini baru-baru ini dipangkas lagi untuk mengakses induk dari iframe yang merujuk subdomain dan perbaikan yang ada tidak berhasil.
Kali ini jawabannya adalah mengubah document.domain dari halaman induk dan iframe menjadi sama. Ini akan menipu pemeriksaan kebijakan asal yang sama dengan berpikir bahwa mereka hidup berdampingan pada domain yang sama persis (subdomain dianggap sebagai host yang berbeda dan gagal dalam pemeriksaan kebijakan asal yang sama).
Masukkan yang berikut ini ke <head>
halaman di iframe agar sesuai dengan domain induk (sesuaikan untuk tipe dokumen Anda).
<script>
document.domain = "mydomain.com";
</script>
Harap dicatat bahwa ini akan menimbulkan kesalahan pada pengembangan host lokal, jadi gunakan cek seperti berikut untuk menghindari kesalahan:
if (!window.location.href.match(/localhost/gi)) {
document.domain = "mydomain.com";
}
example.com
iframe abc.example.com
, maka kedua induk dan iframe harus memanggildocument.domain = "example.com"
Kamu bisa memakai
window.top
lihat berikut ini.
<head>
<script>
function abc() {
alert("sss");
}
</script>
</head>
<body>
<iframe id="myFrame">
<a onclick="window.top.abc();" href="#">Click Me</a>
</iframe>
</body>
abc()
hanya akan berfungsi jika function abc()
dideklarasikan di iframe sebagai lawan dari halaman induk. window.top.abc()
keluar dari iframe ke dalam dokumen induk.
Tambahan lain untuk mereka yang membutuhkannya. Solusi Ash Clarke tidak berfungsi jika mereka menggunakan protokol yang berbeda jadi pastikan bahwa jika Anda menggunakan SSL, iframe Anda menggunakan SSL juga atau itu akan merusak fungsinya. Solusinya memang berhasil untuk domain itu sendiri, jadi terima kasih untuk itu.
Solusi yang diberikan oleh Ash Clarke untuk subdomain berfungsi dengan baik, tetapi harap dicatat bahwa Anda harus menyertakan document.domain = "mydomain.com"; di kedua kepala halaman iframe dan kepala halaman induk, sebagaimana dinyatakan dalam tautan yang sama memeriksa kebijakan asal
Perpanjangan penting untuk kebijakan asal yang sama diterapkan untuk akses DOM JavaScript (tetapi tidak untuk sebagian besar rasa lain dari pemeriksaan asal-sama) adalah bahwa dua situs yang berbagi domain tingkat atas yang sama dapat memilih untuk berkomunikasi meskipun gagal dengan "host yang sama" periksa dengan saling mengatur masing-masing properti DOM document.domain masing-masing untuk fragmen kanan yang sama dari nama host mereka saat ini. Sebagai contoh, jika http://en.example.com/ dan http://fr.example.com/ keduanya mengatur document.domain ke "example.com", mereka akan dari titik itu pada asal-usul yang dianggap sama untuk tujuan manipulasi DOM.
document.domain
?
localhost
atau alamat ip mesin (biasanya 127.0.0.1
), tergantung pada apa yang ada di bilah alamat url.
parent.abc () hanya akan berfungsi di domain yang sama karena tujuan keamanan. Saya mencoba solusi ini dan milik saya bekerja dengan sempurna.
<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>
Semoga ini membantu. :)
Dengan Firefox dan Chrome Anda dapat menggunakan:
<a href="whatever" target="_parent" onclick="myfunction()">
Jika fungsi saya hadir di iframe dan di induk, yang orangtua akan dipanggil.
Sementara beberapa solusi ini mungkin berhasil, tidak ada yang mengikuti praktik terbaik. Banyak yang menetapkan variabel global dan Anda mungkin menemukan diri Anda melakukan panggilan ke beberapa variabel induk atau fungsi, yang mengarah ke namespace yang berantakan dan rentan.
Untuk menghindari ini, gunakan pola modul. Di jendela induk:
var myThing = {
var i = 0;
myFunction : function () {
// do something
}
};
var newThing = Object.create(myThing);
Kemudian, di iframe:
function myIframeFunction () {
parent.myThing.myFunction();
alert(parent.myThing.i);
};
Ini mirip dengan pola yang dijelaskan dalam bab Inheritance dari teks mani Crockford, "Javascript: The Good Parts." Anda juga dapat mempelajari lebih lanjut di halaman w3 untuk praktik terbaik Javascript. https://www.w3.org/wiki/JavaScript_best_practices#Avoid_globals