2010-07-09 62 views
2

我有這一點的代碼。它用於在select元素更改後更新表單。 onChange進行「ajax」調用,並且這一部分代碼負責響應。dojo.parser.parse並不總是返回

第一次一切按預期工作。但是,它的dojo.parser.parse無法返回大約50%的時間。

起初看起來是這樣的:

var targetNode = dojo.byId(node); 
targetNode.innerHTML = data; 
dojo.parser.parse(targetNode); 

然後我讀一些關於現有的對象。所以我認爲,也許摧毀它們會有所幫助:

if(dojo.byId(node)) dojo.destroy(node); 
dojo.create('div', { id: node }, afternode, 'after'); 
var targetNode = dojo.byId(node); 
targetNode.innerHTML = data; 
dojo.parser.parse(targetNode); 

這沒有任何幫助。 h3ll正在發生什麼?有時它解析一些元素。這是一個與dojo.parser有關的已知問題嗎?

回答

4

如果您聲明性地創建dijits,並使用dojo.parser.parse即時解析它們,並指定dijit的ID,則一旦您解析兩次相同的HTML片段,就會得到一個錯誤,表明dijit的ID已經註冊。

<div dojoType="dijit.form.Button" id="myButton" /> 

原因是dijits尚未銷燬,您不能重新使用該ID。如果在聲明時沒有指定ID,則不會出現此錯誤,但實際上存在內存泄漏。

正確的方法是在再次解析HTML片段之前銷燬dijits。 dijit.parser.parse的返回值是一個數組列表,其中包含從HTML片段中解析出的所有dijits的引用。你可以保留列表並首先銷燬dijits。

if (dijits) { 
    for (var i = 0, n = dijits.length; i < n; i++) { 
     dijits[i].destroyRecursive(); 
    } 
} 
dijits = dojo.parser.parse(targetNode); 
+0

所以我想我會需要保留解析的dijits列表以後在全局數組中摧毀? – 2010-07-13 05:12:17

+0

不一定在全球範圍內,選擇適合您的範圍。您還可以使用'dijit.findWidgets'來查找DOM節點中的dijits並銷燬它們。例如,'var dijits = dijit.findWidgets(targetNode); //破壞dijits' – 2010-07-13 06:25:49

+0

男人,太棒了!謝謝你的幫助!我對道場一無所知。我以爲我可以做一個node.empty或者node.destroyRecursive。但它沒有像我預期的那樣工作。那是因爲節點在內存中註冊爲dojo本身意識到的dojo對象類型嗎?那麼,node.empty就會擺脫DOM中的節點,而不是內存中的dojo對象? – 2010-07-13 12:36:00

相關問題