私はオブザーバー パターンを非常に普遍的な方法で JS に実装しました。概念的な問題があり、それを解決する方法がわからないことに気付きました。解決方法を教えていただけないでしょうか。(特に非常にスマートな方法で:-))これはコードです:
var Oberserverable = function() {
var subscribers = { /* some delegated functions in here */ };
return {
attach: function (obj, fn) { subscribers[obj] = { src: obj, fn: fn }; },
detach: function (obj) { delete subscribers[obj]; },
notify: function (args) {
for(var o in subscribers) {
if(typeof args === "object") { args.target = subscribers[o].src; }
/* TODO return */ subscribers[o].fn.call(window, args);
}
},
count: function () { var size = 0; for(var o in subscribers) { size++; } return size; }
};
};
委任された各関数がその値を返すことを望みます。しかし、これは私が防ぎたいループを終わらせるでしょう。
私が使用しているケースの例; 安っぽいIE8 Eventhandelingの回避策:
window.addEvent = function (obj, type, fn, bub) {
if(obj.addEventListener) {
return obj.addEventListener(type, fn, bub ? bub : false);
}
if(obj.attachEvent && type == "DOMContentLoaded") type = "load";
// no use of attachEvent() 'cause of very buggy behaviour in IE<=8
// http://stackoverflow.com/questions/15952943/ie-attachevent-call-returns-true-but-handler-shows-null
if(!obj["e"+type]) obj["e"+type] = new Oberserverable();
obj["e"+type].attach("e"+obj+fn, fn);
if(!obj["on"+type]) {
obj["on"+type] = function(e) {
e = e || window.event;
e.cancelBubble = bub;
return obj["e"+type].notify(e) || (type != "contextmenu"); // suppressing context menu in IE8 as default
};
}
}