4

このJavaScriptコードは、Firefox、Chrome、およびSafariで動作しています

for (idx in all_auction_ids){
    alert(all_auction_ids[idx]);
};

上記の場合、 で値を取得する代わりにall_auction_ids、最初に取得する値は for ループのように見える関数型のテキストです!

しかし、以下のコードを実行すると、問題なく動作します。

for (idx=0;idx<all_auction_ids.length;idx=idx+1){
    alert(all_auction_ids[idx]);
};

編集: 更新

デバッグを行ったところ、Orbited と stomp.js を追加すると、おそらく配列で何かが行われていることがわかりました。

今のところ、私は Tracker1 の提案 jquery の $.each を使用しています。

詳細: http://groups.google.com/group/orbited-users/browse_thread/thread/7fd658cfb166e9fa

問題のある配列 http://bayimg.com/fAnhaAaBb

問題のないアレイ http://bayimg.com/FaNhEAabb

4

5 に答える 5

5

JavaScript の for/in コンストラクトは、伝統的に、配列インデックスではなく、オブジェクト メンバー名を反復処理するためのものです。より先進的なブラウザは、隠しプロパティなどの機能を追加して、Array などのケースを期待どおりに列挙できるようにしていますが、IE は依然として昔ながらの方法でそれを行い、for を使用すると「toString」メソッドのようなオブジェクト メンバーを提供します。 /in 配列上。

indexed-for は、標準的な JavaScript 配列ループのままです。(おそらく 'for ( var idx=...' を意味しますが、'idx++' の方が一般的です。)

于 2009-01-20T23:16:58.723 に答える
2

注目に値するのは、prototype.js などの一部のライブラリが Array を拡張しているため、内部インデックス以外の追加のプロパティを持つことです。これは、他の人が述べたように、IEがプロパティを反復することを超えて、x in y表記を破ります。for i=0...i++ が優先されます。

また、注目に値するのは、jQuery、prototype などで、私が実際に好む .each(fn) 表記法が提供されていることです。

于 2009-01-20T23:50:43.350 に答える
1

@bibinceは、おそらく " for(var i = 0..."構文を使用する必要があることに同意しますが、の作成で奇妙なことを行わない限り、選択した構文が機能しない理由はありませんall_auction_ids。アレイをどのように初期化していますか?

JavaScriptの配列は、特別な自動インクリメント機能を備えた単なるオブジェクトですが、実際には、匿名オブジェクトと大差ありません。Firebugでこれを試してください:

var a = ['a','b','c'];
a.d = 'd';
for(var i in a) console.log(i, a[i]);

または、これをIEのアドレスバーに貼り付けて、Enterキーを押します。

javascript:var a = ['a']; a.d = 'd'; for(var i in a) alert(a[i]); alert(a.length);

編集:

これがあなたの問題ではないかと思いますが、次を使用した場合にも同じ問題が発生しますか?

var all_auction_ids = [];

それよりも

var all_auction_ids = new Array();

それでも問題が解決しない場合は、コードをもう少し投稿して、どのようにデータを入力しているかをより正確に把握してくださいall_auction_ids

于 2009-01-20T23:37:15.437 に答える
0

最近、チェックボックスのリストに「すべて選択/すべてクリア」ボタンを作成する際に、同様の問題が発生しています。Firefox と Chrome では正常に動作しますが、IE7/8 では動作しません。私はフレームワークや外部ライブラリを使用していません。すべての JavaScript は私自身のものであり、かなり単純なものであり、それほど多くはありません。getElementsByTagName を使用して入力要素の配列を構築し、ループします。

var allClearInputs = document.getElementsByTagName("input");
for(ac=0;ac<allClearInputs.length;ac=ac+1){
    if(allClearInputs[ac].id){
        var thisNameArr = allClearInputs[ac].id.split("-");
        var thisName = thisNameArr[0];
        if(thisName == checkName){
            if((actionType == 'all' && allClearInputs[ac].checked == false) || (actionType == 'clear' && allClearInputs[ac].checked == true)){
                allClearInputs[ac].click();
            }
        }
    }
}

for(ac=0;ac<allClearInputs.length;ac=ac+1){ で完全に動作します
: for(var ac in allClearInputs) で惨めに失敗します

于 2010-06-04T15:29:21.010 に答える