Việc gọi JavaScript qua thuộc tính href và sự kiện onclick có hành vi khác biệt quan trọng, ảnh hưởng đến UX, SEO và bảo mật.
So sánh nhanh
| Đặc điểm | href="javascript:..." | onclick="..." |
|---|---|---|
| Ngữ nghĩa HTML | Vi phạm: <a> không còn là liên kết | Đúng: <a> vẫn là liên kết (có href hợp lệ) |
| Accessibility | Kém: Screen reader không hiểu | Tốt: Vẫn hoạt động như liên kết |
| SEO | Không theo dõi được liên kết | Bot có thể crawl href |
| Mở tab mới | Không hoạt động (Ctrl+Click) | Hoạt động nếu href hợp lệ |
| Lịch sử duyệt | Ghi nhận "javascript:..." | Ghi nhận URL thực |
| Content Security Policy | Thường bị chặn bởi CSP | An toàn hơn với CSP |
| Double-click protection | Có độ trễ giữa 2 click | Không có vấn đề này |
Ví dụ minh họa
<!-- Cách không khuyến khích -->
<a href="javascript:myFunc()">Gọi qua href</a>
<!-- Cách tốt hơn -->
<a href="#" onclick="myFunc(); return false;">Gọi qua onclick</a>
<!-- Cách tốt nhất (Unobtrusive JS) -->
<a href="/fallback-url" id="myLink">Liên kết đúng ngữ nghĩa</a>
<script>
document.getElementById('myLink').addEventListener('click', function(e) {
e.preventDefault(); // Ngăn điều hướng
myFunc();
});
</script>
Giải thích ví dụ gốc
Mã gốc demo hàm myFunc() tính tổng 0..999 và alert kết quả. Việc đặt trong <head> là không hợp lệ (nội dung hiển thị phải trong <body>).
Thực hành tốt nhất hiện đại
- Tách biệt HTML và JS: Gán sự kiện bằng
addEventListener. - Luôn có href hợp lệ: Dẫn đến trang fallback hoặc
#kèmreturn false. - Dùng
<button>cho hành động: Nếu không điều hướng,<button type="button">đúng ngữ nghĩa hơn<a>. - Tránh
javascript:protocol: Nó là legacy, không an toàn, khó debug.
Khi nào buộc dùng javascript:?
Hiếm khi. Có thể trong bookmarklet hoặc legacy system không thể sửa HTML. Luôn ưu tiên onclick hoặc event listener.