我有一个带有html内容的jsp文件,里面有一个脚本,我也在使用dhtmlx。我的Web应用程序的其他部分正在工作,因此,我只想关注这个问题,因为环境运行良好。在我的文件的一个点上:
numTabs = getNumTabs();
for (var i=0; i<numTabs;i++) {
var mytab = "tab_"+i;
tabbar.addTab(mytab,'Tab Numer: ' + i,'');
//alert("for " + i); PLACE 1
initTabContent(mytab);
}
function initTabContent(tabID){
//alert("initTabContent " + i); PLACE 2
tab = tabbar.cells(tabID);
toolbar = tab.attachToolbar();
toolbar.loadXML('.../...file.xml',function(){
//alert(i); PLACE 3
toolbar.setItemText('botton1', 'Botton 1');
});
grid = tab.attachGrid();
//more stuff
}
重点是:
如果我在PLACE 1中取消注释警报,一切都很顺利,它会加载XML并且一切正常,但如果我评论警报它就不顺利。
如果我取消注释警报1和警报2,我将在网页中看到:
所以,据我所知,尽管有myfunction,循环仍在继续,并且不会等待该函数的完全终止。 有趣的是,如果我评论警报1和2,并取消注释警报3,我在网页上看到的第一件事是4,然后是3,2,1,0 ......
如果我再次离开,只有警报1取消注释,一切顺利。我想的原因是警报使系统等待用户,因此XML加载良好。
我的问题: 第一:为什么循环不等待功能完成?它应该是顺序的吗? 第二:如何在没有警报的情况下解决问题?我也尝试在里面放一个空的for循环来赚取时间,但它没有成功......(这不是一个好方法)
非常感谢, 亚历克斯。
答案 0 :(得分:0)
导致您遇到麻烦的部分原因是“警报”警告&#39;阻止执行,而loadXML调用是异步的。 要更准确地描述以什么顺序发生的事情,请使用console.log而不是alert。
您是否尝试在调用myFunction中使用i的值用于除警报之外的其他目的?
如果是这样的话。尝试更换:
myfunction(i);
使用:
(function (num) { return function() {myfunction(num)} })(i);
答案 1 :(得分:0)
感谢@KevinB我意识到整个jsp文件中确实缺少toolbar
声明。
在加载XML之前,toolbar = tab.attachToolbar();
被覆盖。
现在**var** toolbar = tab.attachToolbar();
问题解决了。
要查看循环没有正常运行的原因,您可以阅读问题下的评论。