我有下一个问题: arr只有两个元素。下一个循环尝试执行他的body 3次:
var selectHTML = "";
for (var i = 0; i< arr.length; i++) {
selectHTML += '<option value="' + arr[i].id + '">' + arr[i].name + '</option>';
}
Next循环像我预期的那样,只尝试执行他的body两次:
var selectHTML = "";
for (var i = 0; i< arr.length; i++) {
alert(i);
selectHTML += '<option value="' + arr[i].id + '">' + arr[i].name + '</option>';
}
为什么(在Firefox 14.0.1中测试)?
更新:很抱歉计数器递增后的分号,这是一个打字错误。但是,如果没有它,代码仍然不能工作。
更新:好的,这段代码被简化了。整个代码本身:
var selectHTML = "";
timeSheet.steps = [ { name:"Leave as is", id:-1}, { name:"Approved", id:2} ];
for (var counter = 0; counter < timeSheet.steps.length; counter++) {
selectHTML += '<option value="' + timeSheet.steps[counter].id + '">' + timeSheet.steps[counter].name + '</option>';
}
在Firebug中,我可以看到timeSheet.steps.length等于2。顺便说一句,我添加了一个注释,body执行了2次,而不是放置"alert(i)“。魔法..。
发布于 2012-08-22 09:55:39
在循环中有一个额外的分号
for (var i = 0; i< arr.length; i++;) {
试一下,不要这样:
for (var i = 0; i< arr.length; i++) {
这对我来说工作得很好(在Firefox 14.0.1中测试):
var arr = [{id:1, name: 'test2'}, {id:2, name: 'test2'}];
var selectHTML = "";
for (var i = 0; i< arr.length; i++) {
selectHTML += '<option value="' + arr[i].id + '">' + arr[i].name + '</option>';
}
console.log(selectHTML);
var selectHTML = "";
for (var i = 0; i< arr.length; i++) {
selectHTML += '<option value="' + arr[i].id + '">' + arr[i].name + '</option>';
}
console.log(selectHTML);
返回
<option value="1">test2</option><option value="2">test2</option>
<option value="1">test2</option><option value="2">test2</option>
发布于 2012-08-22 11:10:48
请详细说明你所说的身体跑三次是什么意思。如果您的数组只包含2个元素,当为i == 2
时,arr[i]
为undefined
,因此访问id
和name
将抛出错误。
如果这是正在发生的事情,那么在循环中的某个点上,数组的长度正在被修改,有/没有添加元素。
通过添加alert
修复的问题通常是计时问题。请参阅Alerts上的这一部分
警告框(以及相关的确认和提示框)具有一些奇怪的属性。
它们是同步的,因为启动对话的脚本被挂起,直到对话关闭。脚本等待-function()警报返回,然后再继续。
棘手的部分是,一些浏览器允许在对话框可见并等待用户操作时调度事件。这意味着,当一个脚本挂起,等待报警函数返回时,另一个函数可能会作为不同事件分派的一部分执行。
用户界面事件(如mouseup和click )不会在警报期间激发,因为警报是模式的,并捕获所有用户输入,但可能会激发非用户发起的事件(如页面加载、超时处理程序和异步XMLHttpRequest返回处理程序)。
您尚未显示修改arr
变量的代码。您很有可能有一个ajax调用,其中某个地方修改了arr
。在第一个代码示例中没有任何警告,因此可能整个for循环在ajax成功处理程序触发之前就结束了。在第二个示例中,警报会阻止执行for循环,直到您放弃警报为止。在丢弃它所花费的时间内,ajax成功处理程序一定已经触发。
请分享修改 arr
变量的所有相关代码。
https://stackoverflow.com/questions/12070468
复制