12/08/2018, 17:40

Bạn không cần jQuery nữa đâu!

jQuery là một trong những thư viện javascript được yêu thích và đã từng được rất nhiều lập trình viên frontend sử dụng. Giờ đây, khi các trình duyệt ngày càng được phát triển và hỗ trợ nhiều tính năng hơn, chúng ta có thể thay thế những tác vụ của jQuery bằng các phương thức mặc định. Điều này ...

jQuery là một trong những thư viện javascript được yêu thích và đã từng được rất nhiều lập trình viên frontend sử dụng. Giờ đây, khi các trình duyệt ngày càng được phát triển và hỗ trợ nhiều tính năng hơn, chúng ta có thể thay thế những tác vụ của jQuery bằng các phương thức mặc định.

Điều này mang đến nhiều lợi ích như:

  • Không quá phụ thuộc vào jQuery
  • Không cần phải import thêm thư viện. Giảm tải cho server
  • Tăng tốc độ xử lý. jQuery viết các hàm xử lý bao ngoài JavaScript để thân thiện hơn với người dùng, việc này đương nhiên sẽ làm cho tốc độ xử lý chậm hơn
  • Sự ra đời của các thư viện như React, Angular, Vue... đã khiến cho việc can thiệp trực tiếp vào DOM trở thành một thói quen không tốt

Vì thế, dưới đây mình sẽ giới thiệu một số cách để thay thế các hàm của jQuery bằng các hàm JavaScript thuần (hay còn gọi là VanillaJS), được hỗ trợ bởi phần lớn trình duyệt hiện nay.

1. Query Selector

Đối với những selector phổ biến như class, id hoặc thuộc tính thì chúng ta có thể sử dụng như sau:

  • document.querySelector trả về element đầu tiên được tìm thấy
  • document.querySelectorAll trả về tất cả các element được tìm thấy dưới dạng một instance của NodeList. Nó có thể được convert qua array bằng cách [].slice.call(document.querySelectorAll(selector) || []);
  • Nếu không có element nào được tìm thấy, thì jQuery sẽ trả về một array rỗng [] trong khi đó DOM API sẽ trả về null. Hãy chú ý đến Null Pointer Exception. Bạn có thể sử dụng toán tử || để đặt giá trị default nếu như không có element nào được tìm thấy, ví dụ như document.querySelectorAll(selector) || []

Chú ý : document.querySelector và document.querySelectorAll hoạt động khá chậm, hãy thử dùng getElementById, document.getElementsByClassName hoặc document.getElementsByTagName nếu bạn muốn đạt hiệu suất tốt hơn.

// Chọn bằng ID
$('#myElement')

// Chọn bằng CSS class
$('.myElement')

// Chọn bằng tên thẻ
$('div')

// Phức tạp hơn
$('article#first p.summary')
// Chọn bằng ID
document.getElementById('myElement')
document.querySelector('#myElement')

// Chọn bằng CSS class
document.getElementsByClassName('myElement')
document.querySelectorAll('.myElement')

// By tag name
document.getElementsByTagName('div')
document.querySelectorAll('div')

// Phức tạp hơn
document.querySelectorAll('article#first p.summary')

2. CSS & Style

Get style của 1 element

// jQuery
$el.css('color');

// Native
const win = el.ownerDocument.defaultView;
win.getComputedStyle(el, null).color;

Set style cho 1 element

// jQuery
$el.css({ color: '#f01' });

// Native
el.style.color = '#f01';

Thêm class

// jQuery
$el.addClass(className);

// Native
el.classList.add(className);

Xóa class

// jQuery
$el.removeClass(className);

// Native
el.classList.remove(className);

Kiểm tra tên class đã tồn tại chưa

// jQuery
$el.hasClass(className);

// Native
el.classList.contains(className);

3. Thao tác với DOM

Xóa 1 element

// jQuery
$el.remove();

// Native
el.parentNode.removeChild(el);

Get và set nội dung của element

// jQuery
$el.html();
$el.html(htmlString);

// Native
el.innerHTML;
el.innerHTML = htmlString;

Append

// jQuery
$el.append('<div id="container">Hello World</div>');

// Native (HTML string)
el.insertAdjacentHTML('beforeend', '<div id="container">Hello World</div>');

// Native (Element)
el.appendChild(newEl);

4. Ajax

Fetch API là một chuẩn mới thay thế cho XMLHttpRequest để xử lý ajax.

// jQuery
$(selector).load(url, completeCallback)

// Native
fetch(url).then(data => data.text()).then(data => {
  document.querySelector(selector).innerHTML = data
}).then(completeCallback)

Xem thêm về Fetch API tại đây.

5. Events

Document ready

// jQuery
$(document).ready(function() {
    console.log( "ready!" );
});

// Native
document.addEventListener('DOMContentLoaded', function () {
    console.log("ready!");
});

Bind event bằng on

// jQuery
$el.on(eventName, eventHandler);

// Native
el.addEventListener(eventName, eventHandler);

Unbind event bằng off

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

// Native
el.removeEventListener(eventName, eventHandler);

6. Các hàm tiện ích

Hầu hết các hàm tiện ích của jQuery có thể sử dụng trực tiếp bằng Vanilla JS. Những hàm nâng cao khuyến khích sử dụng các thư viện chuyên biệt, nâng cao tính nhất quán và hiệu năng. Ví dụ như Lodash.

isArray

// jQuery
$.isArray(array);

// Native
Array.isArray(array);

inArray

// jQuery
$.inArray(item, array);

// Native
array.indexOf(item) > -1;

// ES6-way
array.includes(item);

array loop

// jQuery
$.each(array, (index, value) => {
});
$.map(array, (value, index) => {
});

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

parseJSON

// jQuery
$.parseJSON(str);

// Native
JSON.parse(str);

7. Promises

JavaScript đã cung cấp các phương thức rất tối giản và đầy đủ để xử lý promise.

done, fail, always

// jQuery
$promise.done(doneCallback).fail(failCallback).always(alwaysCallback)

// Native
promise.then(doneCallback, failCallback).then(alwaysCallback, alwaysCallback)

when

// jQuery
$.when($promise1, $promise2).done((promise1Result, promise2Result) => {
});

// Native
Promise.all([$promise1, $promise2]).then([promise1Result, promise2Result] => {});

Tìm hiểu thêm tại đây.

8. Animation

Show & hide element

// jQuery
$el.show();
$el.hide();

// Native
el.style.display = '|'inline'|'inline-block'|'inline-table'|'block';
el.style.display = 'none';

FadeIn & FadeOut

Xử lý phần này bằng JS thuần có vẻ hơi cực, nên sử dụng một thư viện chuyên về xử lý animation.

// jQuery
$el.fadeIn(3000);
$el.fadeOut(3000);

// Native fadeOut
function fadeOut(el, ms) {
  if (ms) {
    el.style.transition = `opacity ${ms} ms`;
    el.addEventListener(
      'transitionend',
      function(event) {
        el.style.display = 'none';
      },
      false
    );
  }
  el.style.opacity = '0';
}

// Native fadeIn
function fadeIn(elem, ms) {
  elem.style.opacity = 0;

  if (ms) {
    const opacity = 0;
    const timer = setInterval(function() {
      opacity += 50 / ms;
      if (opacity >= 1) {
        clearInterval(timer);
        opacity = 1;
      }
      elem.style.opacity = opacity;
    }, 50);
  } else {
    elem.style.opacity = 1;
  }
}

Kết luận

Bạn có nên từ bỏ jQuery không? Câu trả lời là... hên xui. Nếu dự án của bạn đang dùng một thư việc ngoài phụ thuộc vào jQuery, chẳng hạn như FancyBox, và việc thay đổi có thể đòi hỏi nhiều thời gian để hoàn thành, thì câu trả lời là không nên. Nếu bạn muốn sử dụng những thư viện mới, và muốn phía client đạt hiệu năng cao nhất thì ưu tiên những giải pháp không cần jQuery.

Bài viết này không có ý định khuyên bạn từ bỏ hoàn toàn jQuery, cũng không phủ định sự tuyệt vời của nó. Chỉ đơn giản là bổ sung thêm chút thông tin để giúp lựa chọn của các bạn thêm chính xác.

funny

(ảnh lượm lặt trên mạng)

Tham khảo

  • https://github.com/nefe/You-Dont-Need-jQuery
  • https://ehkoo.com/bai-viet/co-the-ban-khong-can-jquery
  • https://viblo.asia/p/ban-nen-hoc-javascript-thuan-truoc-khi-hoc-cac-framework-js-3Q75wDE7KWb
  • http://youmightnotneedjquery.com/
0