Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it L'avatar di marco_c
    Registrato dal
    Jun 2004
    Messaggi
    1,047

    [jquery] Binding di una funzione su un elemento che ancora non esiste

    Ciao, le mie conoscenze di JQuery sono molto limitate quindi sicuramente a molti la domanda suonerà banale.

    Ho una pagina HTML con un pulsante. Questo pulsante chiama del codice JS che esegue una richiesta AJAX a uno script. Quando la risposta AJAX giunge faccio il display:block di un div e metto il risultato AJAX come innerHTML del DIV fatto comparire.

    Ora, a questo punto (quando il DIV compare) io dovrei eseguire un'azione (chiamare una funzione JS). Purtroppo non posso mettermi a livello di libreria che gestisce la risposta AJAX e fa innerHTML del DIV. Quella parte di codice non la posso modificare. Ho pensato quindi di rimanere a livello di pagina iniziale (quella col pulsante) e fare un binding con JQuery, qualcosa del tipo

    codice:
    $('#mydiv').ready(function() {
       alert('ciao');
    });
    Dove "mydiv" è un div contenuto nella risposta AJAX. "mydiv" quindi non esiste ancora quando la pagina HTML iniziale viene invocata. Per qualche strano motivo alert('ciao') viene eseguito istantaneamente (penso perchè se il mydiv non esiste la ready torna true di default).

    Ricapitolando: come posso fare il binding di un div (con ready o con funzioni simili) che ancora non esiste, in modo che il metodo associato col binding venga eseguito quando questo div esiste?

    Grazie
    Gli uomini si dividono in due categorie: i geni e quelli che dicono di esserlo. Io sono un genio.

  2. #2

  3. #3
    Utente di HTML.it L'avatar di marco_c
    Registrato dal
    Jun 2004
    Messaggi
    1,047
    Avevo addocchiato la funzione "on", ma ho visto che non fa al caso mio in quanto alla funzione "on" puoi aggangiare un evento che si propaga verso l'alto, cioè che dall'elemento in questione risale la gerarchia DOM fino al document. Tipicamente gli eventi click, change, ecc.
    A me servirebbe usare la funzione "on" con l'evento "load" ma non funziona. E il motivo è appunto la mancata risalita nella gerarchia del DOM.

    Ho risolto in modo completamente diverso, ecco come: il codice JS lo inserisco direttamente nella risposta AJAX, cioè nel testo HTML di cui faccio innerHTML sul div che visualizza il risultato. Come si sa, facendo innerHTML di codice HTML, l'eventuale codice JS contenuto non viene parsato/eseguito.
    A questo punto, al posto di innerHTML, ho usato il metodo html() di jquery, che oltre a fare l'innerHTML del testo parsa ed esegue anche il codice JS. Come conseguenza di tutto questo il codice JS viene eseguito proprio quando il div inizia ad esistere.
    Gli uomini si dividono in due categorie: i geni e quelli che dicono di esserlo. Io sono un genio.

  4. #4
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    load() sui div non funziona. load funziona solo sull'oggetto window e su tutti gli elementi con un src. Per tutto il resto c'è .ready()

    Poi secondo me è sbagliato iniettare javascript come hai detto tu.

    per rispondere alla tua prima domanda considera questo esempio magari guardando i log dalla console di firebug

    codice:
    <body>
        CREA DIV
        <div id="container"></div>
    
        <script type="text/javascript" src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
    	<script type="text/javascript">
    	    $(document).ready(function () {
    	        $('#container').on('click', '#dynamic > a', function () {
    	            console.log('click su link dinamico');
    	        });
    	        $('body > a').click(function (e) {
    	            $('<div id="dynamic">dynamic content click</div>').appendTo('#container').ready(function () {
    	                console.log('div creato');
    	                $('img', this).on('load', function () {
    	                    console.log('imMagine caricata');
    	                });
    	            });
    	        });
    
    	    });
    	</script>
    </body>
    1. con on() ho agganciato l'handler del click partendo da un elemento gia esistente e filtrando con il selettore passato con il secondo parametro.
    2. La stessa tecnica non la posso usare con 'ready' perchè per ogni elemento gia esistente l'evento si scatena una sola volta sicuramente prima che ogni div dinamico venga creato. Per questo l'handler lo aggancio una volta attaccato il div al dom.
    3. L'evento load riguarda un elemento come img che possiede l'attribbuto src e non il div! lo aggancio all'immagine da DENTRO al ready del div.

    cerca di adattare questo codice piuttosto di iniettare javascript che poi diventa impossibile da manuntenere e debuggare. tieni conto che

    $('body > a').click(function (e) {

    è solo un esempio, puo tranquillamente essere il success di una chiamata ajax...

  5. #5
    Utente di HTML.it L'avatar di marco_c
    Registrato dal
    Jun 2004
    Messaggi
    1,047
    Grazie per il tuo intervento.

    Ho capito il tuo codice, e si comporta come mi aspettavo. Però è diverso dal mio caso. Io dovrei eseguire una funzione javascript nel momento in cui il div viene creato. Chiaro, usando un link mi aggangio all'evento click e uso "on". Ok. Ma io non dispongo di alcun link.

    Altra cosa che posso dire è che ho provato anche con "ready" e non funziona. L'evento viene sempre scatenato immediatamente, anche se #nomediv non esiste ancora.

    Ultima considerazione, la parte ajax mi viene gestita da una libreria esterna su cui non ho il controllo e che non posso modificare. Quindi il div che si crea, la richiesta ajax, la risposta ajax, la gestione del successo o dell'errore, tutto questo viene gestito da una libreria esterna che non posso modificare. Altrimenti basterebbe mettersi lì dentro e chiamare semplicemente la funzione di cui ho bisogno..!

    A me serve astrarmi dalla parte ajax e a livello di pagina chiamante dire: "quando questo div compare nel dom allora esegui questo codice js".
    Gli uomini si dividono in due categorie: i geni e quelli che dicono di esserlo. Io sono un genio.

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    762
    Chi lo crea l elemento? Tu?

    E cma sappi che puoi annullare il codice proveniente da fuori.

  7. #7
    Utente di HTML.it L'avatar di marco_c
    Registrato dal
    Jun 2004
    Messaggi
    1,047
    Originariamente inviato da wartpro
    Chi lo crea l elemento? Tu?

    E cma sappi che puoi annullare il codice proveniente da fuori.
    Click su un pulsante -> Richiesta ajax -> risposta ajax cotenente codice HTML con dentro l'elemento -> innerHTML della risposta ajax.

    La seconda frase non l'ho capita
    Gli uomini si dividono in due categorie: i geni e quelli che dicono di esserlo. Io sono un genio.

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    762
    Ok, allora dopo il codice che inserisce il nuovo elemento nel tuo html, inserisci il js relativo all'attaching degli eventi che ti servono.

  9. #9
    Moderatore di Annunci siti web, Offro lavoro/collaborazione, Cerco lavoro L'avatar di cavicchiandrea
    Registrato dal
    Aug 2001
    Messaggi
    26,132
    Non gestendo la chiamata Ajax non puoi sapere quando il response è pronto e il div è generato/popolato
    Cavicchi Andrea
    Problemi con javascript, jquery, ajax clicca qui

  10. #10
    Utente di HTML.it L'avatar di marco_c
    Registrato dal
    Jun 2004
    Messaggi
    1,047
    Originariamente inviato da cavicchiandrea
    Non gestendo la chiamata Ajax non puoi interagire il response e il div
    Sembra anche a me.
    A questo punto la soluzione che sto usando (codice js nella risposta ajax e funzione html() di jquery che parsa ed esegue il codice js) per quanto sporca possa sembrare sembra essere l'unica.
    Gli uomini si dividono in due categorie: i geni e quelli che dicono di esserlo. Io sono un genio.

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.