我自己找到了一个解决方案,这还极大地改善了EventSource接口。
服务器端:不要发送事件类型,只需包含一个额外的数据字段(我总是使用JSON)。因此,不是:
event: eventName
data: {mykey: 'myvalue'}
我改成了从服务器发送:
data: {mykey: 'myvalue', eventName: 'eventName'}
客户端:现在我可以使用EventSource的onmessage回调函数,该函数在没有事件类型的每个消息上触发。
而对于绑定事件监听器,我创建了一个具有Backbone.Event功能的包装类。结果是:
var MyEventSource = (function() {
function MyEventSource(url) {
var self = this;
_.extend(this, Backbone.Events);
this.source = new EventSource(url);
this.source.onmessage = function(event) {
var data, eventName;
var data = JSON.parse(event.data);
var eventName = data.eventName; delete data.eventName;
console.log('app.server.on ', eventName, '. Data: ', data);
self.trigger(eventName, data);
};
}
return MyEventSource;
})();
现在有了这个包装类,我可以轻松地扩展功能,所有服务器发送的事件都可以很容易地被监控,而且通过扩展Backbone.Events,这个类中的事件处理功能也更加强大。
使用示例:
var source = new MyEventSource('url/of/source');
source.on('eventName', function(data) {
console.log(data);
});
source.trigger('eventName', { mykey: 'myvalue' });
source.off('eventName');
现在我有一个易于处理、扩展、调试和测试的组件。
onmessage = some_function;
和调用addEventListener("message", some_function);
是完全相同的。这表明没有事件类型的消息与事件类型为 "message" 的消息是相同的。 - Ashitakatothemario
的回答,根据您的指导,我尝试了source.addEventListener('eventName', MyHander, false);
这个方法可以在不使用包装器的情况下正常工作。(请查看下面的答案以获取完整示例) - Alex C