$.ready()
ã
$.ajax()
ãããã³
$.proxy()
ã®ã¿ã䜿çšãããŸãã éèŠãªã®ã¯ã©ã€ãã©ãªãŒã§ã¯ãªãïŒã奜ã¿ã®ã©ã€ãã©ãªãŒã«çœ®ãæããã®ã¯ç°¡åã§ãïŒãã¢ãããŒãèªäœã§ãã
ãã®ã¢ãããŒãã¯ã2ã€ã®ã¢ã€ãã¢ã«åºã¥ããŠããŸãã
- JavaScriptãŠã£ãžã§ããã¯å°ããªã¢ãžã¥ãŒã«ã§ããããããããWebããŒãžã®ç¹å®ã®éšåããææãããŸãïŒã€ãŸããããŒãžã®ãã®éšåã®ãã¹ãŠã®å¶åŸ¡ã¯ãDOMã®çŽæ¥å€æŽã§ã¯ãªãããã®ã¢ãžã¥ãŒã«ã®ã¡ãœããã®ã¿ã«ãã£ãŠè¡ãããŸã- ã«ãã»ã«å ïŒã ãŠã£ãžã§ããã¯æ©èœã®ã¿ã«è²¬ä»»ããããŸãããå€èŠ³ã«ã¯è²¬ä»»ããããŸããã ãããã£ãŠããŠã£ãžã§ããã®ãææãããDOMã®äžéšããŠã£ãžã§ããã®å€éšã§çŽæ¥å€æŽããããšã¯ã§ããŸãããçŽç²ã«èšèšã¿ã¹ã¯ã®å Žåã®ã¿ã§ãïŒã¢ãŒããã¯ãã£ããã³ã¢ããªã±ãŒã·ã§ã³ã®å šäœçãªè€éãã®å ŽåãCSSãŸãã¯jQueryãä»ããŠå€èŠ³ãä¿®æ£ããããšã«ã¯åºæ¬çãªéãã¯ãããŸããïŒ
- ã°ããŒãã«ã€ãã³ããã£ã¹ãããã£ãŒã ãŠã£ãžã§ããéã®çžäºäœçšã¯ãã°ããŒãã«ãã£ã¹ãããã£ãŒïŒ 匱ãæ¥ç¶ ã Mediator / Mediatorãã¿ãŒã³ïŒã«ã¡ãã»ãŒãžãéä¿¡ããããšã«ãã£ãŠå®è¡ããã圌ã¯ãã®ã¡ãã»ãŒãžã®åŠçæ¹æ³ãæ¢ã«æ±ºå®ããŠããŸã-ãŠã£ãžã§ããã®äœæ/åé€ãä»ã®ãŠã£ãžã§ããã¡ãœããã®ãã«ããã¶ã€ããŒã³ãŒãã®å®è¡ãªã© ã€ãã³ãåŠçã«å¯Ÿããåçãªã¢ãããŒãïŒç¹å®ã®ã€ãã³ãã®ã€ãã³ããã³ãã©ãŒãæäœäžã«è¿œå /åé€ãããå ŽåïŒãšã¯å¯Ÿç §çã«ãéçãã£ã¹ãããã£ã¯ã³ãŒãã®ç解ãšãããã°ãå€§å¹ ã«ç°¡çŽ åããŸãã ãã¡ãããåçã€ãã³ããã³ãã©ãŒãå¿ èŠãªã¿ã¹ã¯ããããŸãããã»ãšãã©ã®å Žåãããã¯é床ã®è€éãã§ãããããå¯èœãªããšã¯ãã¹ãŠéçãã³ãã©ãŒã«ãã£ãŠè¡ãããŸãã
èªè»¢è»ã«ã€ããŠ
ç§ã¯éåžžãã¢ããªã±ãŒã·ã§ã³ã®ãµãŒããŒåŽãéçºããŸãïŒããã«ããããã¯ãŒã¯ãµãŒãã¹ã»ã©Webãµã€ãèªäœã§ã¯ãããŸããïŒãã¯ã©ã€ã¢ã³ãåŽã¯ç§ã®ã¡ã€ã³ãããã¡ã€ã«ã§ã¯ãããŸããã ãã®ãããããªãæŽç·Žããã1ããŒãžã®Webã¢ããªã±ãŒã·ã§ã³ãéçºããã¿ã¹ã¯ãæåã«è¡ã£ããšãïŒçŽ2幎åïŒããã®ãããªã¢ããªã±ãŒã·ã§ã³ã®æ¢è£œã®ã¢ãŒããã¯ãã£ã¢ãããŒããæ¢ããŸããããæ®å¿µãªãããç§ã¯èŠã€ããŸããã§ããïŒã¬ããŒãããå幎ãéããŸãããïŒ Nicholas Zakasãã¹ã±ãŒã©ãã«ãªJavaScriptã¢ããªã±ãŒã·ã§ã³ã¢ãŒããã¯ãã£ãïŒ ãã㪠ã ã¹ã©ã€ã ïŒã
ç§ã¯ãã®2幎éã«ããŸããŸãªãããžã§ã¯ãã§ãã®ã¢ãŒããã¯ãã£ãéçºããå®éã®ã¿ã¹ã¯ã§ã©ã®ããã«æ©èœãããã確èªããŸããã ããŸããããŸãã :)ã ããããã®èšäºãæžãããšã«ããŸããã å·çã®éçšã§ãç§ã¯åã³ä»ã®ãœãªã¥ãŒã·ã§ã³ãæ¢ããNicholas Zakasã®ã¬ããŒããèŠã€ããŸãããããã«ããã®ãããã¯ã®èªã¿ç©ãããèšäºAddy Osmani Patterns For Large-Scale JavaScript Application Architectureãæ¬åœã«æ°ã«å ¥ããŸããã
ããã§èª¬æãããŠããã¢ãŒããã¯ãã£ã«ãã§ã«ç²ŸéããŠãã人ã®ããã«ãç§ã®ã¢ãããŒãã®éããç°¡åã«èª¬æããŸãã
- ç§ã®æèŠã§ã¯ããã®ã¢ãŒããã¯ãã£ã¯ãYahooïŒãGMailãªã©ã®èŠæš¡ã®ã¢ããªã±ãŒã·ã§ã³ã«å¿
èŠã§ãã ããããçŸä»£ã®ããªãè€éãªWebã¢ããªã±ãŒã·ã§ã³ã®å€§å€æ°ã«ãšã£ãŠãããã¯ãŸã å€ãããŸãã ãã®ã¢ãŒããã¯ãã£ã®é床ã®æè»æ§ã«ã¯ä»£åã䌎ããŸã-ã¢ããªã±ãŒã·ã§ã³ã®è€éããå¢ããŸãã 以äžã¯ãç§ãå®éã«å¿
èŠãšããªãã£ãæ©èœã®äŸã§ãã
- ããŒã¹ã©ã€ãã©ãªãåçŽã«çœ®ãæããæ©èœïŒäŸïŒjQueryãšDojoïŒ
- ã·ã¹ãã æ©èœã«å¯Ÿããã¢ãžã¥ãŒã«ã®ãã¢ã¯ã»ã¹æš©ãã®ç¢ºèªãšå¶åŸ¡
- ããŒãžäžã®ã¢ãžã¥ãŒã«ãåçã«è¿œå /åé€
- äžã§æžããåçã€ãã³ããã³ãã©ãŒã«ã€ããŠ
- ããã¯ã©ãã«ãæ瀺çã«èšåãããŠããŸããããç§ãç解ããéãããã®ã¢ãŒããã¯ãã£ã§ã¯ãã¢ãžã¥ãŒã«ãã¯ã»ãŒå
šäœã倧ããè€éãªã¢ããªã±ãŒã·ã§ã³ã§ãïŒGMailããŒãžã®ãã£ãããYahooã®å€©æ°ãŠã£ãžã§ãããªã©ïŒã ç§ã®ãã¢ãžã¥ãŒã«ãã¯ãç¬ç«ããç¬ç«ãããšã³ãã£ãã£ãšããŠåºå¥ã§ããæå°éã®æ©èœãå®è£
ããŠããŸãã ïŒãã ããAndrew Burgessã®ã¹ã¯ãªãŒã³ãã£ã¹ããWriting Modular JavaScriptãã¯ãç§ã®ãã®ãšåãå°ããªã¢ãžã¥ãŒã«ã瀺ããŠããŸããïŒäŸãšããŠã1ã€ã®å
¥åãæã€ãã©ãŒã ãæ
åœããã¢ãžã¥ãŒã«ããŸãã¯åãã¿ã°å
ã§åãå€ãåºåããæ
åœã¢ãžã¥ãŒã«ãåŒçšã§ããŸãã åæã«ããããã®ã¢ãžã¥ãŒã«ã¯ã¢ããªã±ãŒã·ã§ã³ã®ããžãã¹ããžãã¯ãå®è£
ãããã®ã§ãããéåžžã®<select>ããéåžžã«ã¯ãŒã«ã§çŸããã掟æãª<select>ãäœæããjQueryãã©ã°ã€ã³ã®é¡äŒŒç©ã§ã¯ãããŸããã
- ã¢ãžã¥ãŒã«ã®æ©èœã®èŠæš¡ã®éãã®çµæããããã®ã¢ãžã¥ãŒã«ã¯HTML + CSS + JavaScriptã§æ§æãããŠãããç§ã«ãšã£ãŠã¢ãžã¥ãŒã«ã®å€§éšåã¯JavaScriptãšãã®ã¢ãžã¥ãŒã«ã«å¿ èŠãªæå°éã®HTMLæ§é ã®ããã¥ã¡ã³ãã§ãã
- ã¢ãžã¥ãŒã«ãã¢ã¯ã»ã¹ã§ããå€éšæ©èœãæ確ã«å¶éããå¿ èŠãããããšã¯å®å šã«åæããŸããïŒå®éãããã«ã€ããŠã¯èšäºã®æåã®æ®µèœã§æžããã®ã§ããã®ãªã¹ãã«ãã£ã¹ãããã£ãŒãè¿œå ããã ãã§ãïŒãæãä¿¡é Œæ§ãé«ããå¹æçã ãšæããŸãå®å šãªã³ãŒãã¯ããã§ã¯ãããŸããã ãããã£ãŠãã³ãŒããèŠåãªã©ã«çœ®ãæããããšãã§ããå Žåãéåžžã¯èŠåã奜ã¿ãŸãïŒãã¡ããã枬å®å€ãç¥ã£ãŠããå¿ èŠããããŸãïŒã ç§ã®ã¢ãããŒãã§ã¯ãã¢ãžã¥ãŒã«ã®ã¢ã¯ã»ã¹ãå¶éããã³ãŒãã¯ãããŸããããã¢ãžã¥ãŒã«ãç»ããå Žæãšç»ããªãå ŽæããããŸãã
ããããæŠããŠãç§ã¯åãã¢ãŒããã¯ãã£ã®ããããªã¹ãããŒãžã§ã³ãéçºããŸããã
éå§ãã
ã¢ããªã±ãŒã·ã§ã³ã®ããŒãžã®ã¹ã±ã«ãã³ãäœæããŸãã
index.html
<!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <title> JavaScript </title> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> <script type="text/javascript" src="http://powerman.name/download/js/POWER.js"></script> <!-- --> </head> <body> <script type="text/javascript"> /* */ </script> <!-- html- js- --> </body> </html>
ã°ããŒãã«ã€ãã³ããã£ã¹ãããã£ãŒãè¿œå ããŸãã ã€ãã³ãã¯ãã€ãã³ãã®ããã¹ãåãšãªãã·ã§ã³ã®ãã©ã¡ãŒã¿ãŒä»ãããã·ã¥ã§ãã
éåžžãããŒãžãããŒãããåŸãäœããã®ã¢ã¯ã·ã§ã³ãå®è¡ããå¿ èŠãããïŒå°ãªããšããŠã£ãžã§ãããäœæããŠããŒãžã«è¿œå ããïŒãäžè²«æ§ãä¿ã€ããã«ãã¡ã€ã³ãã£ã¹ãããã£ã§ãã®ã€ãã³ããåŠçããŸãã
index.html
/* */ notice = (function(){ var w = { }; return function(e,data){ switch (e) { case 'document ready': break; default: alert('notice: unknown event "'+e+'"'); } }; })(); $(document).ready(function(){ notice('document ready') });
ããã·ã¥
w
ã¯ãäœæããããŠã£ãžã§ãããªããžã§ã¯ããä¿åããããã«äœ¿çšãããŸã-äœæåŸã®ã©ããã«ä¿åããå¿ èŠããããŸã-ããã«ããã£ã¹ãããã£ïŒãããã®ãªããžã§ã¯ããäœæããïŒãåžžã«ãããã«ã¢ã¯ã»ã¹ã§ããããã«ããŸãã
äœããŠãã®ïŒ
ãŠãããŒãµã«éšåã®æºåãã§ããŸãããä»åºŠã¯ãã¢ããªã±ãŒã·ã§ã³ãäœããããã決å®ããŸãã ããŒãžã®ããŸããŸãªéšåéã®è€éãªåççžäºäœçšãå®èšŒããã«ã¯ãããŒãžã®ããŸããŸãªéšåã«ã¢ã¯ã·ã§ã³ãåæ ãããããã€ãã®ã¢ã¯ãã£ããªèŠçŽ ãå¿ èŠã§ãã
ãã¬ãŒãºãè¿œå /åé€ã§ããã¢ããªã±ãŒã·ã§ã³ãäœæããŠã¿ãŸãããããããã®ãã¬ãŒãºã®çµæã®æ°ïŒããšãã°ãã¹ãã«ãã§ãã«ãŒã§èŠã€ãã£ããšã©ãŒã®æ°ïŒã衚瀺ãããŸãã ããã«ããã¹ãŠã®ãã¬ãŒãºã®çµæã®ç·æ°ã
建ç¯
å¿ èŠãªæ©èœããŠã£ãžã§ããéã§åå²ããŸãã ãŠã£ãžã§ãããå°ããã·ã³ãã«ã§ããã°ããã»ã©ãã¢ããªã±ãŒã·ã§ã³å šäœãã·ã³ãã«ã«ãªãã®ã§ããµã€ãºãå°ããããšã«é©ããªãã§ãã ãããããã¯ãã®ã¢ããªã±ãŒã·ã§ã³ã®æ©èœã§ã¯ãªããè€éãªã¢ããªã±ãŒã·ã§ã³ã®ã¢ãŒããã¯ãã£ã«å¯Ÿããæšå¥šã¢ãããŒãã§ãã
- AddPhrase-ãã¬ãŒãºãè¿œå ããããã®ãŠã£ãžã§ããã
- ã¡ãœããïŒãªãã
- ã€ãã³ããçæããŸãïŒ
'add phrase'
ã
- ãã¬ãŒãº-è¿œå ããããã¬ãŒãºã衚瀺ãããŠã£ãžã§ããããããéžæïŒåé€ïŒãããã®ãã¬ãŒãºã«å¥ã®ãã³ãã©ãŒïŒã¹ãã«ãã§ãã¯ãªã©ïŒãè¿œå ã§ããŸãã
- ã¡ãœããïŒ
add_handler
- ã€ãã³ããçæããŸãïŒ
'select phrase'
ã
- ã¡ãœããïŒ
- SpellCheck-ãã®ãã¬ãŒãºã®ãšã©ãŒæ°ã衚瀺ãããŠã£ãžã§ããã 圌ã¯ãŸãããµãŒãã¹ã®ajaxãªã¯ãšã¹ããæ
åœããŠããŸãã
- ã¡ãœããïŒãªãã
- ã€ãã³ã
'spellcheck: started'
ããã³'spellcheck: success'
ãŸãã
- Sum-ãã¹ãŠã®ãã¬ãŒãºã®çµæã®ç·æ°ã衚瀺ãããŠã£ãžã§ããã
- ã¡ãœããïŒ
add
ããã³sub
- ã€ãã³ããçæããŸãïŒãããã
- ã¡ãœããïŒ
ãŠã£ãžã§ãã
ãŠã£ãžã§ããã¯ç¬èªã®é åãææããŸããããã®é åãããŒãžäžã®ã©ãã«ããããæ£ç¢ºã«å¶åŸ¡ããŸãã-ã€ãŸã ç»é¢ã«è¡šç€ºããããã©ããããããŠå®éã«DOMã«è¿œå ããããã©ããã¯ããããŸããã å€éšã³ãŒãã¯ãããŒãžã«ãŠã£ãžã§ããå¶åŸ¡ãšãªã¢ãè¿œå /åé€ãã圹å²ãæãããŸãïŒã€ãŸããäžéšã®ãŠã£ãžã§ãããä»ã®ãŠã£ãžã§ããã«åã蟌ãŸããŠããå Žåãã°ããŒãã«ã€ãã³ããã£ã¹ãããã£ãŒããŸãã¯å€éšãŠã£ãžã§ããïŒã
ãŠã£ãžã§ããã¯ã©ã¹ã®å éšã§ã¯ãæäœéã®å€éšé¢æ°ã䜿çšã§ããŸãã
- ã€ãã³ããçæããããã®ã°ããŒãã«é¢æ°
notice()
ã - jQuery
$
ãªããžã§ã¯ã; - ãã³ãã¬ãŒãã©ã€ãã©ãªé¢æ°ã
ãŸããªäŸå€ãé€ãããŠã£ãžã§ããã¯äœããã®åœ¢ã§ç»é¢ã«è¡šç€ºããå¿ èŠããããŸãã 圌ããææãããããŒãžã®é åã¯éåžžããã§ã«ååšããïŒãããŠãã®
#id
ãŠã£ãžã§ããã®ã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ãããïŒãããŠã£ãžã§ããã«ãã£ãŠjs-templateãããã®å Žã§çæãããŸãïŒãããŠãã¿ãŒã³ã®
#id
ã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ãããŸãïŒã
ä»ã®ãã¹ãŠã¯åºæ¬çã§ã¯ãããŸããã ç§ã®ã¹ã¿ã€ã«ïŒ
- ãŠã£ãžã§ããã¯åå¥ã®w.widget_name.jsãã¡ã€ã«ã«ãããŸãã
- ãŠã£ãžã§ããã¯ãã°ããŒãã«åå空é
W
ã¯ã©ã¹ãšããŠå®è£ ãããŸããéåžžã1ã€ã®ãŠã£ãžã§ããã¯1ã€ã®ã¯ã©ã¹W.WidgetName
ã§ãã - ã¯ã©ã¹ã¯ãJavaScriptã®æãåçŽã§èªç¶ãªæ¹æ³ã§å®è£ ãããŸã-éåžžã®ã³ã³ã¹ãã©ã¯ã¿ãŒé¢æ°ãšãããã¿ã€ãç¶æ¿ã
- ãã©ã€ããŒãããããã£ãšã¡ãœããã«äžç·ãä»ãå§ããŸãã
- ãŠã£ãžã§ããã®æåã«ãjsãã³ãã¬ãŒãïŒãŸãã¯HTMLãããã¯ïŒã«å¿ èŠãªãã©ãŒããããææžåããŸãã ã³ã³ã¹ãã©ã¯ã¿ãŒããããªãã¯ã¡ãœãã/ããããã£ãçæãããã€ãã³ãã
- æ
£äŸã«ããããŠã£ãžã§ãããå¶åŸ¡ããé åã¯ããŠã£ãžã§ããã®
.$
ããããã£ããã¢ã¯ã»ã¹ã§ããŸãïŒããŒãžã«ãŠã£ãžã§ããã衚瀺ããããã«DOMã«æ¿å ¥ãããã®ã¯å€éšã³ãŒãã§ãïŒã
å°ãçšèªã®èª¬æã å€ãã®å ŽåãJavaScriptãŠã£ãžã§ããã¯HTML + CSS + JavaScriptã®ã»ããã§ãã ç§ã®ãŠã£ãžã§ããã¯ãããã©ã«ãã§ä»ã®ã¢ããªã±ãŒã·ã§ã³ãšã®æ¥ç¶ã容æã«ããããã«ãHTMLããã³CSSãšå ±ã«é åžããããšãã§ããŸããã絶察ã«æå°éã®èšèšæ å ±ãæã€ããã«ãŠã£ãžã§ãããäœæããããšã奜ã¿ãŸã-ããã«ãããã³ãŒããšèšèšã®å€æŽã®äž¡æ¹ãç°¡çŽ åãããŸãã ãã®ããã以äžã§èª¬æãããŠã£ãžã§ããã«ã¯ãã¶ã€ã³ã«é¢ããèšèã¯ãããŸããã
ãã¬ãŒãº
ãã®ãŠã£ãžã§ããã®HTMLãŠã£ãžã§ããèŠä»¶-1ã€ã®å ¥åã¿ã€ã=ããã¹ãã®ãã©ãŒã ãå¿ èŠã§ãã ãã¶ã€ããŒã¯ãå¿ èŠã«å¿ããŠä»ã®ãã¹ãŠãèšèšã§ããŸãã
w.addphrase.js
/* * <form id="addphrase"><input type=text></form> * * w = new W.AddPhrase('addphrase'); * * -> 'add phrase', phrase * */ var W; W = W || {}; W.AddPhrase = function(id){ this.$ = $( '#'+id ); this._input = this.$.find('input'); // cache this.$.submit( $.proxy(this,'_onsubmit') ); }; W.AddPhrase.prototype._onsubmit = function(){ notice('add phrase', { phrase: this._input.val() }); this._input.val(''); return false; };
ããŒãžã®èªã¿èŸŒã¿æã«ãŠã£ãžã§ããã®äœæãè¿œå ããŸãã ãããŠã䜿ããããã®ããã®å°ããªã³ãŒã-ãã®ãããªã³ãŒãã¯ããŠã£ãžã§ããå ã§ã¯ãªããããã«ããã¹ãã§ãã ãŠã£ãžã§ããã¯ããã®ã¢ããªã±ãŒã·ã§ã³ã§ã€ã³ã¿ãŒãã§ãŒã¹ã®äž»èŠãªèŠçŽ ãäœæ¥è ã§ãããäœæ¥ãããã§å§ãŸãããšãç¥ããŸããã
index.html
<!-- --> <script type="text/javascript" src="w.addphrase.js"></script> ... <!-- html- js- --> <form id="addphrase"> : <input type=text> </form>
index.html
/* */ notice = (function(){ var w = { addphrase: null }; return function(e,data){ switch (e) { case 'document ready': w.addphrase = new W.AddPhrase('addphrase'); $('#addphrase input').focus(); break; case 'add phrase': break;
å®éãããã ãã§ãã :)ãããããã©ãŒã ã«ãåãããããšãã§ãããŠãŒã¶ãŒããã¬ãŒãºãå ¥åãããšå®æçã«ã€ãã³ããçæãããŠãããŒãµã«ãŠã£ãžã§ããããããŸãïŒããããåŠçãããŠã£ãžã§ããããŸã ãªãããããã£ã¹ãããã£ã§ã¯ããããç¡èŠããŸãïŒã
åæã«ããŠã£ãžã§ããã«ã¯èèªãäžæ»ŽããããŸãã-ãã®çŽæ¥ã®æ©èœã«é¢é£ããªãè¡ã§ãã ãã®æ©èœãå®è£ ãããã¹ã¿ã€ã«ã«é¢ä¿ãªãããããã®è¡ã¯ãã¹ãŠãšã«ãããªããŸãã ãã¡ããããã£ã¹ãããã£ã«ã¯ããäœåãªãè¡ããããŸããããã¯ããã¹ãŠã®ã³ãŒãã1ã€ã®ããŒã¹ã§èšè¿°ãããN幎åã®ã¹ã¿ã€ã«ã®éã¢ãžã¥ã©ãŒã¢ããªã±ãŒã·ã§ã³ãšæ¯èŒããå Žåã§ãã ãããå®éããããã®ãäœåãªãè¡ã¯ãã¢ããªã±ãŒã·ã§ã³ã§æã䟡å€ããããŸãã ã¢ããªã±ãŒã·ã§ã³ã®é«ã¬ãã«ã®ããžãã¯ãæ確ãã€åçŽã«èšè¿°ããã®ã¯åœŒãã§ãã
ãã¬ãŒãº
ãã®ãŠã£ãžã§ãããäŸãšããŠäœ¿çšããŠãjsãã³ãã¬ãŒããšãã¹ãããããŠã£ãžã§ããã®æäœãèŠãŠãããŸãã
HTMLçšã®ãã®ãŠã£ãžã§ããã®èŠä»¶-
phrase
å€æ°ãæž¡ãããã¯ã©ã¹
handlers
æã€èŠçŽ ãå¿ èŠãªjs-templateãå¿ èŠã§ã-çµæä»ãã®ãŠã£ãžã§ãããè¿œå ãããŸãã
w.phrase.js
/* * <script type="text/x-tmpl" id="tmpl_phrase"> * <div> * <%= phrase %> * <span class="handlers"></span> * </div> * </script> * * w = new W.Phrase('tmpl_phrase', 'some phrase'); * w.add_handler( new W.SomeHandler() ); * * -> 'select phrase', phrase * */ var W; W = W || {}; W.Phrase = function(tmpl, phrase){ this.$ = $( POWER.render(tmpl, { 'phrase': phrase }) ); this._phrase= phrase; this._w = []; this._h = this.$.find('.handlers'); // cache this.$.click( $.proxy(this,'_onclick') ); }; W.Phrase.prototype.add_handler = function(w_handler){ this._w.push( w_handler ); this._h.append( w_handler.$ ); }; W.Phrase.prototype._onclick = function(){ notice('select phrase', { phrase: this._phrase }); };
ãã³ãã¬ãŒãã䜿çšãããšããã¹ãŠãæ確ã«ãªããšæããŸãã ãã ããçµã¿èŸŒã¿ãŠã£ãžã§ããã䜿çšããæ¹ã説æãé©åã§ãã
ã¹ãã«ãã§ãã¯ãŠã£ãžã§ããã¯ãã¬ãŒãºãŠã£ãžã§ããã«ãèŠèŠçã«ãåã蟌ãŸãããã¬ãŒãºãŠã£ãžã§ããã¯ã¹ãã«ãã§ãã¯ãŠã£ãžã§ããããææãããŸãïŒã¹ãã«ãã§ãã¯ãŠã£ãžã§ãããžã®å¯äžã®ãªã³ã¯ã¯
this._w
ã«ãããŸããããã¹ãŠã®ã°ããŒãã«ãŠã£ãžã§ããã¯
w
ããã·ã¥å ã®ãªã³ã¯ã«ãã£ãŠä¿æãããŸãïŒã芧ã®ãšãããPhraseã¯ã¹ãã«ãã§ãã¯ãŠã£ãžã§ãããªããžã§ã¯ããäœæããŸãããããã©ã¡ãŒã¿ãŒãšå ±ã«åãåããŸãã æè»æ§ãé«ããããã®äŸåæ§æ³šå ¥ã®ãã®å®è£ -ç¹å®ã®ãŠã£ãžã§ããéã®äŸåæ§ãåé¿ãããŠã£ãžã§ãããªããžã§ã¯ãã®äœæãç°¡çŽ åã§ããŸããäºå®ã¯ãéåžžããã£ã¹ãããã£ã®ã¿ãåã蟌ã¿ãŠã£ãžã§ããã®ã³ã³ã¹ãã©ã¯ã¿ãåŒã³åºãããã«å¿ èŠãªãã¹ãŠã®ããŒã¿ãæã¡ããã®ã¢ãããŒãã¯ãããã®ééçãªè»¢éãåé¿ããããšã§ãå€éšãŠã£ãžã§ããã®ãã¶ã€ããŒãä»ããŠããã¹ãããããŠã£ãžã§ããã®ãã¶ã€ããŒçšã®ãã©ã¡ãŒã¿ãŒã
index.html
<!-- --> ... <script type="text/javascript" src="w.phrase.js"></script> ... <!-- html- js- --> ... <div id="phrases"> <p> <script type="text/x-tmpl" id="tmpl_phrase"> <div> <%= phrase %> <span class="handlers"></span> </div> </script> </div>
index.html
/* */ notice = (function(){ var w = { ... phrase: {} }; return function(e,data){ ... case 'add phrase': if(data.phrase in w.phrase) break; w.phrase[data.phrase] = new W.Phrase('tmpl_phrase', data.phrase); $('#phrases').append( w.phrase[data.phrase].$ ); break; case 'select phrase': w.phrase[data.phrase].$.remove(); delete w.phrase[data.phrase]; $('#addphrase input').focus(); break;
ããã€ãã®èª¬æïŒãŸãããŸã W.SpellCheckãŠã£ãžã§ããããªãããã
w.phrase[phrase].add_handler( new W.SpellCheck() )
ã 次ã«ãïŒãã¬ãŒãºãåé€ããããã«ïŒãã¬ãŒãºãŠã£ãžã§ãããã¯ãªãã¯ããåŸããã¬ãŒãºå ¥åè¡ã¯ãã©ãŒã«ã¹ã倱ããè¿ãããå¿ èŠããããŸãã
ã¹ãã«ãã§ãã¯
ãã®ãŠã£ãžã§ãããäŸãšããŠäœ¿çšããŠãajaxã§ã®äœæ¥ãèŠãŠãããŸãã
ããã«ãajaxãªã¯ãšã¹ãã®ç¶æ ã衚瀺ããå¿ èŠããããŸãïŒããã»ã¹ã§ã¯ãå¿çãåä¿¡ãããŸãïŒã 2ã€ã®ç°ãªãã¢ãããŒãããããŸãïŒãã£ã¹ãããã£ã§DOMãå€æŽããïŒã€ãã³ã
'spellcheck: started'
ããã³
'spellcheck: success'
ïŒããjs-templateå ã®ãã¹ãŠã®ç¶æ ããã©ãã·ã¥ãããã³ãã¬ãŒããäœåºŠãå®è¡/眮æããããšãã§ããŸãã 2çªç®ã®æ¹æ³ã¯ããå°ãè€éã§ããã äŸããããŸãããå®è£ ãã䟡å€ããããŸãã
ãããå®è£ ããã«ã¯ã1ã€ã®ããªãã¯ã䜿çšããå¿ èŠããããŸãã å®éã«ã¯ãå®è¡ããããã³ãã¬ãŒãã
.$
ããããã£ïŒPhraseãŠã£ãžã§ããã®ããã«ïŒã«ä¿åãããšãããã眮ãæããããšãã§ããªããªããŸã
.$
å®éã
.$
Valueã¯DOMã®ã©ããã«è¿œå ãããŸãïŒãŠã£ãžã§ããå ã«ãããŸãïŒãããŠãåã«
.$
ã®å€ãæ°ãããã³ãã¬ãŒãã«çœ®ãæãããšãå€ãå€ãžã®ãªã³ã¯ã¯DOMã«æ®ããããŒãžäžã§èŠèŠçã«äœãå€ãããŸããïŒãããŠããã®ãŠã£ãžã§ããã¯æçµçã«ããŒãžã®ããã®ãéšåãžã®ã¢ã¯ã»ã¹ã倱ããŸãïŒã ãããåé¿ããããã«ã空ã®ã¿ã°ã³ã³ãããŒïŒspanãdivãªã©ïŒã¯
.$
ã«ä¿åããããã³ãã¬ãŒãã®å®è¡çµæã¯æ¢ã«ãã®äžã«é 眮ãããŠããŸãã æ®å¿µãªãããåæã«ãã¶ã€ããŒã®ããŒãžã«ãäºæããªããã¿ã°ã衚瀺ãããŸããããã®åé¡ããããšã¬ã¬ã³ãã«è§£æ±ºããæ¹æ³ãæãã€ããŸããã§ããã
HTMLçšã®ãã®ãŠã£ãžã§ããã®èŠä»¶-
status
å€æ°ïŒ
"started"
ããã³
"success"
å¯èœæ§ã®ããå€ïŒããã³
spellerrors
ïŒå€ã
status=="success"
ïŒãæž¡ãããjs-templateãå¿ èŠã§ãã
w.spellcheck.js
/* * <script type="text/x-tmpl" id="tmpl_spellcheck"> * <% if (status == 'started') { %> * ⊠* <% } else { %> * <%= spellerrors %> . * <% } %> * </script> * * w = new W.SpellCheck('tmpl_spellcheck', 'some phrase'); * * -> 'spellcheck: started', phrase * -> 'spellcheck: success', phrase, spellerrors * */ var W; W = W || {}; W.SpellCheck = function(tmpl, phrase){ this.$ = $('<span>'); this._tmpl = tmpl; this._phrase= phrase; this._load(); }; W.SpellCheck.prototype._load = function(){ $.ajax({ url: 'http://speller.yandex.net/services/spellservice.json/checkText', data: { text: this._phrase }, dataType: 'jsonp', success: $.proxy(this,'_load_success') }); this.$.html( POWER.render(this._tmpl, { status: 'started' }) ); notice('spellcheck: started', { phrase: this._phrase }); } W.SpellCheck.prototype._load_success = function(data){ this.$.html( POWER.render(this._tmpl, { status: 'success', spellerrors: data.length }) ); notice('spellcheck: success', { phrase: this._phrase, spellerrors: data.length }); };
index.html
<!-- --> ... <script type="text/javascript" src="w.spellcheck.js"></script> ... <!-- html- js- --> ... <div id="phrases"> ... <script type="text/x-tmpl" id="tmpl_spellcheck"> <% if (status == 'started') { %> (âŠ) <% } else { %> ( <%= spellerrors %> ) <% } %> </script> </div>
index.html
case 'add phrase': ... w.phrase[data.phrase].add_handler(new W.SpellCheck('tmpl_spellcheck', data.phrase)); ... break; case 'spellcheck: started': break; case 'spellcheck: success': break;
åèš
w.sum.js
/* * <span id="sum"></span> * * w = new W.Sum('sum'); * w.add(5); * w.sub(3); * */ var W; W = W || {}; W.Sum = function(id){ this.$ = $( '#'+id ); this.$.html(0); }; W.Sum.prototype.add = function(n){ this.$.html( parseInt(this.$.html()) + n ); }; W.Sum.prototype.sub = function(n){ this.$.html( parseInt(this.$.html()) - n ); };
index.html
<!-- --> ... <script type="text/javascript" src="w.sum.js"></script> ... <!-- html- js- --> ... <p><b>: <span id="sum"></span> .</b></p>
index.html
/* */ notice = (function(){ var w = { ... sum: null }; var spellerrors = {}; return function(e,data){ ... case 'document ready': ... w.sum = new W.Sum('sum'); break; case 'select phrase': ... if(data.phrase in spellerrors){ w.sum.sub(spellerrors[data.phrase]); delete spellerrors[data.phrase]; } break; case 'spellcheck: success': w.sum.add(data.spellerrors); spellerrors[data.phrase] = data.spellerrors; break;
åèš
ãã¹ãŠã®ãã¡ã€ã«ã®åèšïŒ200è¡HTML + JavaScriptã5.5 KBã ãããã®ãã¡ãã»ãŒ50è¡ãããã¥ã¡ã³ã/ã³ã¡ã³ãã§ãã
èåŸã«ã¯ããšã©ãŒåŠçããã¹ãããã®ã³ã°ãããã³ãããã°ã®åé¡ããããŸããã ããã§ã¯æ°ãããã®ã¯è¿œå ã§ããŸããããã¹ãŠãæšæºã§ãïŒããšãã°ãNicholas Zakasã®ã¬ããŒããEnterprise JavaScript Error HandlingãïŒ slidesãåç §ïŒã
è¿œå æ å ±
èšäºã«èšèŒãããŠããã¢ããªã±ãŒã·ã§ã³ã®ãœãŒã¹ã¯bitbucketã«ã¢ããããŒããããèšäºã«å¯Ÿå¿ãã段éçãªã³ããããè¡ãããŸãã ãŸããã¢ããªã±ãŒã·ã§ã³èªäœãèŠãããšãã§ããŸã ã
ã¢ãžã¥ãŒã«ã®å®è£ ã«å¯Ÿããç§ã®ã¢ãããŒããæ¹å€ããã人ã¯ãæåã«ä»ã®ã¢ãããŒãã«ã€ããŠã®ç§ã®æèŠãç¥ãããšãã§ããã ããã«ã æã ãç§ã®jsãã³ãã¬ãŒããšã³ãžã³ã«ã€ããŠå°ãè°è«ããããŸããã
ãã®ãããã¯ã«é¢ããä»ã®èšäºïŒ ã¹ã±ãŒã©ãã«ãªJavaScriptã¢ããªã±ãŒã·ã§ã³ ã