Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    505

    javascript - onUnload problema - incompatibilità?

    salve a tutti. ho necessità di fare una funzione in javascript +ajax che scriva qualcosa sul mio database non appena un utente cambia una determinata pagina (oppure chiude il browser).

    ho scritto :

    codice:
    <body onunload="if(checkload) { unloadf('<?=$ajaxtrackid?>'); }">
    dove checkload è una variabile che mi identifica se fare l'unload si o no (è true sulla pagina dove lavoro).

    unloadf è una funzione javascript che carica una funzione ajax che scrive a sua volta quello che devo scrivere sul database

    codice:
    function unloadf(ajaxtrackid){ 	
    $.ajax({ 		
    type: "POST", 		
    url: "./asynch/unloadf.php", 		
    data: "trackid="+ajaxtrackid, 		
    success: function(msg){ 			
    alert( "Data Saved: " + msg ); 		
    }, 		
    error: function() { 			
    alert('errore in uscita '+msg);  		
    } 	
    }); }
    tutto funziona perfettamente!! unico problema è :
    su chrome funziona solo se chiudo la finestra del browser ma non se cambio pagina all'interno del sito;
    su firefox funziona solo se cambio pagina all'interno del sito ma non se chiudo la finestra del browser;
    su ie funziona su entrambe;

    avete idea di come potrei sistemare questa cosa? (a me basta che funzioni su questi tre browser, che son tra i più utilizzati tra i potenziali utenti del mio futuro sito).

    cordiali saluti

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    505
    ho risolto il problema dell'incompatibilità della funzione onunload con questo script:

    codice:
    		<script> 			function checkUnload() { 				if(checkload) { 					unloadf('<?=$ajaxtrackid?>'); 					alert ("Exit"); 				} 			} 		 			window.onbeforeunload = checkUnload; 		</script>
    problema è che adesso la funzione ajax funziona 2 volte su 1...anche se il messaggio alert Exit viene visualizzato tutte le volte (e quindi la funzione viene richiamata correttamente).

    strano... qualche idea? (anche se senza aver visto il codice sia difficile inventarsi qualcosa)

  3. #3
    Moderatore di Annunci siti web, Offro lavoro/collaborazione, Cerco lavoro L'avatar di cavicchiandrea
    Registrato dal
    Aug 2001
    Messaggi
    26,131
    Ma usi entrambi onbeforeunload e onunload?
    Per esperienza personale in questi casi meglio mettere un esempio online.


    P.S. Ho qualche dubbio che alla chiusura della finestra e contestuale abbandono del sito (cioè se è l'unica finestra aperta) da parte dell'utente l'operazione venga eseguita.
    Cavicchi Andrea
    Problemi con javascript, jquery, ajax clicca qui

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    505
    ovvio che no : lascio solo la "nuova" onbeforeunload.

    e ti posso assicurare che và perchè se chiudo/cambio la finestra, sul database scrive...

    il problema principale è questo : quando apro più browser (un chrome, un firefox, un IE) e faccio le varie prove. l'onbeforeunload funziona sempre (appunto con l'alert mi accorgo che la invocano ogni volta) è la funzione ajax che non scrive sul database. sembra quasi che vada in conflitto con le altre istanze del database impostate nei vari browser (dubito fortemente che questo possa accadere).

    la funzione "ajax" invoca questa pagina .php che và a scrivere sul DB :
    Codice PHP:
    include("../database/config.inc.php");          

    // rimuovo atomicità editing     
    $update mysql_query("UPDATE tracklist SET block = '0' WHERE trackid = '".$_POST['trackid']."'",$mydb);     
    $update mysql_query("UPDATE tracklist SET blockuser = '0' WHERE trackid = '".$_POST['trackid']."'",$mydb);         
    $update mysql_query("UPDATE tracklist SET blockdate = '0000-00-00 00:00:00' WHERE trackid = '".$_POST['trackid']."'",$mydb);    

    mysql_close($mydb); 
    ogni tanto và, ogni tanto no! ajax ha bisogno di parametri strani? o magari completa l'esecuzione solo quando in return riesce a passare tali parametri...

  5. #5
    Moderatore di Annunci siti web, Offro lavoro/collaborazione, Cerco lavoro L'avatar di cavicchiandrea
    Registrato dal
    Aug 2001
    Messaggi
    26,131
    :master: ma il problema di mancate scritture sul db è al cambio pagina o alla chiusura?
    Cavicchi Andrea
    Problemi con javascript, jquery, ajax clicca qui

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    505
    il problema si manifesta casualemente in cambio pagina o chiusura browser...indipendentemente dalle azioni che compio ogni tanto scrive ogni tanto no.

    ora, non sono un esperto di ajax, ma ho letto che essendo una chiamata asincrona di default, può essere che il browser esca prima che la chiamata venga effettivamente conclusa (con valore di ritorno). e credo sia questo il problema : se ajax non porta a termine (cioè ritorna) il valore alla funzione principale, non scrive sul database (può davvero succedere che una volta invocato il mio file php che scrive sul database questo non scriva perchè non riesce a tornare un valore?).

    ho infatti provato ad aggiungere un "async:false," dentro alla mia funzione ajax :

    incredibile ma vero, così funziona perfettamente. il browser (se lo chiudo per esempio, e imposto un alert sul valore di ritorno di ajax) aspetta il valore di ritorno : poi si chiude!!! non oso immaginare cosa succede se durante la connessione ajax al server sincrona questa dovesse piantarsi : credo che si pianterebbe a sua volta il browser.

    quindi, il problema sostanziale dovrebbe essere questo : c'è un'altra via? tipo mandarla asincrona e fregarsene nel valore di ritorno (magari, semplicemente, rimuovendo la funzione success all'interno della funzione)?

    sicuramente qualcuno ha già affrontato questo tipo di problema

  7. #7
    Moderatore di JavaScript L'avatar di br1
    Registrato dal
    Jul 1999
    Messaggi
    19,998
    Quando non ti interessa il valore di ritorno puoi fare a meno di ajax e usare un semplice artificio:

    var pippo = new Image();
    pippo.src = "pagina.php?parametri";

    non dovrebbe aver problemi, ma per eccesso di prudenza fatti restituire sempre una piccola immagine

    ciao
    Il guaio per i poveri computers e' che sono gli uomini a comandarli.

    Attenzione ai titoli delle discussioni: (ri)leggete il regolamento
    Consultate la discussione in rilievo: script / discussioni utili
    Usate la funzione di Ricerca del Forum

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    505
    interessante. non la sapevo questa cosa... la proverò :=)

    quindi ajax và usato solo se mi aspetto valori di ritorno?

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    505
    mah, io ho provato quella funzione...

    ho scritto :

    codice:
    		
    <script>
    function checkUnload() {
        if(checkload) {
            var unloadimg = new Image(); 
            unloadimg.src = "./asynch/unloadf.php?trackid="+ajaxtrackid;
        }
    }
    window.onbeforeunload = checkUnload; 		
    </script>
    ma non succede nulla..

    ma poi perchè dovrei creare una nuova istanza di immagine se devo richiamare una pagina?

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    505
    nessuno sarebbe così gentile da spiegarmi come realizzare quell'artifizio? non ho ben capito come funziona, e nemmeno cosa intendi per "fatti restituire una piccola immagine"

    a me valori di ritorno non interessano, basta che alla chiusura l'operazione sul database si concluda. se imposto ajax sincrono ok, funziona, però mi sembra un pò una schifezza :

    ammettiamo che la connessione cadi durante la chiamata sincrona? o ci metta troppo tempo. il browser non si chiude non mi sembra una gran cosa.

    sarà ben successo anche ad altri di dover fare una cosa del genere, suppongo

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 © 2024 vBulletin Solutions, Inc. All rights reserved.