2012-02-20 11 views
7

Quando si crea una nuova finestra del browser, si passa un nome come questo:JavaScript - Finestra del browser di riferimento per nome?

myWindow = window.open('http://www.google.com', "googleWindow"); 

Successivamente è possibile accedere alla finestra dalla variabile è stato salvato come:

myWindow.close(); 

E 'possibile accedere e manipolare una finestra con il suo nome (googleWindow) al posto della variabile?

Se non è possibile, qual è il punto che assegna i nomi delle finestre?

risposta

17

No. Senza un riferimento alla finestra, non è possibile trovarlo di nuovo, per nome o in altro modo. Non c'è raccolta di finestre.

UPDATE: Ecco come si potrebbe fare da soli:

var windows = {}; 
function openWindow(url, name, features) { 
    windows[name] = window.open(url, name, features); 
    return windows[name]; 
} 

Ora, openWindow sarà sempre aprire la finestra, e se la finestra esiste già, caricherà l'URL dato in quella finestra e ritorno un riferimento a quella finestra. Ora è possibile anche implementare findWindow:

function findWindow(name) { 
    return windows[name]; 
} 

che restituirà alla finestra se esiste, o undefined.

Si dovrebbe anche avere closeWindow, in modo da non tenere i riferimenti a Windows che voi stessi Iniziato:

function closeWindow(name) { 
    var window = windows[name]; 
    if(window) { 
     window.close(); 
     delete windows[name]; 
    } 
} 

Se non è possibile, qual è il punto di dare nomi delle finestre?

Il nome viene utilizzato internamente dal browser per gestire Windows. Se chiami window.open con lo stesso nome, non aprirà una nuova finestra, ma invece caricherà l'URL nella finestra precedentemente aperta. Ci sono un paio di cose, da MDN window.open():

Se una finestra con il nome strWindowName esiste già, allora strURL viene caricato nella finestra esistente. In questo caso il valore di ritorno del metodo è la finestra esistente e strWindowFeatures viene ignorato. Fornire una stringa vuota per strUrl è un modo per ottenere un riferimento a una finestra aperta con il suo nome senza cambiare la posizione della finestra. Per aprire una nuova finestra su ogni chiamata di window.open(), usa il valore speciale _blank per strWindowName.

+0

buona spiegazione e work-around. Grazie! –

+0

Può andare bene per Windows ma non funziona sul mio sistema linux ... non so se sia un riferimento a Microsoft Windows o no, ma a volte quello che succede sulla mia macchina Linux avviene anche sui Mac ... – CrandellWS

+0

A partire da Google Chrome 41, questo metodo ha un effetto collaterale negativo: ogni volta che si esegue window.open(), la finestra già aperta avrà lo stato attivo. Non c'è attualmente alcuna soluzione che possa trovare per prevenire questo comportamento, che mi sta dando grattacapi. Voglio solo avere un riferimento a quella finestra, non voglio che si concentri. chiamare window.open() con url vuoto non funziona. – schlingel

14

Linus G Thiel dice che non è possibile farlo in javascript. Stranamente, la sua risposta elenca un estratto di MDN che sembra come se dicesse come farlo. La linea era:

"Providing an empty string for strUrl is a way to get a reference to 
    an open window by its name without changing the window's location." 

Ho provato questo e funziona per me.

winref = window.open('', 'thatname', '', true); 
winref.close(); 

Tuttavia, questo può funzionare solo se hai aperto la finestra dalla tua pagina. E se è vero, allora è quasi inutile fare una finestra. Aprire solo per ottenere il riferimento. Probabilmente hai già il riferimento, in quel caso.

+2

In realtà non si basa su chi l'ha aperto, si basa su quale origine o dominio condividono le pagine. – aredridel

+0

Puoi cancellare il contenuto con 'winref.document.close();' e aggiungere nuovi contenuti con 'winref.document.write ('Nuovo contenuto');' – CrandellWS

3

soluzione di Mark Goldfain non funziona più come scritto a partire dal 9/8/2015

Come da this w3 specification,

Se il primo argomento è la stringa vuota, allora l'argomento url deve essere interpretato come "about: blank".

Credo che questa sia una differenza tra HTML4 e HTML5.

IE e Chrome hanno aggiornato questo comportamento per soddisfare questa specifica, mentre la soluzione di Mark funziona ancora su FF (anche se immagino che lo risolveranno presto). Alcune settimane fa questo ha funzionato su tutti i principali browser.

Il mio problema particolare riguardava il controllo della finestra durante la navigazione, dove l'apertura della finestra di chat era nera e la maggior parte del codice sulla pagina - ridefinendo window.open era proprio fuori. La mia soluzione prevedeva di chiamare la finestra vuota con il riferimento prima del chiamando la funzione che ha chiamato la finestra di chat. Quando l'utente si è allontanato dalla pagina, sono stato in grado di fare affidamento sul fatto che le finestre diverse dal genitore originale non sono autorizzate a modificare la finestra secondaria, quindi sono stato in grado di utilizzare la soluzione di Mark Goldfain invariata.

3

La soluzione fornita da Mark Goldfain può essere modificata per funzionare con i nuovi browser, almeno per aprire una finestra e mantenere un riferimento ad essa tra l'aggiornamento della pagina.

var winref = window.open('', 'MyWindowName', '', true); 
if(winref.location.href === 'about:blank'){ 
    winref.location.href = 'http://example.com'; 
} 

o in formato funzione

function openOnce(url, target){ 
    // open a blank "target" window 
    // or get the reference to the existing "target" window 
    var winref = window.open('', target, '', true); 

    // if the "target" window was just opened, change its url 
    if(winref.location.href === 'about:blank'){ 
     winref.location.href = url; 
    } 
    return winref; 
} 
openOnce('http://example.com', 'MyWindowName'); 
0

ho finito per usare il seguente:

var newwindows = {}; 
function popitup(url, nm) { 
    if ((newwindows[nm] == null) || (newwindows[nm].closed)) { 
    newwindows[nm] = window.open(url, nm, 'width=1200,height=650,scrollbars=yes,resizable=yes'); 
    } 
    newwindows[nm].focus(); 
} 

poi fatto riferimento utilizzando:

 <button type="button" onclick="popitup('url/link.aspx?a=bc',this.value)" value="uniqueName">New</button> 
+0

Perché non semplificare la logica e mettere 'newwindows [nm]. focus(); 'al di fuori della logica se del tutto? Sembra ridondante per eseguire la stessa azione in due percorsi logici diversi, quando il risultato è la stessa azione in entrambi i casi. – GoldBishop

Problemi correlati