2011-08-02 32 views
0

Prototype + Scriptaculousを使用して実行されないループがあります。配列内の最初のオブジェクトに対して一度実行された後、停止します。PrototypeJSループは実行されません

var myMessages = new Object(); 
     myMessages = ['success','info','warning','error']; // define the messages types  
     function hideAllMessages() 
     { 
       var messagesHeights = new Array(); // this array will store height for each 

enter code here 


     // This one runs just once for the first item in the array 
       var i = 0; 
       myMessages.each(function(element) { 
        alert(element); 
        messagesHeights[i] = $('.' + element).getHeight(); 
        i++; 
        $$('.' + element + ' message').invoke('hide'); 
       }); 


       //This won't run at all=============================== 
       for (var index = 0; index < myMessages.length; index++) 
       { 
         messagesHeights[index] = $('.' + myMessages[index]).getHeight(); 
         $('x').hide(); 
         //$('.' + myMessages[i]).css('top', -messagesHeights[i]); //move element outside viewport  
       } 
     } 
+0

ブラウザのコンソールを見てください。どのようなエラーメッセージがありますか?長さがまだない配列 'messagesHeights'に割り当てることに問題があると思います。 – clockworkgeek

+0

@clockworkgeek - エラーメッセージが表示されている可能性がありますが、 '$( '。' + element)'がnullを返す可能性が最も高いです。この方法で配列に代入することはできます。 –

+0

あなたは大丈夫です。 'element.getHeight()'はそれ自身で十分です。スニペット全体にはさらに問題がありますが、高さを配列として保持することに意味はありません。 – clockworkgeek

答えて

2

私はプロトタイプのユーザーではないんだけど、ここで私がこれまで見たものです。

$は、IDにあります。私はあなたがここに$$が必要と考えている:

$$('.' + element) 

これは、配列を返すので、私はあなたがこのようなinvoke()が必要だと思う:

$$('.' + element).invoke('getHeight'); 

また、.each()はそう、コールバックへの2番目の引数としてのインデックスを渡しますあなたは自分自身を維持する必要はありませんi

myMessages.each(function(element, i) { 

また、この:

$$('.' + element + ' message') 

は... messageという名前タグを持つ要素を探しているように見えるでしょう。私はあなたが代わりにクラスをしたいと思う。

$$('.' + element + ' .message').invoke('hide'); 
+0

[実施例](http://jsfiddle.net/ANQ3c/)。 'for'ループを削除したのは、' .each() 'を複製しているように思えたからです。しかし、 '$'と '$$'と同じ問題があるようです。 – user113716

関連する問題