5

私は次のコードを持っています:

JS:

var test2 = ['RMrpi5Z8doc','JIPbUaqyYx0','MbjXYg0YRmw'];

    $('tr').live('click', function(event){
      $($(this).attr('class').split(' ')).each(function() { 
        if (!((this == 'even') || (this == 'odd'))) {
            alert(jQuery.inArray(this, test2));
            if (this == 'RMrpi5Z8doc') {
              alert(this);
            }
        }   
      });
    });

HTML :

  <table>
   <tr class="odd RMrpi5Z8doc">
     <td>Kite</td>
     <td>Just Like Vinyl</td>
     <td>Audiotree</td>
   </tr>
  </table>

inArray は一致せず、-1 を返します。リテラル文字列に一致する if ステートメントは一致します。inArray のリテラルに代入すると、それも一致します。

jQuery attr はもう文字列を返さないという投稿を見たことがありますが、jQuery サイトの attr のドキュメントを見ると、そうしているようです。

おそらく、私はこれについてまったく別の方法で行くべきですか?

4

3 に答える 3

5

間違った を使用していeachます。つまりjQuery.each、汎用イテレータ:

$.each($(this).attr('class').split(' '), function ...);

not each、jQuery インスタンスのインスタンス関数:

$($(this).attr('class').split(' ')).each(function ...); // Wrong

特に、何が起こっているかは、上記のこの部分です。

$($(this).attr('class').split(' '))

...$()配列で呼び出しますが、それはあなたがやりたいことをしません。:-)

于 2012-10-22T13:56:52.637 に答える
1

を使用してこれをリファクタリングしました:

$(document).on('click', 'tr', function(){
  alert(jQuery.inArray($(this).attr('id'), test2));
}

これはうまくいくようです。これらの識別子をスタイルシートに使用していないため、クラス名を id フィールドに移動しました。これらは実際には id です。

于 2012-10-22T14:42:04.400 に答える
0

それは確かにタイプの不一致です。に切り替えるとif (this === 'RMrpi5Z8doc') {、2番目のアラートは発生しなくなります。を使用this.toString()すると、次のようにこの問題が解決します。

$.each($(this).attr('class').split(' '), function() { 
    //...etc.

ちなみに、これは珍しい方法です。通常、次のhasClassメソッドを使用してクラスをテストします。

$('tr').on('click', function() {
    if ($(this).hasClass('odd')) {
        //...

:evenまた、raina77owが指摘しているように、と疑似クラスがあります:odd

$('tr').on('click', function() {
    if ($(this).is(':odd')) {
        //...

このように、あなたはあなたoddevenクラスを完全に省くことができます。

于 2012-10-22T14:33:03.410 に答える