2012-05-14 48 views
13

Tôi đang cố gắng gọi một hàm javascript được xác định trong phụ huynh từ cửa sổ con. Tôi có hai tập tin như thế này:JavaScript window.opener gọi chức năng cha mẹ

phụ huynh:

<html> 
<head> 
<title>Test</title> 
<script type="text/javascript"> 
function foo() { 
alert ("Hello from parent!"); 
} 
function doStuff() { 
var w = window.open("testa.html"); 
} 
</script> 
</head> 
<body> 
<input type="button" value="open" onClick="doStuff();" /> 
</body> 
</html> 

Và con:

<html> 
<head> 
<title>Test A</title> 
<script type="text/javascript"> 
function get() { 
window.opener.foo(); 
} 
</script> 
</head> 
<body> 
<input type="button" value="Call Parent" onClick="get();" /> 
</body> 
</html> 

tôi có thể không, cho cuộc đời của tôi, gọi hàm foo từ quá trình đứa trẻ. Tôi nghĩ rằng điều này nên có thể với đối tượng window.opener, nhưng tôi dường như không thể thực hiện công việc này. Bất kỳ đề xuất?

+4

Bạn có đang truy cập các trang này qua 'http: //' hoặc 'tệp: ///' không? Giao thức 'file' không có nguồn gốc, vì vậy bạn sẽ luôn thất bại [SOP] (http://en.wikipedia.org/wiki/Same_origin_policy), không thể truy cập' mở'. –

+0

Hóa ra đó là vấn đề - tôi chỉ đơn giản là truy cập chúng qua tập tin: //. Khi tôi ném chúng vào thư mục http: //, nó hoạt động tốt. – RPIBuckHunter

+0

http: // và tệp: /// là gì? làm thế nào để thay đổi nó từ một đến khác. Tôi có cùng một vấn đề? Hãy giúp tôi. –

Trả lời

16

Đảm bảo bạn đang truy cập thông qua http: // vì vậy chính sách xuất xứ giống nhau sẽ vượt qua và bạn có thể truy cập mở từ trẻ. Nó sẽ không hoạt động nếu bạn chỉ sử dụng file: //.

+0

Nó có hoạt động với https: // không? – Muthu

1

Trả lời câu hỏi của Rahul:

Mọi trình duyệt đều có thể tải trang từ máy chủ hoặc từ hệ thống tệp cục bộ. Để tải tệp từ hệ thống tệp cục bộ, bạn nên đặt cho trình duyệt địa chỉ như thế này file://[path], trong đó [đường dẫn] là đường dẫn tuyệt đối tới tệp trong hệ thống tệp (bao gồm ký tự ổ đĩa trên Windows, xem http://blogs.msdn.com/b/ie/archive/2006/12/06/file-uris-in-windows.aspx để biết chi tiết).

Để tải tệp từ máy chủ HTTP cục bộ (nếu có), bạn nên đặt địa chỉ như thế này http://localhost:[port]/[path], trong đó [cổng] là cổng nơi máy chủ của bạn đang chạy (mặc định là 80) và [đường dẫn] là đường dẫn của tệp liên quan đến thư mục gốc của tài liệu của máy chủ. Thư mục gốc của tài liệu phụ thuộc vào cấu hình máy chủ.

Vì vậy, như bạn thấy, cùng một tệp cục bộ có thể được tải xuống trình duyệt theo hai cách. Tuy nhiên có sự khác biệt lớn giữa hai cách này. Trong trường hợp đầu tiên, trình duyệt không sử dụng giao thức HTTP để tải tệp và do đó thiếu nhiều thứ cần thiết cho các cơ chế khác nhau để hoạt động chính xác. Ví dụ AJAX không hoạt động với các tệp cục bộ, vì trạng thái phản hồi HTTP không phải là 200, v.v.

Trong ví dụ cụ thể này, cơ chế bảo mật trình duyệt không nhận được thông tin gốc và ngăn chặn truy cập cửa sổ chính.

Các vấn đề liên quan