我有这段代码。 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的已知问题吗?

最佳答案

如果您以声明方式创建dijit,并使用dojo.parser.parse即时解析它们,并指定了dijit的ID,则一旦您两次解析了相同的HTML片段,就会收到一条错误消息,指出dijit的ID已被注册。

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


原因是dijits尚未被销毁,您无法重复使用ID。如果在声明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);

关于javascript - dojo.parser.parse并不总是返回,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3212823/

10-12 00:17