ブログ

Blog

jQueryをJavaScriptに書き換えてみよう!

jQueryをJavaScriptに書き換えてみよう!

jQueryって便利

どうも。フロントエンドエンジニアの杉原睦弘です。
jQueryって便利ですよね。
私もいつもjQuery先輩にはお世話になっています。
でも、jQueryをどうしても使えないという状況は間々あるわけです。
本記事ではjQueryをPureなJavaScriptに書き換えてみたいと思います。

jQueryのサンプルコード

以下のコードを前提に書き換えていこうと思います。

HTMLの構造

<a class="demo-btn" href="javascript:void(0);">ボタン0</a>
<a class="demo-btn" href="javascript:void(0);">ボタン1</a>
<a class="demo-btn" href="javascript:void(0);">ボタン2</a>

jQueryのコード

$('.demo-btn').on('click', function() {
    alert($(this).index());
});

非常にシンプルですね。
demo-btnクラスの要素をクリックしたら、その要素が何番目の要素であるかをアラートで表示するコードです。

実際に触れるサンプルは以下のものです。

jQueryのボタンクリックのサンプル

JavaScriptに書き換える

jQueryのサンプルコードを作ったので、次はJavaScriptに書き換えていきます。

// .demo-btn を取得
var btnEl = document.querySelectorAll('.demo-btn');
// .demo-btn の数だけ回す
for (var i = 0; i < btnEl.length; i++) {
    // 各 .demo-btn にクリックイベントを付与
    btnEl[i].addEventListener('click', function(){
        alert(i); // 何番目の要素であるかを表示
    });
}

demo-btnクラスの要素を取得して、for文で回してそれぞれにクリックイベントを付与しています。
for文のイテレータが、その要素が何番目かを表しているので、alertには変数iを指定しています。

サンプルは以下のものです。
クリックしてみてください。

JavaScriptのボタンクリックのサンプル

どうですか?
アラートに表示される数字が全部3になっていますよね?
JavaScript先輩はそう簡単にイテレータを扱わせてはくれません。

何故アラートがすべて3で表示されたかというと、
クリックイベントのコールバック関数のクロージャに閉じ込めた変数iは、
イベントが作成された当時の値ではなく、変数への参照だからです。

変数iはイベント作成の後に、for文の最終的な値である3に更新されてしまったのです。
そのため、アラートには常に3が表示されていました。

もう少し、コードを改良していきましょう。

JavaScriptのボタンクリックのサンプル2

var btnEl = document.querySelectorAll('.demo-btn');
for (var i = 0; i < btnEl.length; i++) {
    // 即時関数でラップし、引数として変数jを新たに定義する
    (function(j){
        btnEl[j].addEventListener('click', function(){
           alert(j);
        });
    })(i);
}

今度はどうでしょうか。
以下のサンプルをクリックして確認してみてください。

今度は意図した通りの数字が表示されているはずです。
改良したコードでは、即時関数を使って数値を制御しました。
即時関数にも引数は指定できるので、引数として新たな変数を定義し、
クロージャにすることで、意図した通りの数値を扱うことができます。

最後に

パフォーマンスの面から、jQuery不要論は耳にしますが、私はシンタックスシュガーとして使いたい気持ちが強いです。
JavaSriptの面倒な部分を吸収してくれる恩恵は捨てがたいものがあります。
jQueryとJavaScriptのコードの比較がしやすいように、下記にまとめました。

// jQuery
$('.demo-btn').on('click', function() {
    alert($(this).index());
});

// JavaScript
var btnEl = document.querySelectorAll('.demo-btn');
for (var i = 0; i < btnEl.length; i++) {
    (function(j){
        btnEl[j].addEventListener('click', function(){
           alert(j);
        });
    })(i);
}

やっぱり、jQueryは便利!
ではでは

  • SNS
  • 投稿日
  • カテゴリー

    BTM Useful