Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di Threepwood
    Registrato dal
    Feb 2003
    Messaggi
    2,107

    [JS] su FF funziona, su IE no

    Salve a tutti, strano problema.

    Sto gestendo uno script di questo genere per popolare una select (f.citta) a seconda della provincia scelta.

    Di seguito la pagina di risposta (aperta in popup) che popola la select sulla pagina della chiamata (la select è CITTA, nome del form:F)

    codice:
    <html><body onload="
    with (window.opener.document.f.citta)
    {
       while (options.length > 0)
           options[0]=null;
        i=0;
       options[i]=new Option('AGRIGENTO','AG');        i++;
       options[i]=new Option('ALESSANDRIA DELLA ROCCA','AG');       i++;
       options.selectedIndex=0;
    }
    
    window.close();
    ">
    </body></html>
    Se anzichè il WINDOW.OPENER gestissi il tutto nella stessa pagina sarebbe tutto ok... con il window.opener IE non vive... (ff funzia perfettamente)

    non fa neanche il window.close();

    Cosa posso modificare?
    Guybrush Threepwood

  2. #2
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    prova a modificare un poco la logica. Tu fai:

    A apre popup B. In B mia_funzione manipola elementi di A

    io farei così:

    in A creo una funzione che accetta 0 o più parametri:

    function mia_funzione(parametro1, parametro2, ..., parametron){}

    in B, non manipoli direttamente gli elementi di A, ma ti limiti a lanciare la funzione passando dei parametri:

    se(chiamante ee chiamante.funzione) chiamante.funzione(parametro);

    con questo modo ho risolto abbastanza bene questo problema
    Pietro

  3. #3
    Utente di HTML.it L'avatar di Threepwood
    Registrato dal
    Feb 2003
    Messaggi
    2,107
    credo che il problema sia un altro...

    mi spiego: se il problema fosse solo il window.opener credo che quantomeno il window.close() funzionerebbe, ma la select in A non si popolerebbe.

    Invece non arriva al window.close().

    Detto ciò, il window.opener dovrebbe funziare anche con IE poichè lo uso (sempre in popup) per la generazione del codice fiscale


    Nel modo che dici tu.... come faccio a lanciare da B una funzione che esiste su A?
    Guybrush Threepwood

  4. #4
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Io non faccio più come te perchè tempo fa sono incorso in questi problemi, perciò mi sono dovuto adattare e, ti posso dire mi pare anche più corretta la logica.
    Alla tua domanda ho risposto con speudo codice che tu certamente puoi tradurre in javascript

    se(chiamante ee chiamante.funzione) chiamante.funzione(parametro);


    chiamante è una funzione che restituisce il chiamante, in questo caso opener

    Pietro

  5. #5
    Utente di HTML.it L'avatar di Xinod
    Registrato dal
    Sep 2000
    Messaggi
    13,649
    mi sembra sia un bug conosciuto da tempo e mai risolto:
    new Option da popup non funziona

    come dice Pietro, l' unica e' avere la funzione che aggiunge le option nella pagina madre e passare a questa i valori opportuni
    ciao

  6. #6
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Originariamente inviato da Xinod
    mi sembra sia un bug conosciuto da tempo e mai risolto:
    new Option da popup non funziona

    come dice Pietro, l' unica e' avere la funzione che aggiunge le option nella pagina madre e passare a questa i valori opportuni
    ciao
    Sinceramente non sapevo di questo bug io ci sono incappato ed ho risolto a modo mio.

    Comunque, facio un esempio un poco più concreto, ho A che chiama B.
    In A posso aprire B normalmente con una popup o con una finestra modale, oppure posso aprirla in un iframe. B non sa come è aperta. Se B deve restituire dati al chiamante io lo immagino come una chiamata tipo CallBack delle finestre di Windows.
    Allora B apre A con una funzione del tipo

    var w_apri_assegna_funzionario = null;//è globale per poter essere chiusa nell'evento unload
    function apri_assegna_funzionario(id_assegnazione, id_pratica, miniere_cave, id_utente, v)
    {***}
    subito dopo implemento la funzione di Callback

    function callback_scelta_funzionario( funzionario, in_carico_da, note ){***}

    Allora io A ricevo la chiamata da B che mi passa i parametri concordati ed è compito mio usarli, non di B

    Dal suo canto B ha concordato che da qualche parte, qualche pagina si aspetta dei dati di ritorno, perciò fa le chiamate di Callback

    if(chiamante && chiamante.callback_scelta_funzionario)
    {
    chiamante.callback_scelta_funzionario( funzionario, in_carico_da, note );
    }
    chiamante è una funzione di libreria tipo:

    codice:
    /*-----------------------------------------------------
    //Restituisce un riferimento al chiamante
    //Uso var chiamante = getChiamante();
    
    //altro esempio
    //	if(getChiamante().location.href == window.location.href)
    //		alert("chiamante chiuso");
    //	else
    //		alert("chiamante aperto");
    ------------------------------------------------------*/
    function getChiamante()
    {
    	var sData = window.dialogArguments;
    	if(sData == undefined)
    	{
    		if(opener == undefined) 
    		{
    			var p = self.parent;
    			//se sono dentro un IFRAME restituisco il parent, altrimenti
    			//se sono dentro un FRAME, restituisco self
    			return (p.document.getElementsByTagName("body").length == 0)? self: p;
    		}
    		else if (typeof(opener.document) == 'unknown')	
    			return self; 
    		else 
    			return opener;
    	}
    	else 
    	{
    		if(sData.document)
    			return sData;
    		else
    			return self;		
    	}
    }
    Adesso, il codice può essere corretto, ma la logica mi pare obiettivamente corretta specialmente quando la pagina B può venire chiamata da diverse pagine e ciascuna usa i dati di ritorno in modo diverso
    Pietro

  7. #7
    Utente di HTML.it L'avatar di Threepwood
    Registrato dal
    Feb 2003
    Messaggi
    2,107
    Vi spiego cosa volevo fare (cioè.. cio che sono riuscito a fare, ma solo per FF)

    Ho 2 select : Una con le provincie, una con le città (vuota).
    Cambiando la provincia, apre una popup che elabora (PHP-MYSQL) e ripopola la select delle città nella finestra chiamante... dopodichè si chiude.

    Questa funziona alla perfezione con FF... a dire il vero non saprei come implementare il discorso che mi avete detto su...

    Sapete, a questo punto, se esiste qualche script già fatto di questo genere?

    .... microsoft ...
    Guybrush Threepwood

  8. #8
    Utente di HTML.it L'avatar di Xinod
    Registrato dal
    Sep 2000
    Messaggi
    13,649
    ok, terra terra terra

    pagina madre,

    function pulisci(){
    sel=document.f.citta;
    while(sel.options.length>0){sel.options[sel.options.length-1]=null;}
    }
    function aggiungi(nome,valore){
    sel.options[sel.options.length]=new Option(nome,valore);
    }

    pagina figlia,
    richiama prima sempre
    window.opener.pulisci();
    dopo, per ogni valore restituito dal db richiami un
    window.opener.aggiungi('nomecitta','targa');
    infine chiudi la popup
    self.close();

    qusto e' tutto il minimo indispensabile
    ciao

  9. #9
    Utente di HTML.it L'avatar di Threepwood
    Registrato dal
    Feb 2003
    Messaggi
    2,107
    Perfetto!!!

    DankE!!!
    Guybrush Threepwood

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.