【问题标题】:Unusual JavaScript for loop with xml in BlocklyBlockly 中带有 xml 的异常 JavaScript for 循环
【发布时间】:2016-01-15 21:59:27
【问题描述】:

我正在使用 Google 的 Blockly 开展一个项目,但部分文档难以理解。谁能帮我理解以下for循环的结束条件(xml = allXml[i])?

var allXml = Blockly.Xml.workspaceToDom(workspace);
var allCode = [];
for (var i = 0, xml; xml = allXml[i]; i++) {
  var headless = new Blockly.Workspace();
  Blockly.Xml.domToWorkspace(headless, xml);
  allCode.push(Blockly.JavaScript.workspaceToCode(headless));
  headless.dispose();
}

我想当 allXml[i] 未定义时循环会退出,但是你怎么能像这样遍历一个 XML 对象呢?它似乎总是返回 undefined 并完全跳过循环。

感谢您的帮助

大部分函数的定义可以在https://code.google.com/p/blockly/source/browse/trunk/core/xml.js?r=1614找到

我从中提取的文档页面是https://developers.google.com/blockly/custom-blocks/code-structure?hl=en

【问题讨论】:

  • 您对循环如何终止是正确的。至于像这样遍历 XML,他们必须将其定义为某种数组。试试console.log(allXml) 看看它是什么类型的对象。
  • 我有。这是实际的xml。它看起来像 xml,其行为方式与您期望 xml 与 .childnodes 和 .childElementCount 一起表现的方式相同。

标签: javascript xml for-loop indexing blockly


【解决方案1】:

我在 github 上的 repo 中找不到此代码,所以我猜这是文档中的一个较旧的示例。

但是如果你看一下Blockly.Xml.workspaceToDom() 函数的实现,你会看到一个非常相似的东西。

  var blocks = workspace.getTopBlocks(true);
  for (var i = 0, block; block = blocks[i]; i++) {
    var element = Blockly.Xml.blockToDom_(block);
    //...
    xml.appendChild(element);
  }

这里的想法是迭代所有代码分支。顶部块没有顶部连接(它开始一个新分支)。 getTopBlocks() 返回一个数组 {!Array.<!Blockly.Block>}

考虑到文档在有关并行执行的部分中对其进行了展示,我认为这与以下事实有关,即您可以拥有更多未连接的代码分支......并且确切的实现只是随着时间的推移而改变。

【讨论】:

    【解决方案2】:

    根据代码,Blockly.Xml.workspaceToDom(workspace) 的返回类型为{!Element}

    它基本上返回一个使用goog.dom.createDom('xml'); 创建的DOM 节点。并且对于每个顶级块,它都会向其附加一个 DOM 节点。

    所以基本上有问题的代码 sn-p 是循环遍历与顶级块对应的所有 DOM 节点。

    【讨论】:

      猜你喜欢
      • 2014-07-01
      • 1970-01-01
      • 2012-10-11
      • 1970-01-01
      • 2014-06-09
      • 2020-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多