2013-03-07 38 views
10

Tôi đang cố viết một trình xử lý sự kiện cho một sự kiện tùy chỉnh trong WinJS. Tôi không quá chắc chắn cách này làm việc trong IE - tôi đang tạo ra một sự kiện tùy chỉnh và cử nó -Gửi dispatchEvent đồng bộ hóa hoặc chức năng không đồng bộ

var eventObject = document.createEvent("CustomEvent"); 
eventObject.initCustomEvent("dropbomb", true, true, null); 
this._element.dispatchEvent(eventObject); 

xử lý của tôi là -

this._element.addEventListener("logtelemetry", function() { 
       console.log("boom"); 
}); 

Tôi có thể chắc chắn rằng bộ xử lý sẽ được gọi đồng bộ hóa và không phải sau đó? Nếu vậy thì chứng minh là gì.

+0

@Mathletics, tại sao? nếu bạn gửi sự kiện theo cách thủ công, tại sao nó sẽ không kích hoạt ngay lập tức? – gdoron

+0

@gdoron Tôi cho là tôi không biết. Khi đọc tài liệu, hành vi thực sự không rõ ràng. – Mathletics

+0

@Mathletics, điểm của câu trả lời của tôi ... :) – gdoron

Trả lời

1

Trình xử lý sẽ được gọi ngay lập tức, sử dụng cài đặt mặc định của WinJS.Utilities.eventMixin. Không có trì hoãn.

xử lý cá nhân của bạn có thể chọn để làm công việc thu nhập hoãn lại bằng cách sử dụng setTimeout/setImmediate/setInterval/requestAnimationFrame, hoặc thực hiện một số tùy chỉnh cán khác.

Lưu ý rằng nếu bạn đang nói chuyện về các sự kiện DOM, yêu cầu họ bong bóng lên cây tử DOM - rằng tôi không phải là 100% rõ ràng về (có thể ai đó có thể nói thêm rằng cụ thể ở đây)

+0

Rất mong được xem thông số kỹ thuật ['setImmediate'] (https://developer.mozilla.org/en/docs/Web/API/Window/setImmediate) làm chuẩn! –

12

Nó đảm bảo được đồng bộ vì:

Giá trị trả lại của dispatchEvent cho biết liệu bất kỳ người nghe nào trong số có xử lý sự kiện được gọi là preventDefault hay không.

Vì giá trị trả lại cho biết có bất kỳ người nghe nào xử lý sự kiện được gọi là preventDefault hay không, phương thức phải chặn (không trả lại) cho đến khi tất cả người nghe thực hiện xong, đó là định nghĩa của cuộc gọi đồng bộ.

Trích dẫn ở trên là trích đoạn từ the dispatchEvent specification in DOM Level 2 Events, đã đạt trạng thái "Đề xuất" (tiêu chuẩn) vào tháng 11 năm 2000. Internet Explorer đã tuân thủ tiêu chuẩn này since at least IE 9.

Để tự xác minh, hãy thêm một tuyên bố console.log ngay sau cuộc gọi .dispatchEvent và thông báo rằng "boom" (từ trình xử lý sự kiện) của bạn luôn được ghi trước tiên.

+0

+1 cảm ơn bạn đã cho tôi biết tôi đã sai! – gdoron

+0

Câu trả lời hay. chỉ để tham khảo, createEvent/initCustomEvent không còn được sử dụng cho công cụ xây dựng CustomEvent() https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent – Ryan

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