1

次の問題があります。arr には 2 つの要素しかありません。次のループは、彼の体を 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 でテスト済み)?

更新: カウンタのインクリメントの後のセミコロンで申し訳ありません。これはタイプミスです。しかし、コードはそれなしではまだ機能しません。

更新: OK、このコードは簡略化されました。コード全体:

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)" を配置する代わりに、コメントを追加して body を 2 回実行しました。魔法...

4

2 に答える 2

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 に答える
0

体が 3 回走るということの意味を詳しく説明してください。配列に 2 つの要素しか含まれていない場合i == 2arr[i]undefinedであるため、アクセスするidnameエラーがスローされます。

これが起こっている場合、ループのある時点で、要素が追加されているかどうかにかかわらず、配列の長さが変更されています。

を追加することで修正される問題alertは、通常、タイミングの問題です。アラートに関するこのセクションを参照してください

アラート ボックス (および関連する確認ボックスとプロンプト ボックス) には、いくつかの奇妙なプロパティがあります。

ダイアログを開始するスクリプトは、ダイアログが閉じられるまで中断されるという意味で、それらは同期的です。スクリプトは、alert() 関数が戻るのを待ってから続行します。

注意が必要なのは、一部のブラウザーでは、ダイアログが表示されていてユーザーの操作を待機している間にイベントをディスパッチできることです。これは、1 つのスクリプトが中断され、アラート関数が戻るのを待っている間に、別の関数が別のイベント ディスパッチの一部として実行される可能性があることを意味します。

アラートはモーダルであり、すべてのユーザー入力をキャプチャするため、マウスアップやクリックなどのユーザー インターフェイス イベントはアラート中に発生しませんが、ページの読み込み、タイムアウト ハンドラー、非同期 XMLHttpRequest リターン ハンドラーなどのユーザーによって開始されないイベントは発生する可能性があります。

arr変数を変更するコードは示していません。を変更している ajax 呼び出しがある可能性がありますarr。最初のコード サンプルにはアラートがないため、おそらく ajax 成功ハンドラーが起動する前に for ループ全体が終了します。2 番目のサンプルでは、​​アラートは、アラートを破棄するまで for ループが実行されないようにします。破棄するのにかかった時間内に、ajax 成功ハンドラーが起動したに違いありません。

arr変数を変更するすべての関連コードを共有してください。

于 2012-08-22T11:10:48.127 に答える