Skip to main content
 

Gestione finestre figlie

Questo codice java script permette di gestire l'apertura di sottofinestre in una pagina HTML, limitando il numero massimo il "figlie" che si possono generare. E' sufficiente inserire lo script nella pagina HTML e aprire le sottofinestre chiamando la funzione open_new_app. Si possono definire diverse categorie di finestre, ognuna con un diverso numero massimo di sottofinestre possibili, attraverso l'array kinds.

La chiusura della finestra madre forza la chiusura delle figlie.

/*
 * Libreria per l'apertura controllata di sottofinestre
 * 
 *   Ladyj
 *   v 1.0
 *   17.10.2011
 *   
 */

var opt = 'height=700,width=1015,left=0,top=0,status=no,toolbar=no,menubar=no,location=no,resizable=no,titlebar=no';
var kinds = { "xyx":"3" };
var pops  = {};

/*
 * checkout dei link di eventuali finestre figlie 
 * chiuse che invece risultano aperte
 */    
function checkAliveChildren() {
 var child;
 
 for (var kind in kinds) { 
 for (var k = 1; k <= kinds[kind]; k++) {
 try {
 child = pops[kind][k];  
 if (child && !child.closed) {
 ;///il figlio è vivo
 } else {
 pops[kind][k] = false;
 }
 } catch (err) {
 ////IE da errore se accedo a .name di una window chiusa
 ////firefox invece restituisce null
 pops[kind][k] = false;
 }
 }
 }
}        
 
/*
 * Funzione Javascript di chiusura di tutte le window
 * figlie
 */
function closeChildren() {
 checkAliveChildren();
 for (var kind in kinds) {  
 for (var k = 1; k <= kinds[kind]; k++) {  
 if (pops[kind][k]) {
 pops[kind][k].close();
 }
 }
 }    
}



/*
 * Funzione che restituisce true se esiste almeno una
 * window figlia aperta
 */
function anyChildren() {
 checkAliveChildren();
 for (var kind in kinds) {  
 for (var k = 1; k <= kinds[kind]; k++) {  
 if (pops[kind][k]) {
 fnd = true;
 return fnd;
 }
 }
 }
 return false;
}

/*
 * Funzione di inizializzazione della struttura
 */
function init() {  
 for (var kind in kinds) {  
 if (kind) {
 pops[kind] = {};     
 for (var k = 1; k <= kinds[kind]; k++) {  
 pops[kind][k] = false;
 }
 }
 }
 
 /*
 * Gli eventi onbeforeunload e onunload scattano in caso di chiusura o reload
 * della finestra madre.
 *
 *
 *
 * Event handler che scatta appena prima della chiusura della window madre
 * e che visualizza il messaggio di avviso solo se esistono window
 * figlie aperte. 
 */  
 window.onbeforeunload = function() {
 if (anyChildren()) 
 return 'Some sub-windows are still opened, I\'m going to close them. Are you sure?';  
 }

 /*
 * Event hendler che scatta in fase di chiusura della window madre.
 * Se esistono window figlie le chiude tutte. La possibilità di cambiare
 * idea e non chudere la window madre viene data dall'event handler precedente; se
 * si risponde Annulla l'event onunload non scatta.
 */
 window.onunload = function() {
 if (anyChildren) {
 closeChildren(); 
 }
 }
}

/*
 * Funzione utilizzata per l'apertura di una nuova finestra
 */
function open_new_app(kind, child) {
 if (!kinds[kind]) alert('Don\'t know what are you talking about!!!! ' + kind + '?');
 
 var k;
 var fnd = false;
 checkAliveChildren();
 for (k = 1; k <= kinds[kind]; k++) {
 if (!pops[kind][k]) {
 fnd = true;
 break;
 }
 }
 
 if (!fnd) {
 alert('Game over! Too many children!');
 return;
 }    
 
 pops[kind][k] = window.open(child, kind+k, opt); 
}

init();

Javascript

Diffusione browser