2010-06-03 24 views
9

Tôi biết điều này có thể dễ dàng thực hiện trong jQuery hoặc bất kỳ khung công tác nào khác, nhưng đó không thực sự là vấn đề. Làm thế nào để tôi đi về 'đúng' ràng buộc một sự kiện nhấp chuột trong javascript tinh khiết? Tôi biết làm thế nào để làm điều đó nội tuyến (Tôi biết điều này là khủng khiếp)Làm cách nào để ràng buộc một cú nhấp chuột vào một liên kết không có khung (javascript)

<a href="doc.html" onclick="myFunc(); return false">click here</a> 

và điều này làm javascript của tôi thực thi cho trình duyệt hỗ trợ JS và liên kết hoạt động bình thường cho những người không có javascript?

Bây giờ, làm cách nào để làm điều tương tự một cách không nội tuyến?

+3

Cách bạn đang làm điều đó không phải là khủng khiếp. Nó chắc chắn có nhược điểm nhưng nó cũng có lợi thế hơn tất cả các phương pháp khác (không yêu cầu tài liệu để tải trước khi nó sẽ làm việc là chính). Đừng để bản thân bị tẩy não bởi sự tuyên truyền của sự kín đáo. –

Trả lời

19

Nếu bạn cần phải gán chỉ có một click sự kiện, bạn có thể gán onclick:

Nếu bạn có một ID:

myAnchor = document.getElementById("Anchor"); 
myAnchor.onclick = function() { myFunc(); return false; } 

bạn cũng có thể đi qua tất cả các neo:

anchors = document.getElementsByTagName("a"); 

for (var i = 0; i < anchors.length; i++) { 

anchors[i].onclick = ..... 

} 

Ngoài ra còn có một document.getElementsByClassName để mô phỏng bộ chọn lớp của jQuery nhưng nó không được hỗ trợ bởi tất cả các trình duyệt.

Nếu có thể bạn cần chỉ định nhiều sự kiện trên một phần tử, hãy truy cập addEventListener được hiển thị bởi @Jordan và @David Dorward.

+0

Sự khác nhau giữa việc sử dụng thuộc tính 'onClick' và' addEventListener' là gì? Cái nào tốt hơn? Tôi tin rằng đó cũng là một chức năng 'click', vì vậy bạn có thể làm' myAnchor.click = (event) => ... '? –

6

Cách cơ bản là sử dụng document.getElementById() để tìm phần tử và sau đó sử dụng addEventListener để nghe sự kiện.

Trong HTML của bạn:

<a href="doc.html" id="some-id">click here</a> 

Trong JavaScript:

function myFunc(eventObj) { 
    // ... 
} 

var myElement = document.getElementById('some-id'); 
myElement.addEventListener('click', myFunc); 

Hoặc bạn có thể sử dụng một chức năng ẩn danh:

document.getElementyById('some-id').addEventListener('click', function(eventObj) { 
    // ... 
}); 
+1

Hãy nhớ rằng IE không hỗ trợ 'addEventListener' - bạn phải sử dụng' attachEvent' để thay thế. –

+0

Cảm ơn lời nhắc, el.pescado. –

4

Give it ID và bạn sẽ có thể phải làm:

document.getElementById("the id").onclick = function{ ... } 
+0

Ngắn, ngọt, và cho điểm. Trả lời câu hỏi trực tiếp mà không có lông tơ. +1 – Steve

0

Bạn không cần phải sử dụng jQuery, nhưng bạn có thể dùng thử addEvent funciton phổ biến của John Resig.

Có nhiều điều được coi là 'không đúng' gắn một sự kiện trên thẻ HTML bằng javascript thuần túy.

http://www.pagecolumn.com/javascript/bind_event_in_js_object.htm

+1

Đây không phải là một phương pháp tốt vì nó phụ thuộc vào hàm ToString thực sự trả về phần thân hàm để xử lý sự kiện. Điều này không được bảo đảm. –

4

Đây là một phương pháp cross-browser đẹp

var on = (function(){ 
    if ("addEventListener" in window) { 
     return function(target, type, listener){ 
      target.addEventListener(type, listener, false); 
     }; 
    } 
    else { 
     return function(object, sEvent, fpNotify){ 
      object.attachEvent("on" + sEvent, function(){ 
       fpNotify(window.event); 
      }); 
     }; 
    } 
}()); 


on(document.getElementById("myAnchor"), "click", function(){ 
    alert(this.href); 
}); 
0

Nhờ Pekka, nhớ ràng buộc người nghe phải toàn bộ mảng của các yếu tố với một lớp nhất định, nhanh chóng tăng số lượng các sự kiện ràng buộc để các yếu tố.

sử dụng vòng lặp for trong một cách nhanh hơn:

for (var i = Things.length - 1; i >= 0; i--) { 
    Things[i] 
}; 

sự biểu hiện đầu tiên của vòng lặp for sẽ tính toán một lần duy nhất, vì vậy theo cách này, nó sẽ không thông qua DOM và tính toán độ dài của mảng Bên cạnh đó, vì cấu trúc ngăn xếp bước vào mảng ngược lại nhanh hơn nên bước lên phía trước.

Các vấn đề liên quan