You Might Not Need jQuery

5 min read Original article ↗

Your search didn't match any comparisons.

jquery

$.getJSON('/my/url', function (data) {});

modern

const response = await fetch('/my/url');
const data = await response.json();

jquery

$('#some.selector').load('/path/to/template.html');

modern

const response = await fetch('/path/to/template.html');
const body = await response.text();

document.querySelector('#some.selector').innerHTML = body;

jquery

$.ajax({
  type: 'POST',
  url: '/my/url',
  data: data
});

modern

await fetch('/my/url', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify(data)
});

jquery

$.ajax({
  type: 'GET',
  url: '/my/url',
  success: function (resp) {},
  error: function () {}
});

modern

const response = await fetch('/my/url');

if (!response.ok) {
}

const body = await response.text();

jquery

modern

el.classList.replace('hide', 'show');
.show {
  transition: opacity 400ms;
}
.hide {
  opacity: 0;
}

jquery

modern

el.classList.replace('show', 'hide');
.show {
  opacity: 1;
}
.hide {
  opacity: 0;
  transition: opacity 400ms;
}

jquery

ie8+

el.style.display = 'none';

jquery

ie8+

jquery

ie8+

function toggle(el) {
  if (el.style.display == 'none') {
    el.style.display = '';
  } else {
    el.style.display = 'none';
  }
}

jquery

$(el).addClass(className);

ie10+

el.classList.add(className);

jquery

$(target).after(element);

modern

jquery

modern

jquery

modern

jquery

$(target).before(element);

modern

jquery

ie9+

jquery

ie8+

jquery

ie10+

jquery

modern

node.contains(anotherNode);

jquery

$("div:contains('my text')");

modern

[...document.querySelectorAll('div')].filter((el) =>
  el.textContent.includes('my text')
);

jquery

modern

jquery

$('<div>Hello World!</div>');

modern

function generateElements(html) {
  const template = document.createElement('template');
  template.innerHTML = html.trim();
  return template.content.children;
}

generateElements('<div>Hello World!</div>');

jquery

$(selector).each(function (i, el) {});

modern

document.querySelectorAll(selector).forEach((el, i) => {});

jquery

modern

jquery

$(selector).filter(filterFn);

modern

[...document.querySelectorAll(selector)].filter(filterFn);

jquery

modern

// For direct descendants only, see https://developer.mozilla.org/en-US/docs/Web/API/Element/querySelectorAll#user_notes
el.querySelectorAll(`:scope ${selector}`);

jquery

$('.my #awesome selector');

ie8+

document.querySelectorAll('.my #awesome selector');

jquery

$(el).find(selector).length;

ie8+

!!el.querySelector(selector);

jquery

ie8+

document.querySelector(el);

jquery

ie8+

el.getAttribute('tabindex');

jquery

modern

el.getBoundingClientRect().height;

jquery

ie8+

jquery

ie8+

jquery

ie9+

getComputedStyle(el)[ruleName];

jquery

ie9+

jquery

modern

el.getBoundingClientRect().width;

jquery

$(el).hasClass(className);

ie10+

el.classList.contains(className);

jquery

modern

[...el.parentNode.children].indexOf(el);

jquery

$(el).innerHeight();
$(el).innerHeight(150);

modern

function innerHeight(el, value) {
  if (value === undefined) {
    return el.clientHeight;
  } else {
    el.style.height = value;
  }
}

innerHeight(el);
innerHeight(el, 150);

jquery

$(el).innerWidth();
$(el).innerWidth(150);

modern

function innerWidth(el, value) {
  if (value === undefined) {
    return el.clientWidth;
  } else {
    el.style.width = value;
  }
}

innerWidth(el);
innerWidth(el, 150);

jquery

modern

function isVisible(el) {
  return !!(el.offsetWidth || el.offsetHeight || el.getClientRects().length);
}

jquery

modern

[...document.querySelectorAll(el)].at(-1);

jquery

ie8+

jquery

modern

jquery

ie9+

function offset(el) {
  box = el.getBoundingClientRect();
  docElem = document.documentElement;
  return {
    top: box.top + window.pageYOffset - docElem.clientTop,
    left: box.left + window.pageXOffset - docElem.clientLeft
  };
}

jquery

ie8+

jquery

ie8+

jquery

modern

function outerHeight(el) {
  const style = getComputedStyle(el);

  return (
    el.getBoundingClientRect().height +
    parseFloat(style.marginTop) +
    parseFloat(style.marginBottom)
  );
}

outerHeight(el);

jquery

ie8+

jquery

modern

function outerWidth(el) {
  const style = getComputedStyle(el);

  return (
    el.getBoundingClientRect().width +
    parseFloat(style.marginLeft) +
    parseFloat(style.marginRight)
  );
}

outerWidth(el);

jquery

ie8+

jquery

modern

function parents(el, selector) {
  const parents = [];
  while ((el = el.parentNode) && el !== document) {
    if (!selector || el.matches(selector)) parents.push(el);
  }
  return parents;
}

jquery

modern

function position(el) {
  const {top, left} = el.getBoundingClientRect();
  const {marginTop, marginLeft} = getComputedStyle(el);
  return {
    top: top - parseInt(marginTop, 10),
    left: left - parseInt(marginLeft, 10)
  };
}

jquery

function offset(el) {
  var offset = $(el).offset();
  return {
    top: offset.top - document.body.scrollTop,
    left: offset.left - document.body.scrollLeft
  };
}

ie8+

el.getBoundingClientRect();

jquery

modern

jquery

$(el).remove();

// multiple elements
$(selector).remove();

modern

el.remove();

// multiple elements
for (const el of document.querySelectorAll(selector)) {
  el.remove();
}

jquery

$(el).removeAttr('tabindex');

ie8+

el.removeAttribute('tabindex');

jquery

$(el).removeClass(className);

ie10+

el.classList.remove(className);

jquery

$(el).replaceWith(string);

ie8+

jquery

$(formElement).serialize();

modern

new URLSearchParams(new FormData(formElement)).toString();

jquery

$(el).attr('tabindex', 3);

ie8+

el.setAttribute('tabindex', 3);

jquery

ie8+

function setHeight(el, val) {
  if (typeof val === 'function') val = val();
  if (typeof val === 'string') el.style.height = val;
  else el.style.height = val + 'px';
}

setHeight(el, val);

jquery

ie8+

jquery

$(el).css('border-width', '20px');

ie8+

// Use a class if possible
el.style.borderWidth = '20px';

jquery

ie9+

jquery

ie8+

function setWidth(el, val) {
  if (typeof val === 'function') val = val();
  if (typeof val === 'string') el.style.width = val;
  else el.style.width = val + 'px';
}

setWidth(el, val);

jquery

modern

[...el.parentNode.children].filter((child) => child !== el);

jquery

$(el).toggleClass(className);

ie10+

el.classList.toggle(className);

jquery

modern

el.replaceWith(...el.childNodes);

jquery

modern

function val(el) {
  if (el.options && el.multiple) {
    return el.options
      .filter((option) => option.selected)
      .map((option) => option.value);
  } else {
    return el.value;
  }
}

jquery

modern

function wrap(el) {
  const wrappingElement = document.createElement('div');
  el.replaceWith(wrappingElement);
  wrappingElement.appendChild(el);
}

jquery

$(el).click(function () {});

modern

el.addEventListener('click', () => {});

jquery

$(document).on(eventName, elementSelector, handler);

modern

document.addEventListener(eventName, (event) => {
  if (event.target.closest(elementSelector)) {
    handler.call(event.target, event);
  }
});

jquery

$(el).off(eventName, eventHandler);

ie9+

el.removeEventListener(eventName, eventHandler);

jquery

$(el).on(eventName, eventHandler);
// Or when you want to delegate event handling
$(el).on(eventName, selector, eventHandler);

modern

function addEventListener(el, eventName, eventHandler, selector) {
  if (selector) {
    const wrappedHandler = (e) => {
      if (!e.target) return;
      const el = e.target.closest(selector);
      if (el) {
        eventHandler.call(el, e);
      }
    };
    el.addEventListener(eventName, wrappedHandler);
    return wrappedHandler;
  } else {
    const wrappedHandler = (e) => {
      eventHandler.call(el, e);
    };
    el.addEventListener(eventName, wrappedHandler);
    return wrappedHandler;
  }
}

// Use the return value to remove that event listener, see #off
addEventListener(el, eventName, eventHandler);
// Or when you want to delegate event handling
addEventListener(el, eventName, eventHandler, selector);

jquery

$(document).ready(function () {});

modern

function ready(fn) {
  if (document.readyState !== 'loading') {
    fn();
  } else {
    document.addEventListener('DOMContentLoaded', fn);
  }
}

jquery

$(el).trigger('my-event', {some: 'data'});

modern

const event = new CustomEvent('my-event', {detail: {some: 'data'}});
el.dispatchEvent(event);

jquery

modern

function trigger(el, eventType) {
  if (typeof eventType === 'string' && typeof el[eventType] === 'function') {
    el[eventType]();
  } else {
    const event =
      typeof eventType === 'string'
        ? new Event(eventType, {bubbles: true})
        : eventType;
    el.dispatchEvent(event);
  }
}

trigger(el, 'focus');
// For a full list of event types: https://developer.mozilla.org/en-US/docs/Web/API/Event
trigger(el, new PointerEvent('pointerover'));

jquery

$.each(array, function (i, item) {});

modern

array.forEach((item, i) => {});

jquery

ie9+

jquery

$.extend(true, {}, objA, objB);

modern

function deepExtend(out, ...arguments_) {
  if (!out) {
    return {};
  }

  for (const obj of arguments_) {
    if (!obj) {
      continue;
    }

    for (const [key, value] of Object.entries(obj)) {
      switch (Object.prototype.toString.call(value)) {
        case '[object Object]':
          out[key] = out[key] || {};
          out[key] = deepExtend(out[key], value);
          break;
        case '[object Array]':
          out[key] = deepExtend(new Array(value.length), value);
          break;
        default:
          out[key] = value;
      }
    }
  }

  return out;
}

deepExtend({}, objA, objB);

jquery

$.extend({}, objA, objB);

modern

const result = {...objA, ...objB};

jquery

ie9+

jquery

ie9+

jquery

modern

function isNumeric(num) {
  if (typeof num === 'number') return num - num === 0;
  if (typeof num === 'string' && num.trim() !== '')
    return Number.isFinite(+num);
  return false;
}

isNumeric(val);

jquery

$.map(array, function (value, index) {});

modern

array.map((value, index) => {});

jquery

ie9+

jquery

$.each(obj, function (key, value) {});

modern

for (const [key, value] of Object.entries(obj)) {
}

jquery

modern

function parseHTML(str) {
  const tmp = document.implementation.createHTMLDocument('');
  tmp.body.innerHTML = str;
  return [...tmp.body.childNodes];
}

parseHTML(htmlString);

jquery

ie8+

jquery

$(els).slice(begin, end);

ie9+

jquery

modern

const array = [...document.querySelectorAll(selector)];

jquery

ie9+

jquery

ie8+

Object.prototype.toString
  .call(obj)
  .replace(/^\[object (.+)\]$/, '$1')
  .toLowerCase();