2011-10-01 8 views
0

forループを使用して次のjQueryを単純化できますか?jQueryを使用したクラスのバインド配列

$("#nav li a.h").mouseover(
    function() { 
    if($(".content.h").is(":hidden")) { 
     $(".content.h").fadeIn('fast'); 
    } 
    } 
); 
$("#nav li a.e").mouseover(
    function() { 
    if($(".content.e").is(":hidden")) { 
     $(".content.e").fadeIn('fast'); 
    } 
    } 
); 
$("#nav li a.o").mouseover(
    function() { 
    if($(".content.o").is(":hidden")) { 
     $(".content.o").fadeIn('fast'); 
    } 
    } 
); 

私はこれを試してみましたが、運:それはJavaScriptの変数として解釈されませんので

var pg = ["h","e","o"]; 
for (var i = 0; i < pg.length; i++) { 
    $("#nav li a.pg[i]").mouseover(
     function() { 
     if($(".content.pg[i]").is(":hidden")) { 
      $(".content.pg[i]").fadeIn('fast'); 
     } 
     } 
    ); 
} 

答えて

3

pg[i]内の引用符は、変数として動作しません、あなたは+を使用してセレクタ文字列にそれを追加する必要があります。

より最適化:私は基本的に掲載

$.each(["h","e","o"], function(i, id) { 
    $("#nav li a."+id).mouseover(function() { 
     $(".content."+id+":hidden").fadeIn('fast'); 
    }); 
}); 
+0

+1の簡潔さと、この解決策が適切なクロージャを作成し、 'id'変数が各マウスオーバーハンドラ(ループインデックス' i'の標準となる方法)の間で共有されないようにするためです。 – nnnnnn

+0

美しい、ありがとう!それはすぐそこの芸術です。 – Zade

2

は、文字列にpg[i]を追加しません。代わりに、これを使用する:

var pg = ["h", "e", "o"] 
for(var i=0; i<pg.length; i++){ 
    (function(current){ 
     $("#nav li a."+current).mouseover(
      function() { 
       if($(".content."+current).is(":hidden")) { 
        $(".content."+current).fadeIn('fast'); 
       } 
      } 
     ); 
    })(pg[i]) 
} 
+0

:$ .eachメソッドがループするときに使用するための高速で良好であり、あなたがelem.is(':hidden')かどうかを確認する必要はありませんが、単にセレクタで:hidden含めます私はマウスオーバー機能のそれぞれが同じ 'current'変数にアクセスしていることを認識したので、私はそれを削除しました。実際に実行された時点で、それらはすべて" current "を" o "として使用します。 (私の場合、余分な変数は気にしませんでしたが、私はpg [i]を持っていましたが、同じ問題です。)編集:Davidの答えはこの問題を解決します。 – nnnnnn

+0

私はクロージャの問題を修正しました。 –

関連する問題