JavaScript と jQuery の書き方の比較
このページは、 JavaScript と jQuery の書き方の違いをまとめる予定のページです。
目次
注意
- 「jQuery で書いていたコードを jQuery 無しの時どう書くか」の参考ページです。
- このページを作ったひとが自分のために記載しているため網羅性はありません。
少し古いですが基本的には You Might Not Need jQuery を見るといいと思います。 - コードのライセンスは CC0 (クレジット表示不要、改変可、商用可) です。
- できるだけ素の IE11 以上で使用できるように調整しています。(他の想定ブラウザは Edge, Chrome, Firefox)
書き方の比較
要素の条件確認
is(selector)
const $target = $('#foo');
if ($target.is('input[type=password]')) {
// ...
}
if (!Element.prototype.matches) Element.prototype.matches = Element.prototype.msMatchesSelector; // IE11
const target = document.querySelector('#foo');
if (target.matches('input[type=password]')) {
// ...
}
反復処理
each()
$('.foo').each(function(){
const $el = $(this);
// ...
});
if (!NodeList.prototype.forEach) NodeList.prototype.forEach = Array.prototype.forEach; // IE11
document.querySelectorAll('.foo').forEach(function(el){
// ...
}):
for (const el of document.querySelectorAll('.foo')) {
// ...
}
次の要素
next()
const $target = $('#foo');
const $el = $target.next();
const target = document.querySelector('#foo');
const el = target.nextElementSibling;
next(selector)
const $target = $('#foo');
const $el = $target.next('.bar');
/**
* 対象要素の兄弟要素の中で指定セレクタにマッチする次の要素を取得します。
* @param {Element} el 対象要素
* @param {string} selector 指定セレクタ
* @returns {Element} 見つかった要素 (存在しない場合 null)
*/
const nextElementSibling = function(el, selector) {
if (!Element.prototype.matches) Element.prototype.matches = Element.prototype.msMatchesSelector; // IE11
let result = el.nextElementSibling;
while (result && !result.matches(selector)) result = result.nextElementSibling;
return result;
};
const target = document.querySelector('#foo');
const el = nextElementSibling(target, '.bar');
前の要素
prev()
const $target = $('#foo');
const $el = $target.prev();
const target = document.querySelector('#foo');
const el = target.previousElementSibling;
prev(selector)
const $target = $('#foo');
const $el = $target.prev('.bar');
/**
* 対象要素の兄弟要素の中で指定セレクタにマッチする前の要素を取得します。
* @param {Element} el 対象要素
* @param {string} selector 指定セレクタ
* @returns {Element} 見つかった要素 (存在しない場合 null)
*/
const previousElementSibling = function(el, selector) {
if (!Element.prototype.matches) Element.prototype.matches = Element.prototype.msMatchesSelector; // IE11
let result = el.previousElementSibling;
while (result && !result.matches(selector)) result = result.previousElementSibling;
return result;
};
const target = document.querySelector('#foo');
const el = previousElementSibling(target, '.bar');
要素の挿入
before(node)
const $target = $('#foo');
const $newNode = $('div').text('test');
$target.before($newNode);
const target = document.querySelector('#foo');
const newNode = document.createElement('div'); newNode.textContent = 'test';
target.parentNode.insertBefore(newNode, target);
const target = document.querySelector('#foo');
const newNode = document.createElement('div'); newNode.textContent = 'test';
target.insertAdjacentElement('beforebegin', newNode);
after(node)
const $target = $('#foo');
const $newNode = $('div').text('test');
$target.after($newNode);
const target = document.querySelector('#foo');
const newNode = document.createElement('div'); newNode.textContent = 'test';
target.parentNode.insertBefore(newNode, target.nextSibling);
const target = document.querySelector('#foo');
const newNode = document.createElement('div'); newNode.textContent = 'test';
target.insertAdjacentElement('afterend', newNode);
イベントハンドラ
on(event, selector, handler)
$(document).on('click', '.foo', function(e){
const foo = e.currentTarget;
})
if (!Element.prototype.matches) Element.prototype.matches = Element.prototype.msMatchesSelector; // IE11
if (!Element.prototype.closest) { // IE11
Element.prototype.closest = function(s) {
let el = this;
do { if (el.matches(s)) return el; el = el.parentElement || el.parentNode; } while (el !== null && el.nodeType === 1);
return null;
};
}
document.addEventListener('click', function(e){
if (e.target.matches('.foo, .foo *')) {
const foo = e.target.closest('.foo');
}
});
イベント発火
trigger(eventType)
const $target = $('#foo');
$target.trigger('change');
const target = document.querySelector('#foo');
let event = null;
try {
event = new Event('change', { bubbles: true, cancelable: false });
} catch (e) { // IE11
event = document.createEvent('Event');
event.initEvent('change', true, false);
}
target.dispatchEvent(event);
/**
* 対象要素の兄弟要素の中で指定セレクタにマッチする前の要素を取得します。
* @param {string} type イベントタイプ
* @param {object} eventInitDict オプション (bubbles, cancelable)
* @returns {Event} イベントオブジェクト
*/
const newEvent = function(type, eventInitDict) {
try {
return new Event(type, eventInitDict);
} catch (e) { // IE11
const event = document.createEvent('Event');
eventInitDict = eventInitDict || {};
event.initEvent(type, eventInitDict.bubbles, eventInitDict.cancelable);
return event;
}
};
const target = document.querySelector('#foo');
target.dispatchEvent(newEvent('change', { bubbles: true, cancelable: false }));
const target = document.querySelector('#foo');
target.dispatchEvent(new Event('change', { bubbles: true, cancelable: false }));
trigger(eventType, data)
const $target = $('#foo');
$target.trigger('bar', { a: 1, b: 2 });
const target = document.querySelector('#foo');
let event = null;
try {
event = new CustomEvent('bar', { bubbles: false, cancelable: false, detail: { a: 1, b: 2 } });
} catch (e) { // IE11
event = document.createEvent('CustomEvent');
event.initCustomEvent('bar', false, false, { a: 1, b: 2 });
}
target.dispatchEvent(event);
/**
* 対象要素の兄弟要素の中で指定セレクタにマッチする前の要素を取得します。
* @param {string} type イベントタイプ
* @param {object} eventInitDict オプション (bubbles, cancelable, detail)
* @returns {Event} イベントオブジェクト
*/
const newCustomEvent = function(type, eventInitDict) {
try {
return new CustomEvent(type, eventInitDict);
} catch (e) { // IE11
const event = document.createEvent('CustomEvent');
eventInitDict = eventInitDict || {};
event.initCustomEvent(type, eventInitDict.bubbles, eventInitDict.cancelable, eventInitDict.detail);
return event;
}
};
const target = document.querySelector('#foo');
target.dispatchEvent(newCustomEvent('bar', { bubbles: false, cancelable: false, detail: { a: 1, b: 2 } }));
const target = document.querySelector('#foo');
target.dispatchEvent(new CustomEvent('bar', { bubbles: false, cancelable: false, detail: { a: 1, b: 2 } }));