2017-11-27 5 views
1

前もって謝罪これは非常に単純な解決策であり、私は重度の脳のおならの真っ只中にいるように感じます。私はES6構文を使用してクリックしているアイテムのデータIDを取得しようとしていますが、どの方法で実行しても定義されません。要素を選択するときにデータIDを見つけることができません

HTML

<ul> 
    <li class="list-item" data-id="item-1">Click me</li> 
    <li class="list-item" data-id="item-2">Click me</li> 
    <li class="list-item" data-id="item-3">Click me</li> 
</ul> 

JS

let $el = $('ul'); 

class List { 
    constructor($el) { 
     this.$el = $el; 

     this.$listItem = $el.find('li'); 

     this.attachHandlers(); 
    } 

    attachHandlers() { 
     this.$listItem.on('click',() => { 
      var data = $(this).attr('data-id'); 
      console.log(data); 
     }); 
    } 
} 

const _init =() => { 
    if ($el.length) { 
     $el.each((i, v) => { 
      new List($(v)); 
     }); 
    } 
}; 

_init(); 

アイブ氏がダウンし、できるだけ多くのコードを単純化し、誰もが私がここで間違ってやっているものを参照してください?

答えて

1

問題はattachHandlersメソッドにあります。矢印関数を使用しているため、thisはクリックされた要素ではなくクラスを参照します。

矢印機能を通常の機能に変更します。 Josanの答えに加えて

1

、あなたは、矢印の機能を使用し続けるこのようにそれを使用したい場合:より多くの議論については

class List { 
    constructor($el) { 
     this.$el = $el; 
     this.attachHandlers(); 
    } 

    attachHandlers() { 
     this.$el.on('click', 'li', (e) => { 
      var data = $(e.currentTarget).attr('data-id'); 
      console.log(data); 
     }); 
    } 
} 

this threadを参照してください。

+0

これは、リスト内ではなく、クリックされた要素の最初の要素のデータ-IDの内容を返すように思われます。イベントを渡してconsole.log e.currentTargetを渡すと正しい要素が表示されますが、常に最初の要素のデータIDが返されます – user934902

+0

@ user934902 - コンストラクタは常に最初の 'li'を'これは$ listItem'です。 – 31piy

+0

私はあなたの答えについて、あなたが説明したように矢印の機能を使ってどのように問題を解決するのか混乱しています – user934902

-2

だけのjQueryを使用して、より簡便な:

$(".list-item").on('click', function() { 
 
    console.log($(this).data('id')); 
 
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<ul> 
 
    <li class="list-item" data-id="item-1">Click me</li> 
 
    <li class="list-item" data-id="item-2">Click me</li> 
 
    <li class="list-item" data-id="item-3">Click me</li> 
 
</ul>

+0

彼はjQueryを使用しています –

関連する問題