2012-01-24 10 views
7

Sto provando a utilizzare jquery per caricare un grafico dojo. Sto usando questo codice. Tuttavia nel secondo clic, nel primo pulsante ottengo questo errore. Lo stesso accade se clicco sul primo pulsante, clicco nel secondo e clicco di nuovo nel primo. Questo problema mi sta facendo impazzire.this.domNode è null

demo here

enter image description here

<script type="text/javascript"> 
$(document).ready(function() { 
    $('.lista_').click(function() { 
     $.get('index1.php', function (data) { 
      dojo.addOnLoad(function() { 
       require(["dojo/_base/xhr", "dojo/parser", "dojo/dom"], function (xhr, parser, dom) { 
        var um = []; 
        dijit.registry.filter(function (w) { //problem here, maybe this code destroy something that should not be destroyed 
         if (dojo.indexOf(um)) { 
          w.destroyRecursive(); 
         } 
        }); 
        $('#paginas').html(data); 

        dojo.parser.parse(dojo.byId('paginas')); 

       }); 
      }); 
     }); 
    }); 
}); 
</script> 
+2

Provare a utilizzare un file js utilizzato nel debug e non uno ridotto al minimo. questo è per semplificare il debug., – Farmor

+0

Chiedo semplicemente perché stai usando due framework javascript? – SergeS

+0

beh, è ​​irrilevante per la domanda. Sto solo usando il dojo per creare i grafici. – Daniel

risposta

3

Sembra che si sta tentando di rimuovere il vecchio schema prima di inserire/parsing quello nuovo, ma non credo che sta accadendo. Ciò potrebbe causare a Dojo di sollevare vari errori.

dijit.registry.filter(function (w) { //problem here, maybe this code destroy something that should not be destroyed 
    if (dojo.indexOf(um)) { 
     w.destroyRecursive(); 
    } 
}); 

Non sono sicuro di quello che stai facendo qui. La funzione filter restituirà una matrice di widget per cui il callback restituisce true. Inoltre, dojo.indexOf viene utilizzato per cercare un elemento in un array (non sono sicuro del tipo di magia nera che stai facendo con esso: P).

penso (se ho capito le vostre intenzioni), si dovrebbe piuttosto fare:

dijit.registry.findWidgets(dojo.byId("paginas")).forEach(function(w) { 
    w.destroy(); 
}); 

Questo distruggerà il widget di (s) all'interno #paginas prima di inserire e l'analisi del HTML appena recuperato.

Modifica: Quando si fa clic sul secondo pulsante e il grafico viene rimosso, anche il tag <style> viene rimosso. Ecco perché vedi gli artefatti dal div tooltip, perché non è più nascosto dai CSS. È possibile risolvere questo avendo l'importazione claro.css nel file principale, vale a dire mettere questo:

<style type="text/css"> 
@import "http://ajax.googleapis.com/ajax/libs/dojo/1.7/dijit/themes/claro/claro.css"; 
</style> 

nell'intestazione del file principale invece che nel codice HTML si carica con jQuery (index1.php).

+0

grazie per la tua risposta. Il link è ora aggiornato con il tuo suggerimento. Ma c'è un problema quando clicchiamo nel secondo pulsante, dopo il primo. È necessario attivare il suggerimento per riprodurre il problema. Alcune div non vengono rimosse. – Daniel

+0

@Daniel Hmm, non vedo gli errori nella pagina aggiornata. Hai ragione che i tooltip div non vengono rimossi, ma non sono sicuro che siano un problema perché non hanno un ID esplicito (e tooltip è una specie di singleton). – Frode

+0

Non ci sono errori ora. L'unico problema è la parte del tooltip che non viene rimosso. E se distruggo per il corpo o qualcosa otterrò l'errore iniziale this.domNode è nullo – Daniel