Tôi muốn gọi một hàm JavaScript cửa sổ cha từ iframe.
<script>
function abc()
{
alert("sss");
}
</script>
<iframe id="myFrame">
<a onclick="abc();" href="#">Call Me</a>
</iframe>
Tôi muốn gọi một hàm JavaScript cửa sổ cha từ iframe.
<script>
function abc()
{
alert("sss");
}
</script>
<iframe id="myFrame">
<a onclick="abc();" href="#">Call Me</a>
</iframe>
Câu trả lời:
<a onclick="parent.abc();" href="#" >Call Me </a>
Xem window.parent
Trả về một tham chiếu đến cha mẹ của cửa sổ hiện tại hoặc khung con.
Nếu một cửa sổ không có cha mẹ, thuộc tính mẹ của nó là một tham chiếu đến chính nó.
Khi một cửa sổ được tải trong một <iframe>
, <object>
hoặc <frame>
, cha mẹ của nó là cửa sổ với phần tử nhúng cửa sổ.
alert
s sẽ được gọi; alert
Hàm cha hoặc hàm iframe alert
, trong trường hợp parent.abc();
được gọi trên iframe?
window.postMessage()
(hoặc window.parent.postMessage()
) tồn tại. Kiểm tra câu trả lời @Andrii
Gần đây tôi đã phải tìm hiểu tại sao điều này không hoạt động quá.
Javascript mà bạn muốn gọi từ iframe con cần phải nằm trong đầu của cha mẹ. Nếu nó nằm trong phần thân, tập lệnh không có sẵn trong phạm vi toàn cầu.
<head>
<script>
function abc() {
alert("sss");
}
</script>
</head>
<body>
<iframe id="myFrame">
<a onclick="parent.abc();" href="#">Click Me</a>
</iframe>
</body>
Hy vọng điều này sẽ giúp bất cứ ai vấp phải vấn đề này một lần nữa.
Phương pháp này cho phép một cách an toàn cross-origin
giao tiếp .
Và nếu bạn có quyền truy cập vào mã trang cha thì bất kỳ phương thức cha nào cũng có thể được gọi cũng như mọi dữ liệu có thể được truyền trực tiếp từ đó Iframe
. Đây là một ví dụ nhỏ:
Trang phụ huynh:
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);
}
Mã iframe:
window.parent.postMessage({
'func': 'parentFunc',
'message': 'Message text from iframe.'
}, "*");
// Use target origin instead of *
CẬP NHẬT:
Lưu ý bảo mật:
Luôn cung cấp một mục tiêu cụ thể, KHÔNG *
, nếu bạn biết tài liệu của cửa sổ khác sẽ được đặt ở đâu. Không cung cấp mục tiêu cụ thể tiết lộ dữ liệu bạn gửi đến bất kỳ trang web độc hại nào quan tâm (nhận xét của ZalemCitizen ).
Người giới thiệu:
Tôi đã đăng bài này như một câu trả lời riêng vì nó không liên quan đến câu trả lời hiện có của tôi.
Vấn đề này gần đây đã được cắt lại để truy cập cha mẹ từ iframe tham chiếu tên miền phụ và các bản sửa lỗi hiện tại không hoạt động.
Lần này, câu trả lời là sửa đổi document.domain của trang mẹ và iframe giống nhau. Điều này sẽ đánh lừa các kiểm tra chính sách nguồn gốc tương tự khi nghĩ rằng chúng cùng tồn tại trên cùng một tên miền (tên miền phụ được coi là một máy chủ khác nhau và không kiểm tra chính sách nguồn gốc giống nhau).
Chèn phần sau vào <head>
trang trong iframe để khớp với miền mẹ (điều chỉnh cho loại tài liệu của bạn).
<script>
document.domain = "mydomain.com";
</script>
Xin lưu ý rằng điều này sẽ gây ra lỗi khi phát triển localhost, vì vậy hãy sử dụng kiểm tra như sau để tránh lỗi:
if (!window.location.href.match(/localhost/gi)) {
document.domain = "mydomain.com";
}
example.com
iframe abc.example.com
, thì cả cha và iframe đều phải gọidocument.domain = "example.com"
Bạn có thể dùng
window.top
xem những điều sau đây
<head>
<script>
function abc() {
alert("sss");
}
</script>
</head>
<body>
<iframe id="myFrame">
<a onclick="window.top.abc();" href="#">Click Me</a>
</iframe>
</body>
abc()
sẽ chỉ hoạt động nếu function abc()
được khai báo trong iframe trái ngược với trên trang mẹ. window.top.abc()
thoát ra khỏi iframe vào tài liệu gốc.
Một bổ sung cho những người cần nó. Giải pháp của Ash Clarke không hoạt động nếu họ đang sử dụng các giao thức khác nhau, vì vậy hãy chắc chắn rằng nếu bạn đang sử dụng SSL, iframe của bạn cũng đang sử dụng SSL hoặc nó sẽ phá vỡ chức năng. Giải pháp của anh ấy đã làm việc cho chính tên miền, vì vậy cảm ơn vì điều đó.
Giải pháp do Ash Clarke đưa ra cho các tên miền phụ hoạt động rất tốt, nhưng xin lưu ý rằng bạn cần bao gồm document.domain = "mydomain.com"; trong cả phần đầu của trang iframe và phần đầu của trang mẹ, như đã nêu trong liên kết, cùng kiểm tra chính sách xuất xứ
Một tiện ích mở rộng quan trọng cho cùng một chính sách nguồn gốc được triển khai để truy cập JavaScript DOM (nhưng không phải cho hầu hết các hương vị khác của kiểm tra cùng nguồn gốc) là hai trang web chia sẻ một tên miền cấp cao chung có thể chọn liên lạc mặc dù không có "cùng một máy chủ" kiểm tra bằng cách đặt lẫn nhau thuộc tính DOM.d.domain tương ứng của chúng thành cùng một phần bên phải, đủ điều kiện của tên máy chủ hiện tại của chúng. Ví dụ: nếu http://en.example.com/ và http://fr.example.com/ đều đặt document.domain thành "example.com", thì từ thời điểm đó được coi là cùng nguồn gốc cho mục đích của thao tác DOM.
document.domain
gì?
localhost
hoặc địa chỉ IP của máy (thông thường 127.0.0.1
), tùy thuộc vào những gì trong thanh địa chỉ url.
Parent.abc () sẽ chỉ hoạt động trên cùng một tên miền do mục đích bảo mật. tôi đã thử cách giải quyết này và tôi đã làm việc hoàn hảo.
<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>
Hi vọng điêu nay co ich. :)
Với Firefox và Chrome, bạn có thể sử dụng:
<a href="whatever" target="_parent" onclick="myfunction()">
Nếu chức năng của tôi có mặt cả trong iframe và cha mẹ, thì cha mẹ sẽ được gọi.
Trong khi một số giải pháp này có thể hoạt động, không ai trong số họ thực hiện theo các thực tiễn tốt nhất. Nhiều người gán các biến toàn cục và bạn có thể thấy mình thực hiện các cuộc gọi đến nhiều biến cha hoặc hàm, dẫn đến một không gian tên dễ bị lộn xộn.
Để tránh điều này, sử dụng một mô-đun mô-đun. Trong cửa sổ cha mẹ:
var myThing = {
var i = 0;
myFunction : function () {
// do something
}
};
var newThing = Object.create(myThing);
Sau đó, trong iframe:
function myIframeFunction () {
parent.myThing.myFunction();
alert(parent.myThing.i);
};
Điều này tương tự với các mẫu được mô tả trong chương Kế thừa của văn bản tinh dịch của Crockford, "Javascript: Các bộ phận tốt." Bạn cũng có thể tìm hiểu thêm tại trang của w3 để biết các thực tiễn tốt nhất của Javascript. https://www.w3.org/wiki/JavaScript_best_practices#Avoid_globals