1
1

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 5 years have passed since last update.

《JavaScript》jQueryみたいなセレクターでDOMを取得するES6なクラス

Last updated at Posted at 2017-11-17

jQueryなしのプロジェクトで、document.getElementById()document.getElementsByClassName() を省略するためのヘルパーはいろいろ知恵がありますが、自分でも使いやすいものを作ってみました。

$(element) のようなものをclass構文で書きます。

DOMの取得をjQueryみたいにシンプルな記述にしたい

セレクタにシンボルを付与して、その文字列からメソッドを振り分けるようにしています。

毎回 new を記述するのを避けてシンプルにするため、ラップして隠蔽できるようにしました。


/**
 * # / . / * を含むセレクタを受け取ってDOMを返す
 * # : getElementById
 * . : getElementsByClassName
 * * : querySelectorAll
 */
const Selector = class {

  /**
   *
   * @param selector
   * @returns {*[]}
   */
  constructor(selector) {

    this.selector = selector;
    return this._getEl();

  }

  /**
   * セレクタを判別してDOMを取得
   * @returns {[*]}
   * @private
   */
  _getEl() {

    const method = this._selectMethod();

    const el = document[method](this.selector.slice(1));

    return !el.length ? el : [...el];

  }

  _selectMethod() {

    const matches = {
      '#': 'getElementById',
      '.': 'getElementsByClassName',
      '*': 'querySelectorAll'
    }[this.selector[0]];

    return matches;

  }

};


/**
 * new を省略するためのラッパー
 * 好きな関数名を与える
 */
const _$ = target => new Selector(target);


/**
 * こんな感じで使う
 */
console.log(_$('#el'));

console.log(_$('.el'));
console.log(_$('*[data-el]'));
console.log(_$('*p'));

console.log(_$('*#el2 p'));

これで、 _$('#yourSelector') _$('.yourSelector') _$('*yourSelector') でDOMを取得できるようになりました。

forEachを使えるように

取得したDOMは、これも取り回しやすくするために、[...el] の部分で配列に展開して、forEach() にチェインできるようにしました。


_$('*p').forEach((el) => {

  el.style.color = '#22aacc';

});

クラスをimportできるようにする

このヘルパークラスを selector.js として main.js に import できるように手を加えてみます。

selector.js

const Selector = (() => {

  class Selector  {

    constructor(selector) {

      this.selector = selector;
      return this._getEl();

    }

    _getEl() {

      const method = this._selectMethod();

      const el = document[method](this.selector.slice(1));

      return !el.length ? el : [...el];

    }

    _selectMethod() {

      const matches = {
        '#': 'getElementById',
        '.': 'getElementsByClassName',
        '*': 'querySelectorAll'
      }[this.selector[0]];

      return matches;

    }

  }

  const omitNew = (target) => new Selector(target);

  return omitNew;

})();

export default Selector;

main.js

import _$ from './utility/selector';

console.log(_$('#el'));
console.log(_$('.el'));

参考

1
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?