Hệ Thống Sự Kiện Tương Tác Người Dùng Trong JavaScript

1. Chuỗi Sự Kiện Nhấn Chuột

Tên Sự KiệnMô Tả Kỹ Thuật
clickKích hoạt sau khi nhấn giữ và nhả nút chuột trái hoàn tất trên một thành phần.
mousedownKích hoạt ngay tại thời điểm lực nhấn vào nút chuột trái được áp dụng.
mouseupKích hoạt ngay tại thời điểm nhả lực khỏi nút chuột trái.
dblclickKích hoạt khi phát hiện chuỗi hành vi nhấp hai lần liên tiếp trong khoảng thời gian cho phép của hệ điều hành.

Trình tự thực thi khi nhấp đơn:

mousedown → mouseup → click

Trình tự thực thi khi nhấp đúp:

(mousedown → mouseup → click) × 2 → dblclick
<script>
const targetDoc = document.documentElement;

targetDoc.addEventListener('mousedown', () => console.log('🔽 Sự kiện mousedown'));
targetDoc.addEventListener('mouseup', () => console.log('🔼 Sự kiện mouseup'));
targetDoc.addEventListener('click', () => console.log('⚡ Sự kiện click'));
targetDoc.addEventListener('dblclick', () => console.log('🔄 Sự kiện dblclick'));
</script>

2. Cơ Chế Di Chuyển Con Trỏ Trên Vùng Thành Phần

Tên Sự KiệnMô Tả Kỹ Thuật
mouseenterChỉ kích hoạt khi con trỏ bước vào vùng bounds của thành phần chính. Bỏ qua việc đi qua các phần tử con.
mouseleaveChỉ kích hoạt khi con trỏ rời hoàn toàn ra ngoài vùng bounds của thành phần chính.
mouseoverKích hoạt khi con trỏ vào thành phần cha VÀ mỗi lần di chuyển từ phần tử này sang phần tử con bên trong nó.
mouseoutKích hoạt khi con trỏ rời thành phần cha VÀ mỗi lần thoát khỏi phần tử con để quay lại vùng trống của cha.

Lưu ý: mouseover và mouseout xử lý từng thành phần riêng lẻ, dẫn đến hiện tượng bắn sự kiện nhiều lần khi con trỏ quét qua cấu trúc phân cấp DOM (bubbling).

<script>
const wrapperArea = document.getElementById('container-box');

wrapperArea.addEventListener('mouseenter', () => console.log('➡️ Entered parent zone'));
wrapperArea.addEventListener('mouseleave', () => console.log('⬅️ Left parent zone'));
wrapperArea.addEventListener('mouseover', (evt) => console.log(`🌊 Over element: ${evt.target.id || 'root'}`));
wrapperArea.addEventListener('mouseout', (evt) => console.log(`🍂 Out from: ${evt.relatedTarget?.id || 'parent'}`));
</script>

3. Sự Kiện Cập Nhật Trạng Thái Đầu Vào (change)

Được gắn mặc định cho các thẻ quản lý dữ liệu như <input>, <select> và <textarea>. Khác với input (bắn liên tục khi gõ), change chỉ kích hoạt khi người dùng xác nhận hoặc bỏ trường nhập liệu.

<script>
function bindChangeHandler(selector) {
  const elements = document.querySelectorAll(selector);
  elements.forEach(field => {
    field.addEventListener('change', function() {
      console.log(`[Change] Trường ${this.name}: giá trị mới là "${this.value}"`);
    });
  });
}

bindChangeHandler('input[type="text"], input[name="gender"], input[name="hobby"], select, textarea');
</script>

4. Hệ Thống Xử LýINPUT Bàn Phím

Tên Sự KiệnMô Tả Kỹ Thuật
keydownKích hoạt tức thì khi lực nhấn phím được truyền xuống trình duyệt. Hỗ trợ lặp nếu giữ lâu (tùy hệ thống OS).
keypressKích hoạt đối với các phím tạo ký tự ASCII. Không kích hoạt phím chức năng thuần túy (Ctrl, Alt, Shift, Meta). Ưu tiên thấp hơn keydown.
keyupKích hoạt ngay khi lực nhấn trên phím được thả lỏng hoàn toàn.

Trình tự ngắn (nhấn rồi thả nhanh):

keydown → keypress → keyup

Trình tự dài (giữ phím liên tục):

(keydown → keypress) 🔁 Lặp lại → ... → keyup
<script>
document.addEventListener('keydown', function(evt) {
  console.log(`🔻 Keydown: mã ${evt.code}, phím "${evt.key}"`);
});

document.addEventListener('keypress', function(evt) {
  console.log(`📝 Keypress: ký tự "${evt.key}" được ghi nhận`);
});

document.addEventListener('keyup', function(evt) {
  console.log(`🔺 Keyup: phím "${evt.key}" đã được nhả`);
});
</script>

5. Quản Lý Tiêu Điểm (Focus & Blur)

Sự kiện focus kích hoạt khi thành phần nhận quyền điều khiển nhập liệu hoặc khi cửa sổ trình duyệt quay trở thành cửa sổ active. Ngược lại, blur kích hoạt khi mất tiêu điểm hoặc chuyển sang ứng dụng khác.

<script>
const inputField = document.querySelector('#user-input');

// Theo dõi trạng thái tiêu điểm cục bộ trên trường nhập
inputField.addEventListener('focus', () => console.log('🎯 Input received focus'));
inputField.addEventListener('blur', () => console.log('💨 Input lost focus'));

// Theo dõi trạng thái tiêu điểm toàn cục của trình duyệt
window.addEventListener('focus', () => console.log('🖥️ Browser window became active'));
window.addEventListener('blur', () => console.log('⏹️ Browser window lost focus'));
</script>

Thẻ: javascript-dom mouse-events keyboard-events form-interaction focus-blur-mechanics

Đăng vào ngày 1 tháng 10 lúc 16:35