解决了 - 我的代码在所有应该使用的地方都没有使用var。添加此项可以解决问题。
我正在尝试使用循环来遍历给定“场景”的子节点。在这个例子中,它是场景2.我的代码允许“链接”,它基本上去并加载另一个场景的子节点,然后返回到当前场景并加载剩余的子节点。问题是,无论何时我使用链接,都会阻止ORIGINAL场景完成加载。
XML:
<scene id="2">
<content>Scene2-Content1</content>
<content>Scene2-Content2</content>
<link id="4"/>
<choice content="Scene2-Choice1"/>
</scene>
<scene id="4">
<content>Scene4-Content1</content>
<choice content="Scene4-Choice1"/>
</scene>
JavaScript的:
var app = {
loadScene: function (scene) {
//find the scene and load the scene data
if(app.storyXml != null)
{
sceneNodes = app.storyXml.getElementsByTagName("scene");
for(i=0; i<sceneNodes.length; i++)
{
id = sceneNodes[i].getAttribute("id");
if(id == scene)
{
app.loadSceneData(sceneNodes[i]);
break;
}
}
}
},
loadSceneData: function (scene) {
childNodes = scene.childNodes;
try
{
length = childNodes.length;
for(i=0; i<childNodes.length; i++)
{
console.log((i+1)+"/"+childNodes.length);
tag = childNodes[i].tagName;
if(tag == "content")
app.loadSceneContent(childNodes[i]);
if(tag == "link")
app.loadSceneLink(childNodes[i]);
if(tag == "choice")
app.loadSceneChoice(childNodes[i]);
}
}
catch(err)
{
console.log(err);
}
},
loadSceneLink: function (node) {
if(app.storyXml != null)
{
sceneNodes = app.storyXml.getElementsByTagName("scene");
for(i=0; i<sceneNodes.length; i++)
{
id = sceneNodes[i].getAttribute("id");
if(id == node.getAttribute("id"))
{
app.loadSceneData(sceneNodes[i]);
break;
}
}
}
}
}
//loadSceneContent and loadSceneChoice omitted--they simply add some elements to the page.
在此特定示例中,为场景2中的前两个内容节点调用loadSceneContent / loadSceneChoice。之后,链接将为内容/选择节点调用它们。我希望控件返回到原始的loadSceneData循环,但它只是在原始的loadSceneData调用中跳转到循环的末尾。我把头撞在墙上,尝试了我能想到的各种变化。似乎没什么用。
如果删除链接节点,则会按预期加载场景2中的所有内容。
我不经常在Stack Overflow上发帖,所以如果我错过了一些对我的问题至关重要的内容,请告诉我。感谢您的帮助!
答案 0 :(得分:1)
使用i
声明循环变量var
可以解决调用方法之间的任何冲突。如果没有var
,i
被声明为全局变量......这意味着所有方法最终将共享其使用。如果单独调用每个方法会很好,但是在每个循环中调用它们。如果在另一个循环的中间调用一个方法,则会修改i
的值,从而弄乱包含循环。
例如,您的第一个循环应如下所示:
for(var i=0; i<sceneNodes.length; i++)