Tôi vừa phát hiện ra rằng FileReader gửi các sự kiện giống như thể nó là một phần tử DOM. Là nó? Tôi tự hỏi nếu nó có thể tạo ra một đối tượng tương tự như FileReader, mà không có một đại diện trong cấu trúc HTML/XML, nhưng có thể gửi các sự kiện?Có thể gửi các sự kiện trên các đối tượng thông thường (không phải các đối tượng DOM) không?
Trả lời
FileReader
có phương pháp như addEventHandler
vì nó là defined để thực hiện các giao diện EventTarget
. EventTarget
được xác định bởi thông số DOM Events nhưng bạn không cần phải là đối tượng DOM để triển khai. window
, XMLHttpRequest
và FileReader
là các đối tượng Mô hình đối tượng trình duyệt khác triển khai EventTarget
. Không may là không có cách nào dễ dàng để thực hiện các mục tiêu sự kiện của trình duyệt ... bạn có thể thử kế thừa từ đối tượng trình duyệt bằng cách sử dụng một thuộc tính prototype
, nhưng điều đó không đáng tin cậy nói chung. Tuy nhiên, không quá khó để viết mã để tự mình triển khai tất cả các phương thức trong JavaScript đơn giản:
function CustomEventTarget() { this._init(); }
CustomEventTarget.prototype._init= function() {
this._registrations= {};
};
CustomEventTarget.prototype._getListeners= function(type, useCapture) {
var captype= (useCapture? '1' : '0')+type;
if (!(captype in this._registrations))
this._registrations[captype]= [];
return this._registrations[captype];
};
CustomEventTarget.prototype.addEventListener= function(type, listener, useCapture) {
var listeners= this._getListeners(type, useCapture);
var ix= listeners.indexOf(listener);
if (ix===-1)
listeners.push(listener);
};
CustomEventTarget.prototype.removeEventListener= function(type, listener, useCapture) {
var listeners= this._getListeners(type, useCapture);
var ix= listeners.indexOf(listener);
if (ix!==-1)
listeners.splice(ix, 1);
};
CustomEventTarget.prototype.dispatchEvent= function(evt) {
var listeners= this._getListeners(evt.type, false).slice();
for (var i= 0; i<listeners.length; i++)
listeners[i].call(this, evt);
return !evt.defaultPrevented;
};
Thận trọng: mã trên nằm ngoài đầu và chưa được kiểm tra, nhưng có thể hoạt động. Tuy nhiên, nó có những hạn chế như chỉ hỗ trợ giá trị trả về dispatchEvent
nếu đối tượng Event
hỗ trợ thuộc tính DOM Cấp 3 defaultPrevented
và không hỗ trợ DOM Cấp 3 stopImmediatePropagation()
(không thể triển khai trừ khi bạn dựa vào đối tượng Sự kiện của riêng mình để hiển thị thuộc tính cho nó). Ngoài ra không có triển khai thực hiện phân cấp hoặc chụp/bong bóng.
Vì vậy, IMO: bạn không đạt được nhiều bằng cách cố gắng viết mã tham gia vào mô hình Sự kiện DOM. Đối với công việc gọi lại plain-JS, tôi chỉ cần thực hiện việc tạo danh sách listener của riêng bạn.
Tôi cho rằng đó là javascript; thông thường bất kỳ đối tượng nào có thể lấy tham chiếu đến phần tử DOM sẽ có thể gửi một sự kiện bằng hàm element.dispatchEvent; xem:
Có, đến đây từ các trang này. Tôi có nghĩa là FileReader dường như không liên quan đến bất kỳ phần tử DOM nào hoặc có tham chiếu đến nó. Nhưng đồng thời nó có một phương thức dispatchEvent trong chính nó và có thể gửi các sự kiện (các sự kiện DOM mà tôi đoán). Một chút bối rối phải không? Tôi tự hỏi nếu có một cách để tạo ra một đối tượng với các thuộc tính tương tự. – jayarjo
Vâng, tôi không có bất kỳ sự thực thi nào của FileReader xung quanh tay, vì vậy nó chỉ là đầu cơ, nhưng nếu phần tử DOM được giữ bên trong như một phương thức riêng, và dispatchEvent của FileReader chỉ chuyển tiếp cuộc gọi đến dispatchEvent của nội bộ Phần tử DOM, làm sao chúng ta biết được? – phtrivier
Bạn ngụ ý gì bởi phần tử DOM nội bộ? Có một thuật ngữ thế giới thực như thế này hay bạn đang suy đoán lại? :) Tôi đoán nếu có bất kỳ yếu tố DOM nội bộ, sau đó FileReader sẽ không cần phải chuyển tiếp bất cứ điều gì. Nó có thể là chính nó. – jayarjo
bobince has the right idea, nhưng mã của anh ấy chỉ là một ví dụ. Để thực hiện thử nghiệm chiến đấu thực tế, Mr. Doob has one that he uses in three.js.
Nếu bạn không quan tâm đến việc mô phỏng API ECMAScript, hãy xem xét [tín hiệu] (http://millermedeiros.github.com/js-signals/) và [thịt xông khói] (https://github.com/raimohanska/ bacon.js). – bsimpson
jQuery có thể gửi các sự kiện từ các đối tượng thông thường. Here's a fiddle.
function MyClass() {
$(this).on("MyEvent", function(event) {
console.log(event);
});
$(this).trigger("MyEvent");
}
var instance = new MyClass();
- 1. Các đối tượng Javascript thông thường có thể gửi các sự kiện hoặc điều này chỉ có thể cho các nút DOM không?
- 2. Sử dụng Jquery để cho phép các sự kiện trên các đối tượng JS thông thường
- 3. $ .event.trigger không kích hoạt trong đối tượng không phải DOM
- 4. Tôi có thể sử dụng các chức năng sự kiện của jQuery với các đối tượng cũ không?
- 5. SqlParameterCollection chỉ chấp nhận các đối tượng kiểu SqlParameter không null, không phải đối tượng DBNull
- 6. CÓ hoặc KHÔNG để dấu chấm phẩy trong các sự kiện đối tượng
- 7. Tại sao các hàm đáp ứng với .prototype nhưng các đối tượng thông thường thì không?
- 8. Sự kiện không hoạt động trên thẻ đối tượng html5
- 9. Làm thế nào các lớp trừu tượng có thể tham chiếu chứ không phải đối tượng?
- 10. Tạo đối tượng "trong suốt" cho các sự kiện chuột?
- 11. Các đối tượng Hibernate không có các bảng cơ bản
- 12. Đối tượng JavaScript DOM đối tượng jQuery
- 13. JAXB có thể xử lý các đối tượng java.time không?
- 14. Có phải Erlang hướng đối tượng không?
- 15. Phát hiện đối tượng DOM và đối tượng jQuery
- 16. Có thể nghe các thay đổi đối với thuộc tính của đối tượng trong JavaScript không?
- 17. DDD: Các đối tượng kết nối là đối tượng thực thể hoặc đối tượng giá trị?
- 18. jQuery ràng buộc tất cả các sự kiện trên đối tượng
- 19. Lưu trữ Pandas đối tượng cùng với các đối tượng Python thường xuyên trong HDF5
- 20. Có cách nào để sử dụng các đối tượng truy vấn MongoDB để lọc các mảng JavaScript thông thường không?
- 21. Cách phân cụm các đối tượng (không có tọa độ)
- 22. Lưu các đối tượng/serialization
- 23. Các trường đọc của đối tượng Realm có chậm hơn đối tượng java không?
- 24. Đối tượng DOM DOM "này" không chính xác
- 25. jQuery.bind() sự kiện trên đồng bằng javascript đối tượng
- 26. Ký các đối tượng JSON
- 27. Các kỹ thuật để thực hiện -hash trên các đối tượng Cacao có thể thay đổi
- 28. Các đối tượng mới có lỗi thời không?
- 29. Kiểm tra xem đối tượng có phải là phần tử DOM hay không
- 30. Tôi có thể trừu tượng Khung thực thể khỏi các đối tượng của mình không?
Tôi có mô hình sự kiện của riêng mình - một hàm liên kết các trình xử lý với một "loại sự kiện", lưu trữ chúng trong một băm và một hàm kích hoạt "sự kiện" trên các đối tượng kế thừa mô hình này (và một số phương thức tiện ích khác). Bạn có nói rằng mô hình sự kiện mặc định không có bất kỳ lợi ích có giá trị nào đối với tôi không? – jayarjo
Vâng, những lợi ích là khá nhỏ tôi muốn nói - bạn có thể không thực sự được 100% tương thích với các triển khai khác của 'Event' do không thể đọc một cách đáng tin cậy liệu' preventDefault'/'stopPropagation' /' stopImmediatePropagation' có được gọi. Vì vậy, lợi ích duy nhất là sự quen thuộc của giao diện Sự kiện DOM ... nhưng nó được cho là một giao diện khá phức tạp. – bobince
Tôi đã tình cờ gặp vấn đề này: http://www.w3.org/TR/DOM-Level-3-Events/#interface-CustomEvent, trong đó W3C đề xuất nó để tạo các loại sự kiện cụ thể cho ứng dụng. Theo như tôi thấy chưa được hỗ trợ rộng rãi, nhưng có vẻ như đó là nơi mà toàn bộ điều đang hướng tới. – jayarjo