2010-07-09 60 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

相关问题