1

我有下一个问题: arr 只有两个元素。下一个循环尝试执行他的身体 3 次:

var selectHTML = "";
for (var i = 0; i< arr.length; i++) {
    selectHTML += '<option value="' + arr[i].id + '">' + arr[i].name + '</option>';
} 

正如我所料,下一个循环只尝试执行他的身体 2 次:

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。顺便说一句,我没有放置“alert(i)”,而是添加了注释,并且正文执行了 2 次。魔法...

4

2 回答 2

0

请详细说明你所说的身体跑三遍是什么意思。如果您的数组仅包含 2 个元素,则 when i == 2arr[i]is undefined,因此访问id并将name引发错误。

如果这是正在发生的事情,那么在循环中的某个时刻,数组的长度正在修改,有/没有添加元素。

通过添加解决的alert问题通常是时间问题。请参阅有关警报的此部分

警报框(以及相关的确认和提示框)有一些奇怪的属性。

它们是同步的,因为启动对话框的脚本会暂停,直到对话框关闭。该脚本在继续之前等待 alert() 函数返回。

棘手的部分是一些浏览器允许在对话框可见并等待用户操作时调度事件。这意味着当一个脚本被挂起,等待警报函数返回时,另一个函数可能作为不同事件调度的一部分被执行。

用户界面事件(如 mouseup 和 click)在警报期间不会触发,因为警报是模态的并捕获所有用户输入,但非用户启动的事件(如页面加载、超时处理程序和异步 XMLHttpRequest 返回处理程序)可能会触发。

您没有显示修改arr变量的代码。您可能有一个 ajax 调用,它正在修改arr. 在第一个代码示例中没有警报,因此可能整个 for 循环在 ajax 成功处理程序触发之前就结束了。在第二个示例中,警报会阻止执行 for 循环,直到您放弃警报。在您丢弃它的时间里,ajax 成功处理程序必须已经触发。

请分享所有修改arr变量的相关代码。

于 2012-08-22T11:10:48.127 回答
0

循环中有一个额外的分号

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-22T09:55:39.133 回答