2008-09-17 41 views
60

Tôi có một trang tạo ra cửa sổ trình duyệt bật lên. Tôi có một biến JavaScript trong cửa sổ trình duyệt cha mẹ và tôi muốn chuyển nó vào cửa sổ trình duyệt hiện lên.Tôi có thể chuyển biến JavaScript sang một cửa sổ trình duyệt khác không?

Có cách nào để thực hiện việc này không? Tôi biết điều này có thể được thực hiện trên các khung trong cùng một cửa sổ trình duyệt nhưng tôi không chắc chắn nó có thể được thực hiện trên các cửa sổ trình duyệt hay không.

Trả lời

38

Cung cấp các cửa sổ là từ cùng một miền bảo mật và bạn có tham chiếu đến cửa sổ khác, có.

Phương thức open() của Javascript trả về một tham chiếu đến cửa sổ được tạo (hoặc cửa sổ hiện tại nếu nó sử dụng lại cửa sổ hiện có). Mỗi cửa sổ được tạo theo cách như vậy sẽ nhận được một thuộc tính được áp dụng cho nó "window.opener" trỏ đến cửa sổ tạo ra nó. sau đó

Hoặc có thể sử dụng DOM (an ninh tùy) để truy cập vào thuộc tính của một trong những khác, hoặc các tài liệu của nó, khung, vv

+12

Mọi thứ đã thay đổi kể từ khi câu hỏi này được hỏi. Bây giờ cũng có thể, trên [các trình duyệt mới hơn] (http://caniuse.com/#feat=x-doc-messaging), để truyền các thông điệp giữa các cửa sổ trên một miền bảo mật * khác *, thông qua các lệnh gọi đến 'window.postMessage '. – Brian

-2

Chức năng window.open() cũng sẽ cho phép điều này nếu bạn có tham chiếu đến cửa sổ được tạo, miễn là nó nằm trên cùng một miền. Nếu biến được sử dụng phía máy chủ, bạn nên sử dụng biến $ _SESSION (giả sử bạn đang sử dụng PHP).

1

Vâng, nó có thể được thực hiện miễn là cả hai cửa sổ đang ở trên cùng một tên miền. Hàm window.open() sẽ trả về một tay cầm cho cửa sổ mới. Cửa sổ con có thể truy cập cửa sổ cha bằng cách sử dụng phần tử DOM "opener".

0

Ngoài ra, bạn có thể thêm nó vào URL và để ngôn ngữ kịch bản (PHP, Perl, ASP, Python, Ruby, bất cứ điều gì) xử lý nó ở phía bên kia. Một cái gì đó như:

var x = 10; 
window.open('mypage.php?x='+x); 
2

Trong cửa sổ cha mẹ của bạn:

var yourValue = 'something'; 
window.open('/childwindow.html?yourKey=' + yourValue); 

Sau đó, trong childwindow.html:

var query = location.search.substring(1); 
var parameters = {}; 
var keyValues = query.split(/&/); 
for (var keyValue in keyValues) { 
    var keyValuePairs = keyValue.split(/=/); 
    var key = keyValuePairs[0]; 
    var value = keyValuePairs[1]; 
    parameters[key] = value; 
} 

alert(parameters['yourKey']); 

Có khả năng là rất nhiều lỗi kiểm tra bạn nên làm trong phân tích cú pháp các cặp khóa/giá trị của bạn nhưng tôi không bao gồm nó ở đây. Có lẽ ai đó có thể cung cấp một thói quen phân tích chuỗi truy vấn Javascript bao gồm hơn trong một câu trả lời sau.

80

Đưa mã để vấn đề này, bạn có thể làm điều này từ cửa sổ cha mẹ:

var thisIsAnObject = {foo:'bar'}; 
var w = window.open("http://example.com"); 
w.myVariable = thisIsAnObject; 

hay này từ cửa sổ mới:

var myVariable = window.opener.thisIsAnObject; 

tôi thích sau này, vì có thể bạn sẽ cần để chờ trang mới tải, để bạn có thể truy cập các phần tử của trang hoặc bất kỳ thứ gì bạn muốn.

+0

tôi không hiểu {foo: 'bar'}. bạn có thể giúp tôi về điều này không? –

+1

@MasoudSahabi, 'var x = {foo: 'bar'}' chỉ là một cú pháp nhỏ gọn để tạo một đối tượng. Nó giống như 'var x = new Object(); x.foo = 'bar'; ' – sergiopereira

+0

Tôi đang sử dụng cái đầu tiên và nó hoạt động tốt trong Chrome nhưng IE dường như phàn nàn. Và rất khó để có được một điểm dừng để đạt được. – styfle

7

Có, tập lệnh có thể truy cập các thuộc tính của các cửa sổ khác trong cùng một miền mà chúng có tay cầm (thường đạt được thông qua window.open/opener và window.frames/parent). Nó thường dễ quản lý hơn để gọi các hàm được định nghĩa trên cửa sổ khác chứ không phải fiddle với các biến trực tiếp.

Tuy nhiên, cửa sổ có thể bị chết hoặc di chuyển và các trình duyệt xử lý vấn đề này một cách khác nhau khi thực hiện. Kiểm tra xem cửa sổ (a) vẫn đang mở (! Window.closed) và (b) có chức năng bạn mong đợi có sẵn, trước khi bạn cố gắng gọi nó.

Các giá trị đơn giản như chuỗi là tốt, nhưng nói chung không phải là ý tưởng hay khi truyền các đối tượng phức tạp như hàm, phần tử DOM và đóng cửa giữa các cửa sổ. Nếu một cửa sổ con lưu trữ một đối tượng từ công cụ mở của nó, thì trình mở sẽ đóng lại, đối tượng đó có thể trở thành 'đã chết' (trong một số trình duyệt như IE) hoặc gây rò rỉ bộ nhớ. Lỗi lạ có thể xảy ra.

-1

Có các trình duyệt xóa tất cả ref. cho một cửa sổ. Vì vậy, bạn phải tìm kiếm một ClassName của một cái gì đó trên cửa sổ chính hoặc sử dụng cookie như ref tự chế Javascript.

Tôi có một đài phát thanh trên trang dự án của mình. Và sau đó bạn bật cho đài phát thanh nó bắt đầu trong một cửa sổ popup và tôi kiểm soát các liên kết cửa sổ chính trên trang chính và hiển thị trạng thái chơi và trong FF nó dễ dàng nhưng trong MSIE không dễ dàng như vậy cả. Nhưng nó có thể được thực hiện.

3

biến Đi qua giữa các cửa sổ (nếu cửa sổ của bạn đang ở trên cùng một tên miền) có thể dễ dàng thực hiện thông qua:

  1. Cookies
  2. localStorage. Chỉ cần đảm bảo trình duyệt của bạn hỗ trợ localStorage, và thực hiện quyền bảo trì biến (thêm/xóa/xóa) để giữ cho localStorage luôn sạch sẽ.
2

Bạn có thể vượt qua các biến, và tài liệu tham khảo để mọi thứ trong cửa sổ cha mẹ khá dễ dàng:

// open an empty sample window: 
var win = open(""); 
win.document.write("<html><body><head></head><input value='Trigger handler in other window!' type='button' id='button'></input></body></html>"); 

// attach to button in target window, and use a handler in this one: 
var button = win.document.getElementById('button'); 

button.onclick = function() { 
    alert("I'm in the first frame!"); 
} 
+0

Như được viết này sẽ không hoạt động trong thế giới thực nơi mọi người đang chạy adblock vv. Bằng cách thêm các tham số vào mở để mở nó trong một cửa sổ riêng biệt (thay vì tab, như tôi đã cấu hình FF để làm), tôi đã có thể để làm việc này trong firefox. Nhưng cửa sổ bật lên đã bị chặn trong Chrome. Vì vậy, nó đơn giản và loại công việc, nhưng nó là một chút xa một giải pháp khả thi. –

0

tôi đã đấu tranh để vượt qua thành công luận vào cửa sổ mới được mở ra.
Dưới đây là những gì tôi đã đưa ra:

function openWindow(path, callback /* , arg1 , arg2, ... */){ 
    var args = Array.prototype.slice.call(arguments, 2); // retrieve the arguments 
    var w = window.open(path); // open the new window 
    w.addEventListener('load', afterLoadWindow.bind(w, args), false); // listen to the new window's load event 
    function afterLoadWindow(/* [arg1,arg2,...], loadEvent */){ 
     callback.apply(this, arguments[0]); // execute the callbacks, passing the initial arguments (arguments[1] contains the load event) 
    } 
} 

Ví dụ gọi:

openWindow("/contact",function(firstname, lastname){ 
    this.alert("Hello "+firstname+" "+lastname); 
}, "John", "Doe"); 

Sống dụ

http://jsfiddle.net/rj6o0jzw/1/

0

Bạn có thể sử dụng window.name như một tran dữ liệu thể thao giữa các cửa sổ - và nó hoạt động qua miền là tốt. Không được hỗ trợ chính thức, nhưng từ sự hiểu biết của tôi, thực sự hoạt động rất tốt qua trình duyệt.

More info here on this Stackoverflow Post

1

Người ta có thể vượt qua một tin nhắn từ cửa sổ 'mẹ' vào cửa sổ 'con':

trong 'cửa sổ cha mẹ' mở con

var win = window.open(<window.location.href>, '_blank');  
     setTimeout(function(){ 
        win.postMessage(SRFBfromEBNF,"*") 
        },1000); 
    win.focus(); 

để được được thay thế theo ngữ cảnh

Trong 'con'

window.addEventListener('message', function(event) { 
     if(event.srcElement.location.href==window.location.href){ 
     /* do what you want with event.data */ 
     } 
    }); 

Nếu thử nghiệm phải được thay đổi theo ngữ cảnh

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