2009-06-10 36 views
13

Tôi đã có một hàm JavaScript đặt "onclick" -event của một số HTML-Node - ngay cả khi "onclick" -event đã được đặt trước đó.Làm cách nào để kiểm tra xem Trình tạo sự kiện JavaScript đã được đặt?

Làm cách nào tôi có thể kiểm tra xem sự kiện đó đã được đặt chưa, vì vậy tôi có thể mở rộng chức năng của mình để đặt sự kiện chỉ trên các nút HTML mà nó chưa được đặt?

Trả lời

8

Kiểm tra, như thế này:

if(typeof someNode.onclick == "function") { 
    // someNode has an event handler already set for the onclick event... 
} 

Bằng cách này, nếu bạn đang sử dụng một thư viện, bạn nên nói như vậy - nếu bạn đang có, nó có thể được dễ dàng hơn/sạch hơn và sẽ khác nhau trên cơ sở đó thư viện bạn đang sử dụng ...

+0

Và, nếu nhà phát triển sử dụng một cái gì đó như: button.addEventListener (nghe tiếng 'click', buttonPressed, true); trong Mozilla? –

+8

điều này sẽ không hoạt động cho trình xử lý sự kiện được đặt bằng attachEvent hoặc addEventListener. –

+0

Tôi biết điều đó, nhưng kể từ khi OP không xác định làm thế nào ông là dây điều lên, tôi giả định phương pháp DOM 0 làm như vậy. –

1
<input type="button" id="foo" name="foo" value="bar" /> 

<script type="text/javascript"> 
    alert(document.getElementById('foo').onclick); //undefined 
</script> 

Vì vậy, những gì bạn muốn làm là một cái gì đó như thế này:

<script type="text/javascript"> 
    if (undefined == document.getElementById('foo').onclick) 
    { 
     // Add event handler 
    } 
</script> 
+9

điều này sẽ không hoạt động cho các trình xử lý sự kiện được đặt bằng attachEvent hoặc addEventListener –

+0

thx! không biết điều đó :) –

5

Nó phải là có thể phát hiện xử lý sự kiện gắn liền sử dụng <element>.addEventListener() bằng cách chặn cuộc gọi đến các chức năng:

var myListOfAddedEvents = []; 

var realAddEventListener = HTMLElement.prototype.addEventListener; 

HTMLElement.prototype.addEventListener = function(evtType,fn,cap) { 
    myListOfAddedEvents.push(
     {on: this, type: evtType, handler: fn, capture: cap} 
    ); 

    return realAddEventListener.apply(this, arguments); 
}; 

Lưu ý: Đó là mã chưa được kiểm tra và có thể cần một số công việc. Tôi là hy vọng cùng chức năng này sẽ được tất cả các loại phần tử sử dụng, nhưng tôi có thể sai. Ngoài ra, nó sẽ chỉ hoạt động nếu bạn có thể chạy bit này mã trước khi chúng bắt đầu thêm sự kiện. Một bản sao cho attachEvent có thể được xây dựng tương tự.

+0

Bạn có thể kết hợp điều này với kỹ thuật của Jason Bunting. Bởi vì có hai cách để đăng ký trình xử lý sự kiện, chúng ta cần phải sử dụng hai kỹ thuật khác nhau để tìm chúng! – joeytwiddle

-2

thay thế khác, thêm lớp để yếu tố

if(!elem.class.match('hasEvent')) 
{ 
    elem.addEventListener(event, function(){}); 
    elem.className = elem.className + ' hasEvent'; 
} 
Các vấn đề liên quan