2009-10-03 34 views
157

Có cách nào để kiểm tra xem sự kiện có tồn tại trong jQuery không? Tôi đang làm việc trên một plugin sử dụng các sự kiện không gian tên tùy chỉnh và muốn kiểm tra xem sự kiện đó có được liên kết với một phần tử hay không.Kiểm tra xem sự kiện có tồn tại trên thành phần

+1

vậy, trong 1.8, tất cả điều này là sai? –

+4

@SkylarSaveland Method '$ .data (yếu tố," sự kiện ")' chưa bao giờ chính thức. Nhưng trong jQuery 1.8.0, phương thức này được để lại thông qua '$ ._ data (element," events ")'. đọc thêm [tại đây] (http://blog.jquery.com/2012/08/09/jquery-1-8-released/) – Anton

Trả lời

129
$('body').click(function(){ alert('test')}) 

var foo = $.data($('body').get(0), 'events').click 
// you can query $.data(object, 'events') and get an object back, then see what events are attached to it. 

$.each(foo, function(i,o) { 
    alert(i) // guid of the event 
    alert(o) // the function definition of the event handler 
}); 

Bạn có thể kiểm tra bằng cách cho ăn tham chiếu đối tượng (không phải là đối tượng jQuery dù) đến $ .data, và cho thức ăn chăn nuôi đối số thứ hai 'sự kiện' và điều đó sẽ trả về một đối tượng dân cư với tất cả các sự kiện như ' nhấp chuột'. Bạn có thể lặp qua đối tượng đó và xem trình xử lý sự kiện làm gì.

+2

Tôi thực sự thích ví dụ đầu tiên của bạn tốt hơn, các sự kiện $ .data (elem, ' ') cung cấp nhiều thông tin hơn. –

+0

tôi đã thêm rằng dưới dạng nhận xét –

+17

Tại sao bạn không sử dụng $ ('body'). Data ('events')? – James

24

sử dụng jquery kiện lọc

bạn có thể sử dụng nó như thế này

$("a:Event(click)") 
+33

Hah, cảm ơn, đã xây dựng plugin đó sau khi nhận được câu trả lời của người trả lời tháng trước. –

+19

Kể từ 1.8, plugin này không còn hoạt động –

+3

Tôi thích điều này, đăng một plugin OP được tạo ra như một câu trả lời cho câu hỏi của mình :) – Andy

5

tôi đã viết một plugin gọi hasEventListener mà chính xác nào đó.

Hy vọng điều này sẽ hữu ích.

+1

Vấn đề là, nó hoạt động như thế nào? Tôi đã ở đó trong một vài giờ, và nó vẫn chưa rõ ràng. Tôi chỉ muốn kiểm tra xem có sự kiện nhấp vào nó hay không, và lấy lại boolean, không phải là một đối tượng, nhưng hầu hết các phương pháp mà bạn cung cấp, ít nhất là các ví dụ, phức tạp hơn nhiều. Thật thú vị: http://www.codingjack.com/playground/jquick/#haseventlistener, nhưng tôi không sử dụng jquick, nhưng tôi thích sự đơn giản đơn giản đó. –

62

Bạn có thể sử dụng:

$("#foo").unbind('click'); 

để đảm bảo tất cả các sự kiện nhấp chuột là unbinded, sau đó đính kèm sự kiện của bạn

+1

Không giúp đỡ nếu bạn đã sử dụng trực tiếp để đăng ký sự kiện. http://stackoverflow.com/questions/12755646/jquery-datatables-multiple-calls-to-event-handler-with-live-function –

+25

Câu hỏi là kiểm tra xem sự kiện có tồn tại trên phần tử hay không và cách hủy liên kết các sự kiện hiện có ... – Avi

+35

@Avi, nó vẫn là một câu trả lời hay, bởi vì trong nhiều trường hợp, câu hỏi được đặt ra với vấn đề trong đầu: "Làm thế nào để không đăng ký một trình xử lý hai lần?" – hans

3

Dưới mã sẽ cung cấp cho bạn với tất cả các sự kiện click vào chọn đưa ra:

jQuery(selector).data('events').click 

Bạn có thể lặp qua nó bằng cách sử dụng từng cái hoặc ví dụ. kiểm tra độ dài để xác thực như:

jQuery(selector).data('events').click.length 

Nghĩ rằng nó sẽ giúp ai đó. :)

+1

Không hoạt động thêm trong jQuery> = 1.8. Xem câu trả lời của Tom Gerken cho một giải pháp làm việc. – jbandi

25

Dưới đây là làm thế nào để kiểm tra xem mọi trường hợp tồn tại cho một yếu tố

<html> 
<head> 
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js" type="text/javascript"></script> 
    <script> 
     $(function() { 
      $("#textDiv").click(function() { 
       //Event Handling 
      }); 
      var events = $._data(document.getElementById('textDiv'), "events"); 
      var hasEvents = (events != null); 
     }); 
    </script> 
</head> 
<body> 
<div id="textDiv">Text</div> 
</body> 
</html> 
+0

Tôi nghĩ bạn có thể đơn giản hóa điều này bằng cách sử dụng: var eventBound = (events! = Null); –

+0

Giải pháp này hoạt động với jQuery 1.8.0 sau đó. Cảm ơn bạn rất nhiều Ton Gerken :) –

-1

tôi đã kết thúc làm điều này

typeof ($('#mySelector').data('events').click) == "object" 
0

Tác phẩm này dành cho tôi nó hiển thị các đối tượng và loại sự kiện đã xảy ra.

var foo = $._data($('body').get(0), 'events'); 
    $.each(foo, function(i,o) { 
    console.log(i); // guide of the event 
    console.log(o); // the function definition of the event handler 
    }); 
Các vấn đề liên quan