453 lines
5.2 KiB
Markdown
453 lines
5.2 KiB
Markdown
---
|
|
title: DOM vs. jQuery
|
|
category: JavaScript libraries
|
|
layout: 2017/sheet
|
|
---
|
|
|
|
## Selectors
|
|
{: .-versus.-no-hide}
|
|
|
|
### Selectors
|
|
|
|
```js
|
|
$('.selector')
|
|
```
|
|
|
|
```js
|
|
document.querySelector('.selector')
|
|
document.querySelectorAll('.selector')
|
|
```
|
|
|
|
### Iteration
|
|
|
|
```js
|
|
$('.selector').each(function () {
|
|
$(this)
|
|
})
|
|
```
|
|
|
|
```js
|
|
const elements = document.querySelectorAll('.selector')
|
|
|
|
Array.from(elements).forEach(el => {
|
|
···
|
|
})
|
|
```
|
|
|
|
The result of some DOM operations return NodeLists (eg, `querySelectorAll`, `children`, and others). These can't be iterated via `.forEach()` until you convert them to arrays using `Array.from()`.
|
|
|
|
## Classes
|
|
{: .-versus}
|
|
|
|
### Add class
|
|
|
|
```js
|
|
$(el).addClass('expanded')
|
|
```
|
|
|
|
```js
|
|
el.classList.add('expanded')
|
|
```
|
|
|
|
See: [Element.classList](https://developer.mozilla.org/en-US/docs/Web/API/Element/classList)
|
|
|
|
### Remove class
|
|
|
|
```js
|
|
$(el).removeClass('expanded')
|
|
```
|
|
|
|
```js
|
|
el.classList.remove('expanded')
|
|
```
|
|
|
|
### Toggle class
|
|
|
|
```js
|
|
el.toggleClass('expanded')
|
|
```
|
|
|
|
```js
|
|
el.classList.toggle('expanded')
|
|
```
|
|
|
|
### Replace class
|
|
|
|
```js
|
|
el.hasClass('expanded')
|
|
```
|
|
|
|
```js
|
|
el.classList.contains('expanded')
|
|
```
|
|
|
|
### Update class
|
|
|
|
```js
|
|
$(el).removeClass('collapsed')
|
|
$(el).addClass('expanded')
|
|
```
|
|
|
|
```js
|
|
el.classList.replace('collapsed', 'expanded')
|
|
```
|
|
|
|
## DOM ready
|
|
{: .-versus}
|
|
|
|
### Document ready
|
|
|
|
```js
|
|
$(function () {
|
|
console.log('loaded')
|
|
})
|
|
```
|
|
|
|
```js
|
|
function ready (fn) {
|
|
if (document.readyState !== 'loading') {
|
|
fn()
|
|
} else {
|
|
document.addEventListener('DOMContentLoaded', fn)
|
|
}
|
|
}
|
|
|
|
ready(() => {
|
|
console.log('loaded')
|
|
})
|
|
```
|
|
|
|
The [dom-loaded](https://www.npmjs.com/package/dom-loaded) npm package takes care of this for you.
|
|
|
|
## Attributes
|
|
{: .-versus}
|
|
|
|
### Get attribute
|
|
|
|
```js
|
|
$(el).attr('tabindex')
|
|
```
|
|
|
|
```js
|
|
el.getAttribute('tabindex')
|
|
```
|
|
|
|
### Set attribute
|
|
|
|
```js
|
|
$(el).attr('tabindex', 3)
|
|
```
|
|
|
|
```js
|
|
el.setAttribute('tabindex', 3)
|
|
```
|
|
|
|
### Remove attribute
|
|
|
|
```js
|
|
$(el).removeAttr('hidden')
|
|
```
|
|
|
|
```js
|
|
el.removeAttribute('hidden')
|
|
```
|
|
|
|
## Properties
|
|
{: .-versus}
|
|
|
|
### Get checked
|
|
|
|
```js
|
|
$(el).prop('checked')
|
|
```
|
|
|
|
```js
|
|
el.checked
|
|
```
|
|
|
|
### Set checked
|
|
|
|
```js
|
|
$(el).prop('checked', true)
|
|
```
|
|
|
|
```js
|
|
el.checked = true
|
|
```
|
|
|
|
### Get disabled
|
|
|
|
```js
|
|
$(el).prop('disabled')
|
|
```
|
|
|
|
```js
|
|
el.disabled
|
|
```
|
|
|
|
### Set disabled
|
|
|
|
```js
|
|
$(el).prop('disabled', true)
|
|
```
|
|
|
|
```js
|
|
el.disabled = true
|
|
```
|
|
|
|
## Traversing
|
|
{: .-versus}
|
|
|
|
### Children
|
|
|
|
```js
|
|
$(el).children()
|
|
```
|
|
|
|
```js
|
|
el.children
|
|
```
|
|
|
|
### Parent
|
|
|
|
```js
|
|
$(el).parent()
|
|
```
|
|
|
|
```js
|
|
el.parentNode
|
|
```
|
|
|
|
### Siblings
|
|
|
|
```js
|
|
$(el).next()
|
|
$(el).previous()
|
|
```
|
|
|
|
```js
|
|
el.nextSibling
|
|
el.previousSibling
|
|
```
|
|
|
|
### Closest match
|
|
|
|
```js
|
|
$(el).closest('div')
|
|
```
|
|
|
|
```js
|
|
el.closest('div')
|
|
```
|
|
|
|
### Match check
|
|
|
|
```js
|
|
$(el).is(':checked')
|
|
```
|
|
|
|
```js
|
|
el.matches(':checked')
|
|
```
|
|
|
|
### Finding
|
|
|
|
```js
|
|
$(el).find('button')
|
|
```
|
|
|
|
```js
|
|
el.querySelector('button')
|
|
el.querySelectorAll('button')
|
|
```
|
|
|
|
## Inputs
|
|
{: .-versus}
|
|
|
|
### Blur
|
|
|
|
```js
|
|
$(el).blur()
|
|
```
|
|
|
|
```js
|
|
el.blur()
|
|
```
|
|
|
|
### Focus
|
|
|
|
```js
|
|
$(el).focus()
|
|
```
|
|
|
|
```js
|
|
el.focus()
|
|
```
|
|
|
|
## DOM operations
|
|
{: .-versus}
|
|
|
|
### Remove
|
|
|
|
```js
|
|
$(el).remove()
|
|
```
|
|
|
|
```js
|
|
el.parentNode.removeChild(el)
|
|
```
|
|
|
|
### Append
|
|
|
|
```js
|
|
$(el).append(newEl)
|
|
```
|
|
|
|
```js
|
|
el.appendChild(newEl)
|
|
```
|
|
|
|
### Before
|
|
|
|
```js
|
|
$(refEl).before(newEl)
|
|
```
|
|
|
|
```js
|
|
refEl.parentNode.insertBefore(newEl, refEl)
|
|
```
|
|
|
|
### After
|
|
|
|
```js
|
|
$(refEl).after(newEl)
|
|
```
|
|
|
|
```js
|
|
refEl.parentNode.insertBefore(newEl, refEl.nextSibling)
|
|
```
|
|
|
|
If `refEl` is at the end, `refEl.nextSibling` will be null. The behavior of `insertBefore(el, null)` is the same as `appendChild(el)`.
|
|
|
|
See: [Node.insertBefore](https://developer.mozilla.org/en-US/docs/Web/API/Node/insertBefore) _(developer.mozilla.org)_
|
|
|
|
### Before/after (HTML)
|
|
|
|
```js
|
|
$(el).before('<span></span>')
|
|
$(el).after('<span></span>')
|
|
```
|
|
|
|
```js
|
|
el.insertAdjacentHTML('beforebegin', '<span></span>')
|
|
el.insertAdjacentHTML('afterend', '<span></span>')
|
|
```
|
|
|
|
## Events
|
|
{: .-versus}
|
|
|
|
### Attach event
|
|
|
|
```js
|
|
$(el).on('click', (event) => {
|
|
···
|
|
})
|
|
```
|
|
|
|
```js
|
|
el.addEventListener('click', (event) => {
|
|
···
|
|
})
|
|
```
|
|
|
|
See: [EventTarget.addEventListener](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener) _(developer.mozilla.org)_
|
|
|
|
### Trigger
|
|
|
|
```js
|
|
$(el).trigger('click')
|
|
```
|
|
|
|
```js
|
|
var ev = document.createEvent('HTMLEvents')
|
|
ev.initEvent('click', true, true)
|
|
el.dispatchEvent(ev)
|
|
```
|
|
|
|
See: [document.createEvent](https://developer.mozilla.org/en-US/docs/Web/API/Document/createEvent) _(developer.mozilla.org)_
|
|
|
|
## HTML
|
|
{: .-versus}
|
|
|
|
### Getting HTML
|
|
|
|
```js
|
|
$(el).html()
|
|
// → "<div>hello</div>"
|
|
```
|
|
|
|
```js
|
|
el.innerHTML
|
|
// → "<div>hello</div>"
|
|
```
|
|
|
|
### Setting HTML
|
|
|
|
```js
|
|
$(el).html('<span>ok</span>')
|
|
```
|
|
|
|
```js
|
|
el.innerHTML = '<span>ok</span>'
|
|
```
|
|
|
|
See: [Element.innerHTML](https://developer.mozilla.org/en-US/docs/Web/API/Element/innerHTML) _(developer.mozilla.org)_
|
|
|
|
### Getting text
|
|
|
|
```js
|
|
$(el).text()
|
|
```
|
|
|
|
```js
|
|
el.textContent
|
|
```
|
|
|
|
<!-- needs polyfill for IE8 below -->
|
|
|
|
### Setting text
|
|
|
|
```js
|
|
$(el).text('hello')
|
|
```
|
|
|
|
```js
|
|
el.textContent = 'hello'
|
|
```
|
|
|
|
## Creating elements
|
|
{: .-versus}
|
|
|
|
### Create element
|
|
|
|
```js
|
|
div = $('<div>')
|
|
div = $.parseHTML('<div>')
|
|
```
|
|
|
|
```js
|
|
div = document.createElement('div')
|
|
```
|
|
|
|
### With class name
|
|
|
|
```js
|
|
div = $('<div class="hello">')
|
|
div = $.parseHTML('<div class="hello">')
|
|
```
|
|
|
|
```js
|
|
div = document.createElement('div')
|
|
div.className = 'hello'
|
|
```
|