1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

EventTarget.dispatchEvent()を使ってjQueryの.triggerHandler()を実現する

Last updated at Posted at 2019-06-25

jQueryでなら書けるけど、ネイティブのJavaScriptだと書けない・・・を克服していく記録です。

そもそもの.triggerHandler()の使いどころ

<form id="js-form">
  <div>
    <label><input type="radio" name="hoge" value="1" checked="checked">hoge1</label>
    <label><input type="radio" name="hoge" value="2">hoge2</label>
    <label><input type="radio" name="hoge" value="3">hoge3</label>
  </div>
  <p>hoge<span class="js-txt"></span>が選択されています</p>
</form>

.js-txtの中に、選択されたラジオボタンのvalueが入る想定です。

ラジオボタンの選択が変更された時(changeイベント発火時)に、.js-txtの中身が入れ替わるので、

$('input[name="hoge"]').on('change', function() {
  var result = $(this).val();
  $('.js-txt').text(result);
});

のように書くことができます。
しかし、画面がロードされた時にはイベントが発火しないので、ロード時の処理も必要になります。

var result = $('input[name="hoge"]:checked').val();
$('.js-txt').text(result);

同じことを2度書かなくてはいけないのは面倒です。
この処理をひとつにまとめることができるのが、.triggerHandler()です。

$('input[name="hoge"]').on('change', function() {
  var result = $(this).val();
  $('.js-txt').text(result);
}).triggerHandler('change');

.triggerHandler('change')でロード時に1回、changeイベントを擬似的に発火させます。

.triggerHandler().trigger()の違い

.triggerHandler()はjQueryでバインドされたイベントを呼び出すのに対して、.trigger()はその要素が持つイベントも呼び出します。

$('input').on('focus', function() {
  $('<span>Focused!</span>').appendTo('body').fadeOut(1000);
});
$('#old').on('click', function() {
  $('input').trigger('focus'); // inputにfocusが当たる
});
$('#new').on('click', function() {
  $('input').triggerHandler('focus'); // inputにfocusは当たらず、テキストの挿入とフェードアウトのみ行われる
});

参照:.triggerHandler() | jQuery API Documentation

EventTarget.dispatchEvent()

ネイティブのJavaScriptでは、EventTarget.dispatchEvent()を使って実現しました。

const $form = document.getElementById('js-form');
const $radioNodeList = $form.hoge;
const $txtWrap = document.querySelector('.js-txt');
// イベントの作成
const event = new Event('change');
// changeイベント
$form.addEventListener('change', ()=> {
  let result = $radioNodeList.value;
  $txtWrap.textContent = result;
});
// 作成したイベントの呼び出し
$form.dispatchEvent(event);

new Event('change')でイベントを作成、$form.dispatchEvent(event);で作成したイベントを呼び出しています。

サンプル

https://codepen.io/kzmhrd/pen/EBVLNz

参考

1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?