Newsgroup: it.comp.lang.javascript
Titolo: sapere se la finestra che aperto un popup è ancora aperta

Ho una pagina (diciamo 1.html, e supponiamo che il nome della finestra 
sia 'madre') che, cliccando su un link, ne apre una seconda (diciamo 
2.html, e supponiamo che il nome della finestra sia 'figlia'). Cliccando 
su un link di 2.html dovrei tornare su 1.html e chiudere 2.html.
Il tutto funziona se riapro con window.open 1.html in 'madre', per poi 
chiudere il popup.
Solo che ora volevo raffinare la cosa: se 1.html è stata chiusa, o se è 
cambiata la pagina che contiene, apro 1.html con window.open, altrimenti 
mi limito a chiudere 2.html (perché aprire una pagina, se già è presente 
dove dovrebbe essere?). Quindi, se opener è nullo, vuol dire che devo 
riaprire la pagina (è stata chiusa), ma in caso contrario?
E qui viene il problema: se se nella finestra che contiene 1.html apro 
una pagina di un altro dominio, opener.location.href genera un errore 
(Errore: Permesso negato a di ottenere la proprietà Location.href), e lo 
script si interrompe. Se lavorassi in java, farei qualcosa tipo:
function paginaAncoraAperta()
  {
   if (opener==null)
    {return false;}
   else
    {
     try
      {return opener.location.href.endsWith("1.html");
//lo so, non c'è endsWith in javascript, ma non è questo il mio problema
     catch (PermessoNegato p)
      {return false;}
    }
  }
Ma javascript non supporta la gestione delle eccezioni. E io capisco 
benissino che la pagina è stata cambiata dall'errore ottenuto, ma c'è n 
modo di farlo capire a javascript? Notate che a me non interessa 
opener.location.href in sé, ma solo sapere se la pagina originale è 
ancora accessibile (mi basterebbe un valore booleano).
Esempio di codice:
pagina 1.html:
<html>
<body onLoad="
window.name
='madre';">
Clicca <a 
href="javascript:window.open('2.html','popup','scrollbars=yes,resizable=yes,status=yes,location=yes,toolbar=yes').focus();">qui</a> 
per aprire il popup
</body></html>
pagina 2.html:
<html><head>
<script type="text/javascript">
function riapri()
  {
   if (opener==null)
    {
     alert("La pagina madre e' stata chiusa");
 
window.open('1.html','madre','scrollbars=yes,resizable=yes,status=yes,location=yes,toolbar=yes').focus();
    }
   else
    {
     var madre=String(opener.location.href);
//questa riga genera errore se nella pagina madre è stata aperta una 
pagina di un altro dominio
     alert("madre="+madre);
     if (madre.lastIndexOf("1.html")+"1.html".length!=madre.length)
      {
       alert("La pagina madre e' cambiata");
 
window.open('1.html','madre','scrollbars=yes,resizable=yes,status=yes,location=yes,toolbar=yes').focus();
      }
     else
      {alert("La pagina madre esiste e non e' cambiata");}
    }
  }
</script>
</head>
<body>
Clicca <a href="javascript:riapri();">qui</a> per riaprire la pagina 
madre</body></html>

 Ma javascript non supporta la gestione delle eccezioni. 
come no ... prova con un qualcosa del tipo:
try {
	alert(opener.location.href);
	} catch(e) {
		alert("cambiato dominio!");
	}
https://developer.mozilla.org/en/JavaScript/Reference/Statements/
try...catch
Non so però con che "parco-browser" devi svilupparla, non è supportato 
dalle vecchie versioni di IE (cerca da quale è supportato che a memoria 
non ricordo). 
p.s. usa questa forma di try-catch, le altre sintassi che troverai nella 
pagina che ti ho indicato IE manco sa cosa siano :-/
Altra possibilità che mi viene in mente: onunload della madre setti una 
var sulla popup che indica che la pagina è cambiata. onunload non è 
"ufficiale", ma è supportato credo da tutti i browser (e IE anche da 
versioni vetuste):
https://developer.mozilla.org/en/DOM/window.onunload

 non ricordo).
Accidenti, grazie, avrei giurato di no...
N.B. Ho provato su un Windows 2000 con IE5 (credo 5.0), e funziona... 
anzi, paradossalmente è Google Chrome che si comporta in modo 
imprevisto, dandomi "madre=undefined" anche se la finestra madre non è 
stata chiusa né cambiata...

 stata chiusa né cambiata...
strano ... puoi postare 2 righe che riproducano il problema? opener 
funziona correttamente su chrome...

 funziona correttamente su chrome...
Le pagine 1.html e 2.html sono quelle che ho già postato prima, con in 
più la correzione suggerita (che però è ininfluente per il problema i 
Chrome. Ho provato su Linux e su Windows, stesso risultato.
<!-- 1.html -->
<html>
<body onLoad="
window.name
='madre';">
Clicca <a 
href="javascript:window.open('2.html','popup','scrollbars=yes,resizable=yes,status=yes,location=yes,toolbar=yes').focus();">qui</a> 
per aprire il popup
</body></html>
<!-- 2.html -->
<html><head>
<script type="text/javascript">
function riapri()
  {
   if (opener==null)
    {
     alert("La pagina madre e' stata chiusa");
 
window.open('1.html','madre','scrollbars=yes,resizable=yes,status=yes,location=yes,toolbar=yes').focus();
    }
   else
    {
     try
      {
       var madre=String(opener.location.href);
       alert("madre="+madre);
       if (madre.lastIndexOf("1.html")+"1.html".length!=madre.length)
        {
         alert("La pagina madre e' cambiata");
 
window.open('1.html','madre','scrollbars=yes,resizable=yes,status=yes,location=yes,toolbar=yes').focus();
        }
       else
        {alert("La pagina madre esiste e non e' cambiata");}
      }
     catch(e)
      {alert("cambiato dominio!");}
    }
  }


 Chrome. Ho provato su Linux e su Windows, stesso risultato.
[CUT]
visto. In rete c'è parecchia gente che si lamenta di ciò, e sembra che 
sia un "problema" anche di safari. Parlano di specifiche html5, ma non ho 
tempo in questo momento di approfondire.

 tempo in questo momento di approfondire.
Grazie lo stesso, in fondo il problema è meno grave del precedente (al 
massimo viene riaperta una pagina già esistente: inutile ma non dannoso).
Non è che hai a partata di mano qualche link alle pagine che hai visto?
Ciao
Marco

 Non è che hai a partata di mano qualche link alle pagine che hai visto?
prova a vedere qua:
 
http://stackoverflow.com/questions/705514/error-in-safari-4-beta-and-
chrome-2
http://developer.apple.com/library/safari/#documentation/
AppleApplications/Conceptual/SafariJSProgTopics/Articles/Cross-
documentmessaging.html

 > Ho una pagina (diciamo 1.html, e supponiamo che il nome della finestra
 > sia 'madre') che, cliccando su un link, ne apre una seconda (diciamo
 > 2.html, e supponiamo che il nome della finestra sia 'figlia'). Cliccando
 > su un link di 2.html dovrei tornare su 1.html e chiudere 2.html.
 >
 > Il tutto funziona se riapro con window.open 1.html in 'madre', per poi
 > chiudere il popup.
 >
 > Solo che ora volevo raffinare la cosa: se 1.html è stata chiusa, o se è
 > cambiata la pagina che contiene, apro 1.html con window.open, altrimenti
 > mi limito a chiudere 2.html (perché aprire una pagina, se già è presente
 > dove dovrebbe essere?). Quindi, se opener è nullo, vuol dire che devo
 > riaprire la pagina (è stata chiusa), ma in caso contrario?
 >
 > E qui viene il problema: se se nella finestra che contiene 1.html apro
 > una pagina di un altro dominio, opener.location.href genera un errore
 > (Errore: Permesso negato a di ottenere la proprietà Location.href), e lo
 > script si interrompe. [CUT]
Niente da fare, sembra che non esista soluzione: le mie pagine sono 
qualcosa tipo [indirizzo_comune]/base/1.htm e 
[indirizzo_comune]/dettaglio/2.htm: basta questo (il cambio di cartella) 
per generare l'errore come se il dominio fosse cambiato (anche se la 
base dell'indirizzo è la stessa), per cui è perfettamente inutile creare 
una funzione che restituirebbe sempre vero...

 una funzione che restituirebbe sempre vero...
[CUT]
Ma stai parlando del problema rilevato con chrome, vero? Perché il cambio 
di cartella non tocca la SOP:
 
https://developer.mozilla.org/en/Same_origin_policy_for_JavaScript


No, sto parlando proprio di firefox. Quello che dici tu è vero se le 
pagine sono in Internet, ma non in locale (partendo da 
http://miosito.it/base/1.htm
 funziona, mentre partendo da 
file:///cartella/base/1.htm no). Testato su Linux e su Windows, stesso 
comportamento. In locale, evidentemente, viene considerato dominio non 
il primo livello, ma tutto fino all'ultimo '/' (strano, non capisco 
quale motivo di sicurezza renda necessario questo comportamento, ma 
tant'è...).

 tant'è...).
Qui è spiegato il comportamento e i motivi:
https://developer.mozilla.org/En/Same-origin_policy_for_file%3A_URIs
Attenzione alla versione di gecko! ;-)