Bir iframe'den üst pencere JavaScript işlevini çağırmak istiyorum.
<script>
function abc()
{
alert("sss");
}
</script>
<iframe id="myFrame">
<a onclick="abc();" href="#">Call Me</a>
</iframe>
Bir iframe'den üst pencere JavaScript işlevini çağırmak istiyorum.
<script>
function abc()
{
alert("sss");
}
</script>
<iframe id="myFrame">
<a onclick="abc();" href="#">Call Me</a>
</iframe>
Yanıtlar:
<a onclick="parent.abc();" href="#" >Call Me </a>
Pencereye bakın.
Geçerli pencerenin veya alt çerçevenin üst öğesine bir başvuru döndürür.
Bir pencerenin üst öğesi yoksa, üst özelliği kendisine bir referanstır.
Bir pencere bir <iframe>
, <object>
veya içine yüklendiğinde <frame>
, üst öğesi öğenin pencereyi gömdüğü penceredir.
alert
s'den hangisinin çağrıldığını merak ediyorum ; üst alert
veya üst çerçeve alert
işlevi, parent.abc();
iframe denirse?
window.postMessage()
(veya window.parent.postMessage()
) vardır. @Andrii cevap
Geçenlerde bunun neden işe yaramadığını öğrenmek zorunda kaldım.
Alt iframe'den aramak istediğiniz javascript'in ebeveynin başında olması gerekir. Gövde içindeyse, komut dosyası genel kapsamda kullanılamaz.
<head>
<script>
function abc() {
alert("sss");
}
</script>
</head>
<body>
<iframe id="myFrame">
<a onclick="parent.abc();" href="#">Click Me</a>
</iframe>
</body>
Umarım bu sorunla tekrar karşılaşan herkese yardımcı olur.
Bu yöntem güvenli bir şekilde cross-origin
iletişimi sağlar .
Üst sayfa koduna erişiminiz varsa, herhangi bir üst yöntem çağrılabilir ve herhangi bir veri doğrudan buradan iletilebilir Iframe
. İşte küçük bir örnek:
Ana sayfa:
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 kodu:
window.parent.postMessage({
'func': 'parentFunc',
'message': 'Message text from iframe.'
}, "*");
// Use target origin instead of *
GÜNCEL:
Güvenlik notu:
*
Diğer pencerenin belgesinin nerede olması gerektiğini biliyorsanız , her zaman belirli bir targetOrigin değil NOT . Belirli bir hedef sağlanamaması, ilgili kötü amaçlı sitelere gönderdiğiniz verileri açıklar ( ZalemCitizen tarafından yapılan yorum ).
Referanslar:
Mevcut cevabımla ilgisiz olduğu için bunu ayrı bir cevap olarak gönderdim.
Bir alt alana başvuruda bulunan iframe'den bir üst öğeye erişmek için bu sorun yakın zamanda yeniden kırpıldı ve mevcut düzeltmeler işe yaramadı.
Bu kez yanıt, üst sayfanın document.domain ve iframe'inin aynı olmasıydı. Bu , tam olarak aynı alanda birlikte var olduklarını düşünmek için aynı başlangıç politikası kontrollerini kandırır (alt alanlar farklı bir ana bilgisayar olarak kabul edilir ve aynı başlangıç politikası kontrolünde başarısız olur).
Aşağıdaki takın <head>
ana alanı ile eşleşmesi iframe'de sayfanın (sizin doctype için ayarlayın).
<script>
document.domain = "mydomain.com";
</script>
Bunun localhost geliştirilmesinde bir hata oluşturacağını lütfen unutmayın, bu nedenle hatayı önlemek için aşağıdaki gibi bir kontrol kullanın:
if (!window.location.href.match(/localhost/gi)) {
document.domain = "mydomain.com";
}
example.com
iframe'dir abc.example.com
ardından ebeveyn hem ve iframe çağırmalıdırdocument.domain = "example.com"
Kullanabilirsiniz
window.top
aşağıdakilere bakın.
<head>
<script>
function abc() {
alert("sss");
}
</script>
</head>
<body>
<iframe id="myFrame">
<a onclick="window.top.abc();" href="#">Click Me</a>
</iframe>
</body>
abc()
, yalnızca üst sayfada aksine iframe'defunction abc()
bildirilmişse çalışır . iframe'den üst belgeye ayrılır. window.top.abc()
Ash Clarke tarafından alt alanlar için verilen çözüm harika çalışıyor, ancak lütfen document.domain = "mydomain.com"; aynı orijin politikası kontrolleri bağlantısında belirtildiği gibi iframe sayfasının başlığında ve üst sayfanın başlığında
JavaScript DOM erişimi için uygulanan aynı başlangıç politikasının önemli bir uzantısı (ancak aynı kaynaklı kontrollerin diğer tatlarının çoğu için değil), ortak bir üst düzey alan adı paylaşan iki sitenin "aynı ana bilgisayar" ın başarısız olmasına rağmen iletişim kurmayı seçebilmesidir. ilgili document.domain DOM mülklerini, mevcut ana bilgisayar adlarının aynı nitelikli, sağ taraftaki parçasına karşılıklı olarak ayarlayarak kontrol edin. Örneğin, http://en.example.com/ ve http://fr.example.com/ her ikisi de document.domain öğesini "example.com" olarak ayarlarsa, bu noktadan itibaren, DOM manipülasyonunun amacı.
document.domain
nedir?
localhost
veya makinenin (tipik bir ip adresi 127.0.0.1
), url adres çubuğuna ne bağlı.
parent.abc () yalnızca güvenlik nedeniyle aynı alanda çalışır. Bu geçici çözümü denedim ve benim mükemmel çalıştı.
<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>
Bu yardımcı olur umarım. :)
Firefox ve Chrome ile şunları kullanabilirsiniz:
<a href="whatever" target="_parent" onclick="myfunction()">
Hem iframe hem de üst öğede işlevim varsa, üst işlev çağrılır.
Bu çözümlerin bazıları işe yarayabilirken, hiçbiri en iyi uygulamaları takip etmiyor. Birçoğu genel değişkenler atar ve kendinizi birden çok üst değişkene veya işleve çağrı yaparak dağınık, savunmasız bir ad alanına yönlendirebilirsiniz.
Bundan kaçınmak için bir modül deseni kullanın. Üst pencerede:
var myThing = {
var i = 0;
myFunction : function () {
// do something
}
};
var newThing = Object.create(myThing);
Ardından, iframe içinde:
function myIframeFunction () {
parent.myThing.myFunction();
alert(parent.myThing.i);
};
Bu, Crockford'un "Javascript: İyi Parçalar" metninin miras bölümünde açıklanan kalıplara benzer. Javascript'in en iyi uygulamaları için w3 sayfasından da daha fazla bilgi edinebilirsiniz. https://www.w3.org/wiki/JavaScript_best_practices#Avoid_globals