ã¡ãã»ã¼ã¸ã³ã°ã§ã¾ãã¾ãæããããããªã話
ãã®è¨äºã¯JavaScript Advent Calendar(ãªã¬æ¨æºã³ã¼ã¹)ã®13æ¥ãã®ã¨ã³ããªã¤ã«ãªãã¾ãã
ã¡ãªã¿ã«å®¶ã«å¸°ã£ãç¬éããã·ã³ã®æè¨ãããã¦12/14ã«ãªã£ã¦ã¦ã大åä¸äººã§ç¦ãã¾ãããã¦ã¸ãºãããºããºãã
ãã®è¨äºã®é¡æã¯JavaScriptã«ãããã¡ãã»ã¼ã¸ã³ã°ï¼ãã©ãï¼ã§ãã
ã§ãã¡ãã»ã¼ã¸ã³ã°ã£ã¦ä½ãããã¨
JavaScriptã§ï¼ã¡ãã»ã¼ã¸ã³ã°ï¼ã¨ããã¨ãã®çã®äººã¯window.postMessageãæãåºãã®ããç¥ãã¾ãããã
ãã®è¨äºã§ã¯ãã¡ãã»ã¼ã¸ã³ã°ãã¨ããè¨èããã£ã¨åºãæå³ã«æãã¦ä½¿ã£ã¦ãã¾ãã
ã ããããããããªãã¸ã§ã¯ããã¡ãã»ã¼ã¸ãåãåããªãã¸ã§ã¯ããç´æ¥ã«ã¯ç¥ããªãã¦ããç¹å®ã®ç®çãæã£ãã¡ãã»ã¼ã¸ãæãã¦å¦çãããããã¨ãã§ãããããªä»çµã¿ãã®ãã¨ããã¡ãã»ã¼ã¸ã³ã°ãã¨å¼ãã§ãã¾ãã
ãããï¼ãããåããã«ããï¼
(ã¡ãªã¿ã«ããããããã°ã©ãã³ã°ç¨èªã¨ãã¦ã®ãã¡ãã»ã¼ã¸ããã·ã³ã°ãã¨ã¯é¢ä¿ãªããã®ã¨ãã¦èãã¦ãã ããï¼
åããã«ããã®ã§ã³ã¼ãæ¸ãã¨ããããªãã¨ãåºæ¥ããã¤ã®ãã¨ã§ã
// 1.jsã«ã¦ component1.pub("init", config); // 2.jsã«ã¦ component2.sub("init", function(conf) { // éåæã«confãåãåã£ã¦ä½ããã }); // 3.jsã«ã¦ component3.sub("init", function(conf) { // éåæã«confãåãåã£ã¦ä½ããã });
component1ã¯component2ãcomponent3 ã«ã¤ãã¦ã¯ä½ãç¥ããªã(component2ãcomponent3 ã®åç
§ããã£ã¦ãªã) ããã§ããã"init"ã¨ããã¡ãã»ã¼ã¸ãsubscribeãã¦ã奴ãã«éåæã«ã¡ãã»ã¼ã¸ãå±ãã¦ç¹å®ã®å¦çãèµ°ããããã¨ãã§ãã¾ãã
ãç¯åãããObserverãã¿ã¼ã³ããªããï¼ãã¨æã£ãäººã¯æ£è§£ã§ããObserverãã¿ã¼ã³ãã©ãã®ãã¨ãã¡ãã»ã¼ã¸ã³ã°ã¨å¼ãã§ããã ãã§ãã
ã©ãããæã«ããããã®ã
ããã¾ã§ã ã¨ãã¡ãã»ã¼ã¸ã³ã°ãã©ããåºæ¥ã¦ä½ãããããã®ããã¨ããã®ãããããããªãã¨æãã¾ãããã¡ãã»ã¼ã¸ã³ã°ã便å©ãªã®ã¯ãã¾ããã¼ã¸é·ç§»ãããªãã¢ããª(Ajaxã§ã¢ãªã¢ãªãã¼ã¸å å®¹ãæ¸ãæããã¢ããªé¢¨å³ã®ãã¤ã¨ããããããOne Page Appçãªãã¤ã¨ãï¼ãä½ãã¨ãã§ãã
ä¾ãã°ãè¤æ°ã®ç¨®é¡ã®ã¢ã¼ãã«ã¦ã£ã³ãã¦ã使ãã¢ããªããã£ãã¨ãã¦ãç¾å¨ã®ç»é¢ã«ã¯ã¦ã¼ã¶ã¢ã¯ã·ã§ã³ã«ãã£ã¦ã©ã®ã¢ã¼ãã«ã¦ã£ã³ãã¦ãåºã¦ãããåãããªãã¨ãã¾ããããã«ä½ããã®ããªã¬ã¼ã§ï¼ä¾ãã°Ajaxã«ããç»é¢é·ç§»ã¨ãï¼ç»é¢ä¸ã®ã¢ã¼ãã«ã¦ã£ã³ãã¦ã«å ¨é¨æ¶ãã¦ã»ããï¼ã¨ããªã£ãå ´åãã¡ãã»ã¼ã¸ã³ã°ããªãå ´åã¯ãã®ããªã¬ã¼ã¨åæã«
// in ajax.js
modal1.close();
modal2.close();
modal3.close();
modal4.close();
ã¨ãããããªå¦çããforæã¨ã使ã£ã¦ãåããã¨ã§ãããããããããã£ã¨æ¸ããªãã¨ãããªãããã§ãã
ããã«ãã£ãã®ä»çµã¿ãããå ´åãmodalã®åæåæã«
// modal.js this.sub("modalClose", function() { this.close(); });
ã¨ããã®ãæ¸ãã¦ããã¨ãããªã¬ã¼ãå¼ãå´ã§ã¯
// ajax.js this.pub("modalClose");
ã¨ãã風ã«ã¡ãã»ã¼ã¸ãæããã ãã§ã誰ãã©ãããã¢ã¼ãã«ã¦ã£ã³ãã¦ãä½ã£ã¦åºãã¦ãããæ°ã«ããããã¤ajax.jsãmodal.jsããã³ãã®ã¯ã©ã¤ã¢ã³ãã³ã¼ãã®ä¸èº«ã«ä¾åãããã¨ãªããã¹ã¦ã®ã¢ã¼ãã«ã¦ã£ã³ãã¦ãéããå¦çãæ¸ããã¨ãã§ãã¾ãã(prototypeã使ããã¨ããæ¹æ³ãããã¾ãããã£ã¡ã ã¨ajax.jsã®ä¸ã«Modal.prototype.close(); ã¨ãæ¸ããã¡ã«ãªãçµå±ajax.jsãmodal.jsã«ä¾åãã¦ãã¾ãã¾ã)
ãã®ä»ã«ã¯ãorientationchangeã®ãããªå¤ãã®ã³ã¼ãã®åä½ã«å½±é¿ãä¸ããã¤ãã³ãã«ã¤ãã¦ã
ãããããªæã§åãeventãlistenãã¦ãã¡ãã¡å¦çããã®ããã»ãããã®ã§ãä¸ã¤ã®ã¢ã¸ã¥ã¼ã«ã®ä¸ã§
window.addEventListener("orientationchange", function(evt) { // ããã«å¿ è¦ãªåè¨ç®ãã¾ã¨ãã¦ãã¾ã this.pub("orientationChange", data); });
ã¨ãã風ã«åå¦çããã³Event -> Messageã®å¤æãè¡ã£ã¦ãã¾ããåã³ã³ãã¼ãã³ãã®ä¸ã§ã¯
this.sub("orientationChange", function(data) { // dataã使ã£ã¦å¿ è¦ãªå¦çããã });
ã¨ãã風ã«ãã¤ãã³ãã®åãå£ãã¾ã¨ãã¦ãããããmessageã§åãã£ã¹ãããããã¨ãããããªä½¿ãæ¹ãã§ãã¾ããDOM Mutation Eventãéå¼ãã¦éåæåãã¦åãã£ã¹ããããã¨ããã¢ãªã§ããã
ã¡ãã»ã¼ã¸ã³ã°ã¯Eventã¨ç°ãªããDOMã®ä¸çã«ç¸ããã¦ããªãã®ã§ãã°ãã¼ãã«ãªéç¥ãã¨ãã¦æè»ã«ä½ã«ã§ã使ãã¾ããã¡ãªã¿ã«ããã®ãããªã¡ãã»ã¼ã¸ã³ã°ãã¢ããªã«å°å ¥ããã¨DOM Eventã¨åããã¦ããªããä¼¼ããããªä»çµã¿ããã¤ãã®ããï¼ã¤åå¨ãããã¨ã«ãªã£ã¦ãã¾ãã¾ãããçµé¨ä¸ä¼¼ããããªãã¨ãããã®ã«2éãã®æ¹æ³ããã£ã¦ãããã°ã©ãã¼ã®è³ã¯å¤§ä¸å¤«ã§ãããã¶ãããããã®ã3ã¤ããã¨æ»ãã¾ãã
ç°¡åãªå®è£
ç°¡åãªã¡ãã»ã¼ã¸ã³ã°ã¯ãã ããã以ä¸ã®ãããªã³ã¼ãã§å®ç¾ã§ãã¾ããã¡ãªã¿ã«æéã«è¿½ããã¦ããã®ã§ã°ãã£ã¦ããããããã¾ãããã¡ãã»ã¼ã¸ã³ã°ã¨ãè¨ã£ã¦ãã¾ããä¸èº«ã¯åãªã颿°ã³ã¼ã«ã§ãã
var listeners = {}; function Emitter() {} (function(ep) { ep.sub = function(type, callback) { if ( listeners[type] === void 0 ) { listeners[type] = []; } listeners[type].push({ actor: this, callback: callback }); }; ep.pub = function { var args = Array.prototype.slice.call(arguments), type = args.shift(); (listeners[type] || []).forEach(function(listener) { setTimeout(function() { listener.callback.apply(listener.actor, args); }, 0); }); }; })(Emitter.prototype); var component1 = new Emitter(); // bra bra...
ã¾ãè¦ã¯ã誰ã«ã§ãæ¸ãããããªå¦çã§ããããã«subscribeå´ã®priorityãã¤ããããjQueryã®ããã«message typeã«é¢ãã¦namespaceã使ããããã«ããã®ãã«ã³ã¿ã³ã§ãããåããããªãã¨ãããååã©ã¤ãã©ãªã¯ãããã§ãããã¨æãã®ã§æ¢ãã¦åæã¯ãã¾ããããèªåã§ãããã ãªãã®ãæ¸ãã¦ãã¾ã£ã¦ãååç¨ã«è¶³ãã¨æãã¾ãã(mofmof.jsã«ãmsgboxã¨ãããã¾ããï¼ï¼
ã¾ã¨ã
ææ¥ã«ãªãï¼ææ¥ã«ãªã£ã¡ããï¼ã¨æããªããæ¥ãã§æ¸ããã®ã§ããããä¼ããã¥ããé¢ããã£ããã¨æãã¾ãã
ãã¨å®éã«ä½¿ã£ã¦ã¿ã¦ãããã便å©ã ãªã¼ãã¨ããå ´é¢ã«ééããªãã¨ããªããªã便å©ããåããã¥ããããããã¾ããã
ãã¹ã¦ã®Webãµã¤ãã§ãã¾ãã使ãããã¯ããã¯ã§ã¯ãªãã§ãããä»å¾ããããOne Page Appã¨ããã¾ããã¼ã¸é·ç§»ããªãWebã¢ããªã±ã¼ã·ã§ã³ã¨ããä½ããã¨ãã人ã¯ãã¡ãã»ã¼ã¸ã³ã°ãå°å
¥ãã¦åã¢ã¸ã¥ã¼ã«ãççµåã«ãã¦è¨è¨ãã¦ã¿ãã®ãããããããã¾ããã便å©ã§ãããã¶ãã
次åã¯egtra-gããã§ãããæ¥½ãã¿ã«ï¼