it-swarm-id.com

Bisakah saya meneruskan variabel JavaScript ke jendela browser lain?

Saya memiliki halaman yang memunculkan jendela browser popup. Saya memiliki variabel JavaScript di jendela browser induk dan saya ingin meneruskannya ke jendela browser yang muncul.

Apakah ada cara untuk melakukan ini? Saya tahu ini bisa dilakukan lintas bingkai di jendela browser yang sama, tetapi saya tidak yakin apakah itu bisa dilakukan di jendela browser.

63
Tom Kidd

Asalkan windows berasal dari domain keamanan yang sama, dan Anda memiliki referensi ke jendela lain, ya.

Metode open () Javascript mengembalikan referensi ke jendela yang dibuat (atau jendela yang ada jika menggunakan kembali yang sudah ada). Setiap jendela yang dibuat sedemikian rupa membuat properti diterapkan padanya "window.opener" yang menunjuk ke jendela yang membuatnya.

Entah kemudian dapat menggunakan DOM (tergantung keamanan) untuk mengakses properti yang lain, atau dokumen-dokumennya, bingkai dll.

39
MarkR

Menempatkan kode pada masalah ini, Anda dapat melakukan ini dari jendela induk:

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

atau ini dari jendela baru:

var myVariable = window.opener.thisIsAnObject;

Saya lebih suka yang terakhir, karena Anda mungkin harus menunggu halaman baru untuk memuat, sehingga Anda dapat mengakses elemen-elemennya, atau apa pun yang Anda inginkan.

93
Victor

Ya, skrip dapat mengakses properti windows lain dalam domain yang sama dengan yang mereka miliki (biasanya diperoleh melalui window.open/opener dan window.frames/parent). Biasanya lebih mudah untuk memanggil fungsi yang didefinisikan di jendela lain daripada mengotak-atik variabel secara langsung.

Namun, windows dapat mati atau bergerak, dan browser menghadapinya secara berbeda ketika mereka melakukannya. Pastikan jendela (a) masih terbuka (! Window.closed) dan (b) memiliki fungsi yang Anda harapkan tersedia, sebelum Anda mencoba menyebutnya.

Nilai-nilai sederhana seperti string baik-baik saja, tetapi umumnya bukan ide yang bagus untuk melewatkan objek kompleks seperti fungsi, elemen DOM dan penutupan di antara jendela. Jika jendela anak menyimpan objek dari pembuka, maka pembuka ditutup, objek itu bisa menjadi 'mati' (di beberapa browser seperti IE), atau menyebabkan kebocoran memori. Kesalahan aneh dapat terjadi.

7
bobince

Melewati variabel antar windows (jika windows Anda berada di domain yang sama) dapat dengan mudah dilakukan melalui: 

  1. Kue 
  2. penyimpanan lokal. Pastikan browser Anda mendukung localStorage, dan lakukan pemeliharaan variabel dengan benar (tambah/hapus/hapus) untuk menjaga localStorage bersih. 
3
Roman M

Anda dapat melewatkan variabel, dan merujuk ke hal-hal di jendela induk dengan cukup mudah:

// 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!");   
}
2
knut

Orang dapat meneruskan pesan dari jendela 'induk' ke jendela 'anak':

di 'jendela induk' buka anak

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

untuk diganti sesuai dengan konteksnya

Di 'anak'

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

Tes if harus diubah sesuai konteks

2
Brault Gilbert

Di jendela induk Anda:

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

Kemudian di 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']);

Ada banyak kesalahan yang berpotensi Anda lakukan di parsing pasangan kunci/nilai Anda, tetapi saya tidak memasukkannya di sini. Mungkin seseorang dapat memberikan rutin parsing string kueri Javascript yang lebih inklusif dalam jawaban nanti.

2
Grant Wagner

Ya, itu bisa dilakukan selama kedua jendela berada di domain yang sama. Fungsi window.open () akan mengembalikan pegangan ke jendela baru. Jendela anak dapat mengakses jendela induk menggunakan elemen "pembuka" DOM.

1
Jordan Mack

Anda dapat menggunakan window.name sebagai transportasi data antar windows - dan berfungsi lintas domain juga. Tidak didukung secara resmi, tetapi dari pemahaman saya, sebenarnya berfungsi dengan sangat baik lintas browser.

Info lebih lanjut di sini di Stackoverflow Post ini

0
Brad Parks

Atau, Anda dapat menambahkannya ke URL dan membiarkan bahasa skrip (PHP, Perl, ASP, Python, Ruby, apa pun) menanganinya di sisi lain. Sesuatu seperti:

var x = 10;
window.open('mypage.php?x='+x);
0
Milan Babuškov

Saya telah berjuang untuk berhasil melewati argumen ke jendela yang baru dibuka.
Inilah yang saya kemukakan:

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)
    }
}

Contoh panggilan:

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

Contoh langsung

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

0
singe3