0

問題が見つかりません。あなたが私を助けることができるかもしれません:

load_images: function(config, container, page) {

   console.log(page) // Every time page = 4 Why?
   var paging = new Element('div','class':'pg'}).inject(container,'after'),     
       css_class = '';

   if (data.pages>1) {
     for (var i=1; i<=data.pages; i++) {                        
        css_class   = (i == page) ? 'current' : '';

        new Element('a', {'class':css_class,'href':'javascript:void(0);','html': i,
           events: { 
               click: function(e){
                  load_images(config, container, parseInt(i));
              }
           }
        }).inject(paging);
     }
   }
}

The code above generate HTML:

<div class="pg">
   <a class="current" href="javascript:void(0);">1</a>
   <a class="" href="javascript:void(0);">2</a>
   <a class="" href="javascript:void(0);">3</a>
</div>

ページ リンクをクリックすると、ページ変数は 4 になります (console.log() を参照)。なんで?ありがとう。

4

1 に答える 1

2

これは、Javascript Closureの典型的なケースです。

問題は、あなたの場合、クリックイベントがクロージャーを作成し、ループ内の i 変数を閉じるため、最終的には i の最後の値に等しくなります。それを解決するためにできることは、「for」ループで次のようなものです:

for (var i=1; i<=data.pages; i++) {                        
        css_class   = (i == page) ? 'current' : '';

        (function(i){
          new Element('a', {'class':css_class,'href':'javascript:void(0);','html': i,
            events: { 
               click: function(e){
                  load_images(config, container, parseInt(i));
              }
           }
         }).inject(paging);
       })(i);
     }

このようにして i のコピーを作成し、それを匿名関数に送信すると、常にその値が「保持」されます。

それを完全に理解するには - 私が送ったリンクを読んでください - この主題は JavaScript で少し複雑です

于 2013-04-12T13:16:26.930 に答える