it-swarm-tr.com

Bir JavaScript değişkenini başka bir tarayıcı penceresine iletebilir miyim?

Pop-up tarayıcı penceresini açan bir sayfam var. Ana tarayıcı penceresinde bir JavaScript değişkenim var ve açılır tarayıcı penceresine iletmek istiyorum.

Bunu yapmanın bir yolu var mı? Aynı tarayıcı penceresindeki çerçevelerde yapılabileceğini biliyorum ancak tarayıcı pencerelerinde yapılıp yapılmadığından emin değilim.

63
Tom Kidd

Sağlanan pencereler aynı güvenlik etki alanından ve diğer pencereye bir referansınız var, evet.

Javascript'in open () yöntemi, oluşturulan pencereye (veya mevcut olanı kullanıyorsa mevcut pencereye) bir başvuru döndürür. Bu şekilde yaratılan her pencere, kendisini yaratan pencereye işaret eden "window.opener" a uygulanan bir özellik alır.

Daha sonra, diğerinin özelliklerine veya belgelerine, çerçevelerine vb. Erişmek için DOM'yi (güvenliğe bağlı olarak) kullanabilirsiniz.

39
MarkR

Maddeye kod koyarak, bunu ana pencereden yapabilirsiniz:

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

veya bu yeni pencereden:

var myVariable = window.opener.thisIsAnObject;

İkincisini tercih ediyorum, çünkü yeni sayfanın yüklenmesini beklemeniz gerekecek, böylece öğelerine veya istediğiniz herhangi bir öğeye erişebilirsiniz.

93
Victor

Evet, komut dosyaları, aynı etki alanındaki diğer pencerelerin tanıtıcısına sahip oldukları özelliklere erişebilir (genellikle window.open/opener ve window.frames/parent aracılığıyla kazanılır). Doğrudan değişkenlerle çalışmak yerine, diğer pencerede tanımlanan işlevleri çağırmak genellikle daha yönetilebilirdir.

Ancak, pencereler ölebilir veya devam edebilir ve tarayıcılar ne zaman farklı bir şekilde bununla ilgilenir. Bir pencerenin (a) hala açık olduğunu kontrol edin (! Window.closed) ve (b) çağırmayı denemeden önce beklediğiniz işleve sahip olduğunu kontrol edin.

Dizeler gibi basit değerler iyidir, ancak genellikle işlevler, DOM öğeleri ve pencereler arasındaki kapanışlar gibi karmaşık nesneleri iletmek iyi bir fikir değildir. Bir alt pencere bir nesneyi açıcısından saklarsa, açıcı kapanır, bu nesne 'ölü' hale gelebilir (IE gibi bazı tarayıcılarda) veya bellek sızıntısına neden olabilir. Tuhaf hatalar ortaya çıkabilir.

7
bobince

Değişkenlerin pencereler arasında geçişi (eğer pencereleriniz aynı etki alanındaysa) aşağıdakiler vasıtasıyla kolayca yapılabilir: 

  1. Kurabiye 
  2. yerel depolama. Tarayıcınızın localStorage özelliğini desteklediğinden emin olun ve localStorage ürününü temiz tutmak için değişken bakım hakkını kullanın (ekleyin/silin/kaldırın). 
3
Roman M

Değişkenleri iletebilir ve ana penceredeki nesnelere kolayca başvurabilirsiniz:

// 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

Bir 'ana' penceresinden 'alt' penceresine bir mesaj iletilebilir:

'ana pencerede' çocuğu aç

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

bağlama göre değiştirilecek

'Çocuk' da

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

İf testi içeriğe göre değiştirilmeli

2
Brault Gilbert

Ana pencerenizde:

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

Sonra childwindow.html dosyasında:

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

Anahtar/değer çiftlerinizi ayrıştırırken yapmanız gereken çok fazla hata kontrolü var, ancak buraya dahil etmiyorum. Belki birileri daha kapsamlı bir Javascript sorgu dizesi daha sonraki bir cevapta rutin ayrıştırma sağlayabilir.

2
Grant Wagner

Evet, her iki pencere de aynı etki alanında olduğu sürece yapılabilir. Window.open () işlevi, yeni pencereye bir tanıtıcı döndürür. Alt pencere DOM penceresine "açıcı" kullanarak ana pencereye erişebilir.

1
Jordan Mack

window.name öğesini pencereler arasında veri aktarımı olarak kullanabilirsiniz - ve etki alanları arası da çalışır. Resmen desteklenmiyor, ama benim anladığım kadarıyla, aslında tarayıcıda çok iyi çalışıyor.

Bu Stackoverflow Mesajında ​​Daha Fazla Bilgi

0
Brad Parks

Alternatif olarak, URL’ye ekleyebilir ve komut dosyası dilinin (PHP, Perl, ASP, Python, Ruby, neyse) diğer tarafta işlemesini sağlayabilirsiniz. Gibi bir şey:

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

Yeni açılan pencereye başarılı bir şekilde argümanları iletmek için mücadele ettim.
İşte geldiğim şey:

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

Örnek arama:

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

Canlı örnek

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

0
singe3