代码之家  ›  专栏  ›  技术社区  ›  d-_-b

dojo.parser.parse并不总是返回

  •  2
  • d-_-b  · 技术社区  · 15 年前

    我有这段代码。它用于在select元素更改后更新表单。一旦更改了一个“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的已知问题吗?

    1 回复  |  直到 15 年前
        1
  •  4
  •   Fu Cheng    15 年前

    如果以声明方式创建dijits并使用 dojo.parser.parse 要动态解析它们并指定dijit的ID,一旦两次解析相同的HTML片段,就会得到一个错误,表明dijit的ID已注册。

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

    原因是dijit尚未被销毁,您不能重用该ID。如果在声明时未指定该ID,则不会出现此错误,但实际上存在内存泄漏。

    正确的方法是在再次解析HTML片段之前销毁dijit。的返回值 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);