我有这段代码。它用于在select元素更改后更新表单。 onChange进行“ajax”调用,这段代码负责响应。
第一次一切按预期工作。然而,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的已知问题吗?
答案 0 :(得分: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片段解析的所有dijit的引用。您可以保留列表并首先销毁dijits。
if (dijits) {
for (var i = 0, n = dijits.length; i < n; i++) {
dijits[i].destroyRecursive();
}
}
dijits = dojo.parser.parse(targetNode);