2009-04-03 7 views
0

私はしばらくの間Jqueryを使用してきましたが、私は悪い/良い方法に関する質問があります。ここでの取引です。class/idを文字列でキャッチして別個の要素を選択することは悪い習慣と考えられますか?

<span class="а_s_trigger" id="tekst1">text1</span> 
<span class="а_s_trigger" id="video1">video1</span> 
       <div class="a_s_songvideo" id="showvideo1"> 

         <object> 
          //video1 
         </object> 

       </div> 
       <div class="a_s_songtext" id="showtext1"> 

         <p> 
         //text1 
         </p> 

       </div> 

やビデオやテキストのいずれかである要素のクリックで表示/非表示をトリガし、次のjQueryの機能:私たちは、このHTMLを考えてみましょう。

$('.а_s_trigger') 
      .bind('mouseover',function(e) { 
       $(this).css({background:'#F3F3F3',cursor:'pointer'}); 
      }) 
      .bind('mouseout',function(e) { 
       $(this).css({background:'#E6E6E6'});  
      }) 
      .bind('click',function(e) { 
       var id=$(this).attr('id'); 
       var status=$(this).attr('id').toString().slice(0,5); 
       var index=$(this).attr('id').toString().slice(5,7); 
       var visibility=$('#showtext'+index).css('display'); 

        if(status=='tekst1') 
        { 
         if(visibility=='block') 
         { 
          $('#showtext'+index).slideUp(); 
         } 
         else if(visibility=='none') 
         { 
          $('#showtext'+index).slideDown(); 
         } 

        } 
        else if(status=="video") 
        { 
         $('#showvideo'+index).toggle(); 
        } 




      }); 

すべてが正常に動作しているが、どのようなバグが、私は、私は要素を選択する方法は、私が必要とされています

var id=this.id; 
var status=$(this).attr('id').toString().slice(0,5); 
var index=$(this).attr('id').toString().slice(5,7); 
var visibility=$('#showtext'+index).css('display'); 

それは、このような方法で文字列に変数を割り当てるにはOKですか?

$(this).children().siblings().attr('id'); //and so on 

私は常にチェーンセレクタを使って要素を選択してみてくださいまたはそれを変更しない動作する場合、私は、」原則に従ってください: 私はjQueryのすべてのセレクタについてですなど素敵な連鎖機能があることを知っています! "?

答えて

2

私はそのはるかに簡単に私にはクラスの男

$(".button"). //etc 

だとあなたが複数の要素をつかむことができますが、場合

を言ったように、あなたの方法に問題がない場合それは動作しません!」

+0

はクラスが簡単になるだけでなく、要素に複数のクラスを使用できるという事実が、これを最適なソリューションにしています。 –

+0

私は、 "それは変更しないでください"というステートメントに同意していないが、コードをリファクタリングしてよりクリーンで読みやすくすることができれば、改善されている。私は読めないコードがとにかく壊れていると考えます。 – Miquel

+0

@ミケル - あなたが唯一のコードを見て、次にあなたのために働くものがあれば、あなたのために働きます。今チームが関与している場合、その点は – TStamper

1

いいです。条件付きログインで複数回値を使用しているので、最初にローカル変数に値を格納することは理にかなっています。

ランダムノート:idだけが必要な場合、this.idは$(this).attr( 'id')と同様に動作します。

+0

あなたはIDに関する正しいです。私はときどきjQueryが実際にJavaScriptであることを忘れる。 – chosta

2

私の考えでは、あなたのコードはちょっと混乱していると思います。 ouはイベントハンドラ内のステータスをカプセル化できます。

ステータスをクラスに要素として追加します。

<span class="а_s_trigger tekst" id="t_001">text1</span> 
<span class="а_s_trigger video" id="v_001">video1</span> 

応じバインド:

$('.а_s_trigger').bind('mouseover',function(e) { 
         $(this).css({background:'#F3F3F3',cursor:'pointer'}); 
       }).bind('mouseout',function(e) { 
         $(this).css({background:'#E6E6E6'}); 
       }); 

$('.а_s_trigger .tekst').bind('click',function(e) { 
    var index=this.id.toString().slice(2,6); 
    var $element = $('#showtext'+index); 
    var visibility=$element.css('display'); 
    if(visibility=='block') 
    { 
     $element.slideUp(); 
    } 
    else 
    { 
     $element.slideDown(); 
    }}); 

$('.а_s_trigger .video').bind('click',function(e) { 
    var index=this.id.toString().slice(2,6); 
    $('#showvideo'+index).toggle; 
}); 

EDIT:

テキスト・ハンドラは、(小さなパフォーマンスの低下との)によって置き換えることができる:

$('.а_s_trigger .tekst').bind('click',function(e) { 
    var index=this.id.toString().slice(2,6); 
    $('#showtext'+index + ':visible').slideUp(); 
    $('#showtext'+index + ':hidden').slideDown(); 
}); 
+0

+1です。他人が開発した問題の回避策を見ることは常に良いことです。 – chosta

+0

私が言うことは、アンダースコア(this.id.toString()。substring(this.id.toString()。lastIndexOf( '_')+ 1))のテストで部分文字列を使用することだけです。私はそれが私がそれを使用している理由なら、文字列内の値を区切るために何かを使うのが好きです。 –

+0

これはもっと明確ですが、実際にはidをt_NUMに変更したが元のメソッドを使用した理由です) – Miquel

関連する問題