2012-01-24 20 views
7

我想用jquery加載一個dojo圖表。我正在使用此代碼。然而,在第二次點擊,在第一個按鈕,我得到這個錯誤。如果我點擊第一個按鈕,點擊第二個,然後再點擊第一個按鈕,就會發生同樣的情況。這個問題讓我發瘋。this.domNode爲空

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

嘗試使用調試中使用的js文件,而不是最小化的文件。這是爲了更容易調試。, – Farmor

+0

只是想知道你爲什麼使用兩個JavaScript框架? – SergeS

+0

好吧,這與問題無關。我只用dojo來創建圖表。 – Daniel

回答

3

它看起來像你想插入/解析新的人之前先刪除舊錶,但我不認爲這正在發生。這可能會導致Dojo出現各種錯誤。

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

我不確定你在這裏做什麼。 filter函數將返回一個控件的數組,其回調函數返回true。此外,dojo.indexOf用於搜索數組中的一個元素(我不確定你在那裏用什麼樣的黑魔法:P)。

我認爲(如果我明白你的意圖),你應該寧願做:

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

這會破壞內部的#paginas的小窗口插入和解析新取的HTML之前。

編輯:當您單擊第二個按鈕並刪除圖表時,<style>標籤也被刪除。這就是爲什麼你會看到來自tooltip div的工件,因爲它不再被CSS隱藏。在主文件頭,而不是在你使用jQuery(index1.php)加載HTML

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

:您可以通過在主文件的claro.css進口解決這個問題,即把這個。

+0

感謝您的回答。該鏈接現在更新您的建議。但是在第一個按鈕之後點擊第二個按鈕時會出現問題。您需要激活工具提示才能重現問題。有些div不會被刪除。 – Daniel

+0

@丹尼爾嗯,我沒有看到更新頁面上的錯誤。你說得對,工具提示div並沒有被刪除,但我不確定它們是一個問題,因爲它們沒有明確的id(工具提示就是單例)。 – Frode

+0

現在沒有錯誤。唯一的問題是未刪除的工具提示的內容。如果我身體或東西摧毀我會得到最初的錯誤this.domNode爲空 – Daniel