2012-10-19 47 views
9

Tôi có một đối tượng người và về cơ bản tôi muốn nó có thể phát ra các sự kiện riêng của mình. Tuy nhiên, nếu sự kiện kích hoạt có cùng tên với mẫu thử nghiệm thì Chrome sẽ in ra một lỗi khá lớn. Trong mẫu mã bên dưới person.murder, hãy kích hoạt sự kiện murder ghi lỗi để điều khiển. (mã có ý nghĩa hơn).Lỗi kích hoạt sự kiện tùy chỉnh kích hoạt JQuery

function Person() { 

} 

Person.prototype.murder = function() { 
    $(this).trigger("murder"); 
} 

Và tôi gọi cò như thế này

var barry = new Person(); 
$(barry).on("murder", function(){ 
    alert("I am so angry"); 
}) 

barry.murder(); 

Vì vậy, giết barry gây ra một lỗi, tuy nhiên nếu sự kiện này là một cái gì đó giống như personDied hơn không có lỗi. Tôi có kích hoạt sự kiện chính xác không? Tôi chỉ muốn giết người mà không có lỗi.

Các lỗi đôi khi được quay trở lại như một sụp đổ <error> và đôi khi là

Uncaught RangeError: Maximum call stack size exceeded

+4

+1 cho "Tôi chỉ muốn giết người mà không có lỗi." – st3inn

Trả lời

9

Vấn đề là jQuery đang kêu gọi phương pháp đệ quy. Từ http://api.jquery.com/trigger/:

Note: For both plain objects and DOM objects, if a triggered event name matches the name 
of a property on the object, jQuery will attempt to invoke the property as a method if no 
event handler calls event.preventDefault(). If this behavior is not desired, use 
.triggerHandler() instead. 

Vì vậy, bạn nên sử dụng triggerHandler thay vì trigger.

+0

Thats thú vị! Tôi đoán điều đệ quy từ lỗi nhưng không có ý tưởng đó là do thiết kế! triggerHandler làm việc một điều trị. Đẹp nhất – JonWells

1

Trình kích hoạt murder gọi phương thức murder trên Person vì bạn kích hoạt nó trên đối tượng Person. Điều đó một lần nữa sẽ gọi phương thức murder và vân vân (vòng lặp bất tận).

Nếu bạn sử dụng chức năng .triggerHandler() của jQuery, nó sẽ chỉ kích hoạt trình kích hoạt và không gọi phương thức.

function Person() { 

} 

Person.prototype.murder = function() { 
    $(this).triggerHandler("murder"); 
} 

var barry = new Person(); 
$(barry).on("murder", function(){ 
    alert("I am so angry"); 
}) 

barry.murder(); 

dụ làm việc:

http://jsfiddle.net/6neHC/

jQuery .triggerHandler() doc:

http://api.jquery.com/triggerHandler/

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