
çŽ2ãæåã TheShockãšç§ã¯JavaScriptã®FAQãããã¯ã§ããJavaScriptã®è³ªåãéããŸããïŒè³ªåãããŸãã æåã®éšåãç§ãåŸã質åã¯ãæ°æ¥åŸã«JavaScript FAQïŒããŒã1ã«çŸããŸãããã2çªç®ã®éšåã¯ããŸãããããããŸããããŸããã TheShockã¯çŸåšãå¥ã®åœã«ç§»åããŠãããããçãã«å¿ããŠããŸããã 圌ã¯ç§ã«åœŒã®éšåã«çããããã«é Œãã ã ãããã£ãŠãçãã®2çªç®ã®éšåã¯ãç§ãåŸã質åã§ãã
ãã®ããŒãã§ã¯ïŒ
- eval = evilãªã®ã¯ãªãã§ããïŒ
- evalã眮ãæããæ¹æ³ã¯ïŒ
- ãã©ãã·ã¥ãªãã§JSã䜿çšããŠãµãŠã³ããåçããæ¹æ³ ã©ã®åœ¢åŒããµããŒããããŠããŸããïŒ
- ã°ããŒãã«å€æ°ã䜿çšãããšãã¹ã¯ãªãããã©ããããé ããªããŸããïŒ
- JSã§ããã¹ããéžæãããªãããã«ããæ¹æ³ã¯ïŒ
- ïŒé¢æ°ïŒïŒ{}ïŒïŒïŒ; ãã®ãã¶ã€ã³ã¯äœã«äœ¿çšãããŸããïŒ
- ã€ãã³ãããªã»ããããŠã¢ã€ãã ã®ç¶æ ã埩å ããæ¹æ³ã¯ïŒ
- Ajaxã¢ããªã±ãŒã·ã§ã³ã§ãã©ã¡ãŒã¿ä»ãã®jsã³ãã³ããæ£ãã転éããã«ã¯ã©ãããã°ããã§ããïŒ
- ãã§ã«jQueryãã¹ãŠã£ã³ããŠãæ¢ã«ã°ããŒãã«ã§ããã®ã«ããªãæªå®çŸ©ãªã®ã§ããïŒ
- ãŠãŒã¶ãŒãããŠã¹ãã€ãŒã«ãå転ãããæ¹æ³ãèŠã€ããæ¹æ³
- èŠçŽ ãã©ãŒã«ã¹ã€ãã³ãããããŸããïŒãªãå Žåããããå®è£ ããããšã¯å¯èœã§ããïŒ
- äžå€ãªããžã§ã¯ãïŒããªãŒãºïŒã®äœãæ¹
- DomElementã®ã«ã¹ã¿ã å®è£ ãäœæããŠãã¿ã°ã®ãµãã»ããã解æãããšãã«äœ¿çšã§ããããã«ããããšã¯å¯èœã§ããïŒ
- ã©ã®ã¯ã©ã€ã¢ã³ãMVCãã¬ãŒã ã¯ãŒã¯ããå§ãããŸããïŒ
- ãªãã¡ã©ãŒå¶éã®ãã€ãã¹
- JavaScriptã§ã®GOTO
- JavaScriptã®ç¶æ¿ã ç·ãšå¥³ã人éããæ¡åŒµããã€ããªãã®ãŒçã«æ£ããæ¹æ³
- ã¬ã€ã¢ãŠããšãµãŒããŒãµã€ããæãäžããããšãªããJavaScriptããã°ã©ããŒãç²åŸããããšã¯å¯èœã§ããïŒ
- ãµãŒããŒãã.jsããå®è¡ãããã³ãŒãã«ããŒã¿ã転éããæ¹æ³ã¯äœã§ããïŒ
- éåžžã®DOMElemenïŒdivïŒã䜿çšããŠDOMInputElementã®åäœãååŸïŒãšãã¥ã¬ãŒãïŒã§ããŸããïŒ
- ãã©ã€ããŒãããã³ãããªãã¯ã¡ãœããã®åé¡
- JSã䜿çšããŠè€æ°ã®ãã¡ã€ã«ãåæã«éžæããŠã¢ããããŒãããæ¹æ³
- Fileããã³FormDataã䜿çšããŠãã¡ã€ã«ãããŠã³ããŒãããå ŽåããŠãŒã¶ãŒããã£ã¬ã¯ããªãããŒãããããšããŠãããã©ãããã©ã®ããã«å€æã§ããŸããïŒ
- JavaScriptã®å®£èš/泚éïŒããããPython / Javaããã®çšèªïŒã«é¡äŒŒãããã®ã¯ãããŸããïŒ
1.ãªãeval = evilãªã®ã§ããïŒ
1. Evalã¯ããã°ã©ã ã®éåžžã®ããžãã¯ã«éåããã³ãŒããçæããŸãã
2.çŸåšã®ã³ã³ããã¹ãã§ã³ãŒããå®è¡ãããããå€æŽã§ããŸã-æ»æã®æœåšçãªå Žæã ã³ã³ããã¹ãã¯ã次ã®ããªãã¯ãå®è¡ããããšã§å€æŽã§ããŸãã
(1,eval)(code);
ããã§äœãèµ·ãããïŒevalã¯ãåŒã³åºãæ¹æ³ã«äŸåããåãé¢æ°ã§ãã ãã®å Žåãã³ã³ããã¹ããã°ããŒãã«ã«å€æŽããŸãã
3. evalã«ãã£ãŠçæãããã³ãŒãã¯ãããã°ãå°é£ã§ãã
4. Evalã®å®äºã«ã¯éåžžã«é·ãæéãããããŸãã
èªã
ã°ããŒãã«è©äŸ¡ã ãªãã·ã§ã³ã¯äœã§ããïŒ
stackoverflowã«é¢ãã質åã®æïŒ
stackoverflow.com/questions/197769/when-is-javascripts-eval-not-evil
stackoverflow.com/questions/646597/eval-is-evil-so-what-should-i-use-instead
stackoverflow.com/questions/86513/why-is-using-javascript-eval-function-a-bad-idea
...
2. evalã眮ãæããæ¹æ³ã¯ïŒ
evalã®æè¯ã®ä»£æ¿ã¯ãevalã®äœ¿çšã䌎ããªãåªããã³ãŒãæ§é ã§ãã ãã ããevalã¯åžžã«ç°¡åã«æåŠã§ãããšã¯éããŸããïŒJSON ParsingãPattern ResizerïŒã
evalã®é©åãªä»£æ¿ã¯ãFunctionã³ã³ã¹ãã©ã¯ã¿ãŒã§ãã ããããããã¯ã°ããŒãã«ã³ã³ããã¹ãã§å®è¡ãããã®ãšåãè©äŸ¡ã§ãã
new Function('return ' + code)(); // (1,eval)(code);
3.ãã©ãã·ã¥ãªãã§JSã䜿çšããŠãµãŠã³ããåçããæ¹æ³ ã©ã®åœ¢åŒããµããŒããããŠããŸããïŒ
æãç°¡åãªè§£æ±ºçïŒ
<audio src="http://developer.mozilla.org/@api/deki/files/2926/=AudioTest_(1).ogg" autoplay> Your browser does not support the <code>audio</code> element. </audio>
ãã ããããã¯HTML5ãªãŒãã£ãªã«éå®ãããŸããã ãã©ãŒãããïŒOgg VorbisãWAV PCMãMP3ãAACãSpeexïŒãã©ãŠã¶äŸåïŒãã©ãŒãããã«ã€ããŠïŒ ãªãŒãã£ãªãã©ãŒãããã®ãµããŒã
èªã
HTML5ãªãŒãã£ãªããã³ã²ãŒã éçºïŒãã©ãŠã¶ãŒã®ãã°ãåé¡ãšè§£æ±ºçãã¢ã€ãã¢
WHATWG-ãªãŒãã£ãªèŠçŽ
MDN-HTMLãªãŒãã£ãª
äŸïŒ ã·ã³ãã«ãªã·ã³ã»ã®äœæ
äŸïŒ ãªãŒãã£ãªãµã³ãã«ãå«ãã°ã©ãã£ãã¯ã®è¡šç€º
äŸïŒ ãªãŒãã£ãªã¹ãã¯ãã«ã®èŠèŠå
äŸïŒ WebããŒã¹ã®ããŒã³ãžã§ãã¬ãŒã¿ãŒã®äœæ
4.ã°ããŒãã«å€æ°ã䜿çšãããšãã¹ã¯ãªãããã©ãã ãé ããªããŸããïŒ
ç¹å®ã®ãã©ãŠã¶ã«äŸåããŸãã ææ°ã®ãã©ãŠã¶ã§ã¯ããã®ç¬éã¯æé©åãããŠãããéãã¯ãããŸããã å€ããã®ã§ã¯ãã°ããŒãã«å€æ°ãžã®ã¢ã¯ã»ã¹ã¯2åé ããªããŸãã
ãã¹ãã¯æ¬¡ã®ãšããã§ããjsperf.com / global-vs-local-valiable-access
ããã¯ãã¹ãã§ãããåæäœã¯1ç§ãããæ倧100äžåå®è¡ããããšããäºå®ãèæ ®ããŠãã ããã ãã¹ãã®å¢å ã30ïŒ ã§ãã£ãŠããæåã®æäœã®å®éã®å¢å ã¯æ²æšã§ãïŒãã€ã¯ãç§ïŒã
5. JSã§ããã¹ãéžæãç¡å¹ã«ããæ¹æ³ã¯ïŒ
ããã€ãã®ãªãã·ã§ã³ããããŸãã
1.
onselectstart
ããã³
onmousedown
preventDefault
ãå®è¡ã
onmousedown
var element = document.getElementById('content'); element.onselectstart = function () { return false; } element.onmousedown = function () { return false; }
2.
unselectable
å±æ§ãè¿œå ãã
$(document.body).attr('unselectable', 'on')
3.
user-select: none
ã¹ã¿ã€ã«ãè¿œå ã
user-select: none
.g-unselectable { -moz-user-select: none; -khtml-user-select: none; -webkit-user-select: none; user-select: none; }
ãã®åé¡ã«ã¯ãšãã§ããªã解決çããããŸãã
4.
Range, TextRange, Selection
ãã¯ãªãŒãã³ã°ããã¿ã€ããŒ
説æããŸããã Selectionã®æäœæ¹æ³ã¯ã RangeãTextRangeãããã³Selectionã§ç¢ºèªã§ããŸãã
5.ãã£ã³ãã¹ã«ããã¹ããã¬ã³ããªã³ã°ãã
6.ç¡å¹ãªããã¹ããšãªã¢ã䜿çšãã
<textarea disabled="disabled" style="border:none;color:#000;background:#fff; font-family:Arial;"> JS? </textarea>
以äžã¯ãã¡ãœãã1ã3ã䜿çšããjQueryã®ãã€ã¯ããã©ã°ã€ã³ã§ãã
$.fn.disableSelection = function() { function preventDefault () { return false; } $(this).attr('unselectable', 'on') .css('-moz-user-select', 'none') .css('-khtml-user-select', 'none') .css('-o-user-select', 'none') .css('-msie-user-select', 'none') .css('-webkit-user-select', 'none') .css('user-select', 'none') .mousedown(preventDefault); .each(function() { this.onselectstart = preventDefault; }); };
ãã®ãã©ã°ã€ã³ã¯ããŠãŒã¶ãŒéžæãŸãã¯éžæäžå¯ããµããŒãããŠããªããã©ãŠã¶ãŒã§ã¯ãCtrl + A Ctrl + Cããä¿åããŸããã 泚æïŒéžæãçŠæ¢ããããšã¯æªã§ãã
6.ïŒé¢æ°ïŒïŒ{}ïŒïŒïŒ; ãã®ãã¶ã€ã³ã¯äœã«äœ¿çšãããŸããïŒ
ããã¯ãå³æèµ·åé¢æ°åŒïŒIIFEïŒãšåŒã°ããŸããããã¯ãäœæçŽåŸã«åŒã³åºãããåŒé¢æ°ã§ãã
IIFEãäœæããããã€ãã®æ¹æ³ã次ã«ç€ºããŸã
(function(){ /* code */ })(); // IIFE (function(){ /* code */ }()); // // "" true && function(){ /* code */ }(); 0,function(){ /* code */ }(); // , !function(){ /* code */ }(); // Facebook style ~function(){ /* code */ }(); -function(){ /* code */ }(); +function(){ /* code */ }(); // new new function(){ /* code */ } new function(){ /* code */ }() // ,
䜿çšå ŽæïŒ
1.å€éšç°å¢ã«å ¥ããªãããã«ããã€ãã®å€æ°ãå¿ èŠãªå ŽåïŒletãªã©ïŒ
var APPLICATION_ID = function(){ var keys = { 'pew.ru': 15486, 'pew.pew.ru': 15487, 'pew.pew.pew.ru': 1548 }; return keys[window.location.host]; }();
2.ããŒã«ã«åè·¯ã®äœæ-ã¢ãžã¥ãŒã«ã®åºç€ãç¶æ ãä¿åãããªããžã§ã¯ã
var Module = (function(){ function privateMethod () { }; return { publicMethod: function () { return privateMethod(); } }; }());
èªã
å³æåŒã³åºãé¢æ°åŒïŒIIFEïŒ
ECMA-262-3ã®è©³çŽ°ã 第5ç« æ©èœ
é¢æ°ãšé¢æ°ã¹ã³ãŒã
ååä»ãé¢æ°åŒ
JavaScriptã¢ãžã¥ãŒã«ãã¿ãŒã³ïŒè©³çŽ°
JavaScriptã§èª¬æãããéé
7.ã€ãã³ãããªã»ããããèŠçŽ ã®ç¶æ ã埩å ããæ¹æ³ã¯ïŒ
HTMLãšCSSã䜿çšããŠæåã«èšå®ããããAããã©ã¡ãŒã¿ãæã€ããçš®ã®DOMãªããžã§ã¯ãããããŸãã ãã®ããã»ã¹ã§ã¯ããã©ã¡ãŒã¿ãŒãåçã«ãBãã«å€æŽããŸãã ãªããžã§ã¯ãã®ç¶æ ãåæç¶æ ãAãã«ããªã»ãããããç°¡åãªæ¹æ³ã¯ãããŸããïŒ ã€ãã³ããåæ§ã§ãã åæç¶æ ã«ããŒã«ããã¯ããæ¹æ³ã¯ïŒãªããžã§ã¯ãã®ç¶æ ã®ããŒã«ããã¯ã¯æ©èœããŸããã èŠçŽ ã¯ããŸããŸãªæ¹æ³ã§ååŸã§ãããããDOMã¯ç¶æ ãä¿åããŸãããhtmlã³ãŒããçæãããJavaScriptããçŽæ¥ååŸã§ããŸãã
ã€ãã³ãã䜿çšãããšããã¹ãŠãç°¡åã«ãªããŸãã DOMã«ã¯åªããcloneNodeã¡ãœããããããŸãã èŠçŽ ããã®ãã¹ãŠã®ã³ã³ãã³ãã§è€è£œãïŒã€ãã³ãã¯ãããŸããïŒãå€ãèŠçŽ ãæ°ããèŠçŽ ã§çœ®ãæããŸãã
// $('input').click(function(){alert('')}); function resetEvents(element) { var newElement = element.cloneNode(true); element.parentNode.insertBefore(newElement, element); // fixed by @spmbt element.parentNode.removeChild(element); return newElement; } resetEvents($('input')[0]); //
8. ajaxã¢ããªã±ãŒã·ã§ã³ã§ãã©ã¡ãŒã¿ãŒã䜿çšããŠjsã³ãã³ããæ£ãã転éããæ¹æ³
åŒçšç¬Šã§å€§éšãããã«ajaxã¢ããªã±ãŒã·ã§ã³ã§ãã©ã¡ãŒã¿ä»ãã®jsã³ãã³ããæ£ãã転éããã«ã¯ã©ãããã°ããã§ããïŒ ããã¯ãäžèšã®ajaxã·ã¹ãã ã§ã®ããŒã¿è»¢éã«é¢é£ããŠããŸãã ãã¹ããã©ã¡ãŒã¿ãŒã®ããã€ãã®ã¬ãã«ïŒããšãã°ã "setTimeoutïŒ 'alertïŒ" Boom !!! "ïŒ;'ã200ïŒ;"ïŒã§è€éãªã³ãã³ããéä¿¡ãããšãåŒçšç¬Šã䜿çšãããšåé¡ãçºçããŸãã ãããã解決ããæ¹æ³ããŸãã¯ãããã®èšèšã«é¢ããäžè¬çãªã«ãŒã«ã¯ãããŸããïŒãµãŒããŒããã¯ã©ã€ã¢ã³ããžã®ã³ãŒãã®è»¢éã¯æªãã§ãã ããã¯ãevalã®åé¡ã«äŒŒãŠããŸãã æ£ãããè¿ éãã€å®å šã«ãéä¿¡ãããã®ã¯ã³ãŒãã§ã¯ãªãããã©ãŠã¶ãŒãåŠçããããŒã¿ã§ãã
RPCã䜿çšã§ããŸãã NowJSã䜿çšãããšãéåžžã«ééçãªRPCãååŸã§ããŸãã NowJSã¯ãã¯ã©ã€ã¢ã³ãäžã§æ©èœãå®è¡ãããšãã«ãµãŒããŒäžã§æ©èœãå®è¡ã§ãããã¬ãŒã ã¯ãŒã¯ã§ãã
ããã«ãµã€ãããã®äŸããããŸãïŒ
ãµãŒããŒäžïŒNode.JSãµãŒããŒ
var nowjs = require("now"); // http var everyone = nowjs.initialize(httpServer); everyone.now.getServerInfo = function(callback){ db.doQuery(callback); }
ã¯ã©ã€ã¢ã³ãã§
now.getServerInfo(function(data){ // });
ã·ã³ãã«ã§éæãçŸããïŒ
èªã
NowJSã®éå§
9. jQueryãã¹ãŠã£ã³ããŠãæ¢ã«ã°ããŒãã«ã§ããã®ã«ãªãæªå®çŸ©ãªã®ã§ããïŒ
jQueryã¯ã¯ããŒãžã£ãŒãäœæãããŠã£ã³ããŠãã¹ããŒããŠæªå®çŸ©ã«ããŸãã
1.
undefined
ã¯ãã³ãŒãã®éãæžããã
undefined
ãæžãæããåé¡ãåé¿ããããã«æž¡ãããŸãã jQueryã¯ãã°ãã°
undefined
ãšæ¯èŒãããå§çž®ããããš
undefined
ã¯1æåã®å€æ°ã«å€ãããŸãã
2.ã³ãŒãã®éãæžããããã«
window
ãæž¡ãããŸãã jQueryã¯ã
window.setInterval()
ãªã©ã䜿çšããŠãç¬èªã®ãŠã£ã³ããŠã¡ãœãããåé¢ããé©åãªããªã·ãŒãé©çšããŸãã å§çž®ããããšã
window
ã¯1æåã®å€æ°ã«å€ãããã³ãŒãå ã§ã¯
c.setInterval()
10.ãŠãŒã¶ãŒãããŠã¹ãã€ãŒã«ãã©ã®æ¹åã«åããã調ã¹ãæ¹æ³
ã¹ã¯ããŒã«ãã€ãŒã« '
DOMMouseScroll
'ïŒFirefoxïŒããã³ '
mousewheel
'ïŒæ®ãïŒã«å¿çãã2ã€ã®ã€ãã³ãããããŸãã
ã€ãã³ãããã³ã°ã¢ããããæ¹æ³ãç§ã¯èª°ããç解ããŠãããšæãããã®ãã³ãã©ãèŠãŠã¿ãŸããã
function wheel(event){ var delta = 0; if (!event) event = window.event; // IE. // delta if (event.wheelDelta) { // IE, Opera, safari, chrome - 120 delta = event.wheelDelta/120; } else if (event.detail) { // Mozilla, 3 delta = -event.detail/3; } if (delta) { // - ( ). if (event.preventDefault) { event.preventDefault(); } event.returnValue = false; // IE // 0, , var dir = delta > 0 ? 'Up' : 'Down', } }
jQueryã«ã¯ã ããŠã¹ãã€ãŒã«ãã©ã°ã€ã³ jQueryããŠã¹ãã€ãŒã«ãã©ã°ã€ã³ãã¢ããããŸã
ãã¹ãŠã®èŠçŽ ãã¹ã¯ããŒã«ã€ãã³ããçæã§ããããã§ã¯ãããŸããã ç¹å®ã®ãã©ãŠã¶ã«äŸåããŸãã ç¶ããèªãïŒ ã¹ã¯ããŒã«ãšããŠã¹ãã€ãŒã«
11.èŠçŽ ã«ãã©ãŒã«ã¹ã€ãã³ãããããŸããïŒãªãå Žåã¯ãå®è£ ã§ããŸããïŒ
ãã©ãŒã«ã¹ã¯è«ççãªã€ãã³ãã§ããããªããžã§ã¯ããéžæãããããšã瀺ããŸãã
æšæºãèªããšã
focus
ããã³
blur
ã€ãã³ãã¯ãã©ãŒã èŠçŽ ïŒLABELãINPUTãSELECTãTEXTAREAãããã³BUTTONïŒå°çšã§ãããšæžãããŠã
focus
ã æšæºã§ã¯ãä»ã®èŠçŽ ã¯ãã®ã€ãã³ããçæã§ããŸããã ä»ã®ãã¹ãŠã®èŠçŽ ã«ã¯ãä»ã®
DOMFocusOut
ãš
DOMFocusOut
ã IEã¯ãã€ãã®ããã«ãç¬èªã®ã€ãã³ã
focusin
ãš
focusout
ãŸãã
ãŸããFirefoxã¯æšæºã«ç¹ã«æºæ ããŠããŸããã
focus
ãš
blur
ã¹ããŒã§ãã圢åŒãé€ããããã€ãã®èŠçŽ ããããŸãã
focus, blur, focusin, focusout, DOMFocusIn, DOMFocusOut
ã¢ãŠã
focus, blur, focusin, focusout, DOMFocusIn, DOMFocusOut
ãŸãã
www.quirksmode.org/dom/events/tests/blurfocus.html
èŠçŽ ã®3ã€ã®ã€ãã³ããã¹ãŠããªãã¹ã³ãããšãèŠçŽ ããã©ãŒã«ã¹ãåãåã£ããã©ãããå€æã§ããŸãã
èªã
ãŒãããšãã©ãŒã«ã¹
12.äžå€ãªããžã§ã¯ããäœæããæ¹æ³ïŒããªãŒãºïŒ
ECMAScript 3ïŒãã¹ãŠã®JavaScriptãšã³ãžã³ããµããŒãããæšæºïŒã§ã¯ããªããžã§ã¯ããããªãŒãºããããšã¯ã§ããŸããã§ããããECMAScript 5ã§ã¯ããªããžã§ã¯ãã®å€æŽãããã«å¶éããããã€ãã®é¢æ°ãç»å ŽããŸããã
Object.preventExtensions
ã¯æã匱ãå¶éã§ãã ãªããžã§ã¯ãã¯è¿œå ã®ãã©ã¡ãŒã¿ãŒãåãåãããšãã§ããŸãã
Object.seal
-
preventExtensions
+ãã©ã¡ãŒã¿ã¯åé€ã§ããŸãã
Object.freeze
-
preventExtensions
+
seal
+ãã©ã¡ãŒã¿ã¯èªã¿åãå°çšã«ãªããŸã
ãã¹ãŠã®ãã©ãŠã¶ããããã®æ°ããã¡ãœããããµããŒãããŠããããã§ã¯ãããŸãã ã
èªã
JavaScript 1.8.5ã®æ°æ©èœ
Object.preventExtensions / seal / freezeé¢æ°ïŒJavaScriptïŒ
ECMAScript 5äºææ§ããŒãã«
13.ã¿ã°ã®ãµãã»ããã®è§£æã«äœ¿çšãããããã«ãDomElementã®ã«ã¹ã¿ã å®è£ ãäœæããããšã¯å¯èœã§ããïŒ
çŽæ¥ãããã DOMã¯JavaScriptãšã¯å¥ã§ãããããããã€ãã®å¶éããããŸãã
1.ç¹å®ã®èŠçŽ ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãããŸãã-èŠçŽ ã®ãã¡ã¯ããªãŒã®ã¿ããããŸã
String.prototype.anchor
document.createElement('')
ããã³èŠçŽ ãäœæããããã®æååã¡ãœãã
String.prototype.anchor
ãªã©ã
HTMLElement
ãš
HTMLDivElement
ã¯ã³ã³ã¹ãã©ã¯ã¿ãŒã§ã¯ãããŸããã
2.ã³ã³ã¹ãã©ã¯ã¿ããšãã¥ã¬ãŒãããŠããDOMã¯ãªããžã§ã¯ããããªãŒã«æ¿å ¥ããåŸããªããžã§ã¯ãããã¯ãªã¢ãããŸãã
äŸ
// - var HTMLZzzElement = function () { var self = document.createElement('zzz'); self.__proto__ = HTMLZzzElement.prototype; return self; }; // HTMLUnknownElement function F(){} F.prototype = HTMLUnknownElement.prototype; HTMLZzzElement.prototype = new F(); HTMLZzzElement.prototype.constructor = HTMLZzzElement; HTMLZzzElement.prototype.pewpewpew = function () {}; // var zzz = new HTMLZzzElement(); // , zzz.innerHTML = 'Yohoho!'; // console.log(zzz instanceof HTMLZzzElement); // true console.log(zzz instanceof HTMLUnknownElement); // true console.log(zzz instanceof HTMLElement); // true console.log(typeof zzz.pewpewpew); // function // - // DOM document.body.appendChild(zzz); // zzz = document.querySelector('zzz') // console.log(zzz instanceof HTMLZzzElement); // false console.log(zzz instanceof HTMLUnknownElement); // true console.log(zzz instanceof HTMLElement); // true console.log(typeof zzz.pewpewpew); // undefined
ãã ããã¡ãœãããšããããã£ãHTMLèŠçŽ ã®ãã¯ã©ã¹ãã®ãããã¿ã€ãã«è¿œå ããŠãå°æ¥äœ¿çšããããšãã§ããŸãã
HTMLUnknownElement.prototype.pewpewpew = function () {}; console.log(typeof zzz.pewpewpew); // function
ãã¯ã©ã¹ãã®ç¶æ¿ãã§ãŒã³ã¯
Node -> Element -> HTMLElement -> HTMLDivElement/HTMLMetaElement ...
èŠçŽ ã®ãããã¿ã€ãã«ã¡ãœãããè¿œå ã§ããŸãããä»ã®äººã®ãªããžã§ã¯ãã«ããããåœãŠãã®ã¯æªãããšãå¿ããªãã§ãã ããïŒ
ãã®ã¡ãœããã¯ãææ°ã®ãã©ãŠã¶ãŒã§ã®ã¿æ©èœããŸãã IE8以äžã§ã¯ãhtmlèŠçŽ ã¯ç©ºäžããåãããããããããã¿ã€ããäœã¬ãã«ã§æžãæããããšã¯ã§ããŸããã
>>document.createElement('div').constructor //undefined -- null...
>>document.createElement('div') instanceof Object //false -- , ? toString >>Object.prototype.toString.call(document.createElement('div')); //"[object Object]"
14.ã¯ã©ã€ã¢ã³ãMVCãã¬ãŒã ã¯ãŒã¯ã®ã¢ããã€ã¹ã¯äœã§ããïŒ
å€ãã®ãã¬ãŒã ã¯ãŒã¯ããããŸãã
JavaScriptMVC
Backbone.js
ã¹ãã©ãŠãã³ã¢
ããªã ãžã£ã³ã¯ã·ã§ã³
ãã¹ãŠãèŠãŠãããªããäžçªå¥œããªãã®ãéžæããŠãã ããã Backbone.jsãšã®ã¿ç·å¯ã«é£æºããŸãã
èªã
Backbone.jsã䜿çšããè€éãªã€ã³ã¿ãŒãã§ã€ã¹ã®äœæ
ãããŠåã³MVCã«ã€ããŠ
Javascript mvc
15.ãªãã¡ã©ãŒã®ãã€ãã¹ã®å¶é
blabla.ruãµãŒããŒã«ç»åããããå¥ã®ãµãŒããŒïŒpewpew.comïŒãããªãã¡ã©ãŒãéä¿¡ããå ŽåããµãŒããŒã¯ãããæäŸããŸããã åçã®å 容ãååŸããŠãŠãŒã¶ãŒã«è¡šç€ºããæ¹æ³ã¯ïŒäœããã®æ¹æ³ã§ãã©ãŠã¶ããçŽæ¥ã ãªãã¡ã©ãŒãå€æŽãããµãŒããŒãããã·ãäœæã§ããŸãã
16. JavaScriptã®GOTO
å®éåé¡ã¯ãJavaScriptã§gotoåäœãç¹°ãè¿ãæ¹æ³ã§ãã ïŒè¯ãã¹ã¿ã€ã«ãšgotoã«ã€ããŠè©±ãå¿ èŠã¯ãããŸãã:)çæãããã³ãŒãã«ã€ããŠè©±ããŠããã ãããã¯ãšãµã€ã¯ã«ã®åŸ©å ã¯ç°¡åãªããã»ã¹ã§ã¯ãããŸããïŒJavaScriptã«ã¯ã¿ã°ããããŸãããgotoã¯ãããŸããïŒäºçŽèªã®ã¿ããããŸãïŒã ã©ãã«ã¯ä»ã®ãã¹ãŠã®èšèªãšåãããã«èŠããŸãããåäœãç°ãªããŸãã ã©ãã«ã¯ãããã¯ãéžæããŸãã ãããã¯å ã«ä»ã®ããŒã¯ããããããã¯ãããå ŽåããããŸãã ãã®ãããã¯å ã«ããbreakãšcontinueã䜿çšããŠã©ãã«ã«ç§»åã§ããŸãã
äŸïŒ
loop1: for (var a = 0; a < 10; a++) { if (a == 4) { break loop1; // 4 } alert('a = ' + a); loop2: for (var b = 0; b < 10; ++b) { if (b == 3) { continue loop2; // 3 } if (b == 6) { continue loop1; // loop1 'finished' } alert('b = ' + b); } alert('finished') } block1: { alert('hello'); // 'hello' break block1; alert('world'); // } goto block1; // Parse error - goto
17. JavaScriptã®ç¶æ¿ã ç·ãšå¥³ã人éããæ¡åŒµããã€ããªãã®ãŒçã«æ£ããæ¹æ³
ãããã¿ã€ãç¶æ¿ã䜿çšããããšã¯ãã€ããªãã®ãŒçã«æ£ããã§ãã ç¶æ¿ããã»ã¹ã«ã€ããŠã¯ãèšäºã JavaScriptã®åºæ¬ãšèª€è§£ ã ã§è©³ãã説æãããŠããŸã ã
18.ã¬ã€ã¢ãŠããšãµãŒããŒãµã€ããæãäžããããšãªããjavascriptããã°ã©ããŒãç²åŸããããšã¯å¯èœã§ããïŒ
ãããžã§ã¯ããäŒç€Ÿã®èŠæš¡ãããã³çµéšã«äŸåããŸãã
倧äŒæ¥ã§ãã©ãŠã¶ããŒã¹ã®ã²ãŒã ã®éçºè ã«ãªããšãJavaScriptã®ã¿ãæ±ãå¯èœæ§ãéåžžã«é«ããªããŸãã 倧äŒæ¥ã§ã¯ç¬ç«ããããã³ããšã³ãããã°ã©ããè³Œå ¥ããäœè£ããããŸãããäžå°äŒæ¥ã§ã¯ã§ããŸããã å°æ»çµéšããªããŠãã©ãããŒã§ããïŒïŒ
Webã®åŠç¿ãå§ããã°ããã®å Žåã¯ããã¹ãŠã奜ããªå Žæã«è¡ãå¿ èŠããããŸãã
19.ãµãŒããŒãã.jsããå®è¡ãããã³ãŒãã«ããŒã¿ã転éããæ¹æ³ã¯äœã§ããïŒ
ããŒã¿ã転éããæ¹æ³ã¯å€æ°ãããŸãïŒXHRãSSEãWebSocketsãJSONPïŒ
ãµãŒããŒéä¿¡ã€ãã³ãã䜿çšããHTTPãµãŒããŒããã·ã¥ã®å®è£
æ°ããXMLHttpRequest2æ©èœ
ãµãŒããŒéä¿¡ã€ãã³ãã䜿çšãããªã¢ã«ã¿ã€ã ã¢ããªã±ãŒã·ã§ã³ã®äœæ
Ajaxã«ã€ããŠãããã
éžæãããã©ã³ã¹ããŒããšåœ¢åŒã¯ãã¢ããªã±ãŒã·ã§ã³ã®èŠä»¶ã«ãã£ãŠç°ãªããŸãã ããšãã°ãããããã£ããã®å ŽåãSSEãŸãã¯WebSocketsã®æ¹ãåªããŠããŸãïŒã¡ãã»ãŒãžã®é ä¿¡æéãéèŠã§ãïŒã ãŸãããã®ãã£ãããIE6ã§ã¯ãã¹ãã¡ã€ã³ã§æ©èœããå ŽåãiframeãŸãã¯flashã䜿çšããŠéæ³ãè¿œå ããå¿ èŠããããŸãã
20.éåžžã®DOMElemenïŒdivïŒã䜿çšããŠDOMInputElementã®åäœãååŸïŒãšãã¥ã¬ãŒãïŒããããšã¯å¯èœã§ããïŒ
äœã¬ãã«ã§ã¯ã§ããŸããã ãã®çç±ã13çªç®ã®äŸã§èª¬æããŸããã DOMDivElementã«åºã¥ãå ¥åããšãã¥ã¬ãŒãããã©ãããŒãäœæã§ããŸãã
ç°¡åãªãšãã¥ã¬ãŒã¿ãŒjsfiddle.net/azproduction/Kz4d9ãã¹ã±ããããŸãã-éåžžã«æªãå ¥åã§ããããšãå€æããŸããïŒéä¿¡æ¹æ³ãããããªãããã©ãŒã«ã¹ã倱ãæ¹æ³ãããããªããªã©ïŒã
åãåé¡ã¯ã1ã€ã®å±æ§ã®ã¿ãè¿œå ããããšã§ããããšã¬ã¬ã³ãã«è§£æ±ºã§ããŸãïŒ Finomã«æãåºãããŠãããŸã ïŒcontenteditableã ãã¹ã¯ããããã©ãŠã¶ãŒã®ã¿ããµããŒãããŸã-åãå ¥åãå€æããŸããããã¯ããã«ã·ã³ãã«ã§åªããjsfiddle.net/azproduction/ZTqRe
21.ãã©ã€ããŒãã¡ãœãããšãããªãã¯ã¡ãœããã®åé¡
ãªããžã§ã¯ãã®ãã©ã€ããŒãå€æ°ãšã¡ãœããã䜿çšãããå Žåã¯ãJavaScriptã§ãããªãã¯ãããã©ã€ããŒãã¡ãœããã«ã¢ã¯ã»ã¹ããåé¡ããããŸãã ãããŠãã³ã³ã¹ãã©ã¯ã¿å ã§å®çŸ©ãããç¹æš©ã¡ãœããã¯ãæ£ããç解ããã°ãã€ã³ã¹ã¿ã³ã¹ããšã«è€è£œãããŸããããã¯ããã©ãŒãã³ã¹ã®ç¹ã§ã¯ããŸãè¯ããããŸããã ãã®ã¢ãããŒãã¯ã©ãã§ããïŒTheShock ïŒ
ããã¢ãããŒãã å°ãªããšãã³ã³ã¹ãã©ã¯ã¿ãŒã§ãã¹ãŠã®ã¡ãœããã宣èšããããã¯ãŸãã§ãã
// our constructor function Person(name, age){ this.name = name; this.age = age; }; // prototype assignment Person.prototype = new function(){ // we have a scope for private stuff // created once and not for every instance function toString(){ return this.name + " is " + this.age; }; // create the prototype and return them this.constructor = Person; this._protectedMethod = function (){ // act here }; this.publicMethod = function() { this._protectedMethod(); }; // "magic" toString method this.toString = function(){ // call private toString method return toString.call(this); } };
ã¢ãžã¥ã©ãŒã¢ãããŒãïŒ
var Module = (function (window) { function privateFunction() { console.log('pass'); }; var privateClass = function () {}; var publicClass = function () {}; publicClass.prototype.publicMethod = function () { privateFunction(); // ... }; return { // publicClass: publicClass }; }(this)); // (new Module.publicClass()).publicMethod();
22. JSã䜿çšããŠè€æ°ã®ãã¡ã€ã«ãåæã«éžæããŠã¢ããããŒãããæ¹æ³
ãã¹ãŠãäžåºŠã§ã¯ãªãé·ãéæžãããŠããŸãïŒ
1. HTML5 File APIïŒãµãŒããŒãžã®è€æ°ã®ãã¡ã€ã«ã®ã¢ããããŒã
2. HTML5ã䜿çšããŠãã¡ã€ã«ãã¢ããããŒãããæªå£ãèšã£ãåæ°
3. è€æ°ã®ãã¡ã€ã«ãèªã¿èŸŒããã©ãŠã¶ãŒ
4. ajaxãphpãã©ãŒã ã§è€æ°ã®ãã¡ã€ã«ãã¢ããããŒããã
5. html5 File APIã䜿çšããŠã奜ã¿ãšãã³ãµãŒãå«ããã¡ã€ã«ãããŠã³ããŒããã
23. Fileããã³FormDataã䜿çšããŠãã¡ã€ã«ãããŠã³ããŒãããå ŽåããŠãŒã¶ãŒããã£ã¬ã¯ããªãããŒãããããšããŠãããã©ããã確èªããã«ã¯ã©ãããã°ããã§ããïŒ
Fileããã³FormDataã䜿çšããŠãã¡ã€ã«ãããŠã³ããŒãããå Žå-ãŠãŒã¶ãŒããã£ã¬ã¯ããªãããŒãããããšããŠãããã©ãããå€æããæ¹æ³ã File.typeããããã£ã¯æ®å¿µãªãã圹ã«ç«ããªãïŒããã€ãã®ã¿ã€ãã§ã¯ãdir-空ã®æååãªã©ïŒãsizeããããã£ãïŒffãšsafariã¯ç°ãªã£ãŠè¡šç€ºãããïŒ
File.type
ã«é¢ããŠã¯ãããã¯MIMEã¿ã€ãã§ãããšèšãããå®çŸ©ãããŠããªãå Žåã¯ç©ºã®æååã«ãªããŸãã MIMEã¿ã€ãã¯ãéåžžã©ããããã¡ã€ã«/ãã©ã«ããŒã®æ¡åŒµåããååŸãããŸãã ãpewpewããšããååã®å®éã®ãã¡ã€ã«ãã¹ãªãããããšãmimeã¯ããã«ãªãããã£ã¬ã¯ããªã®ååããpewpew.htmlãã«ãªããšãmimeã¯
"text/html"
ãŸãã ããã¯ç§ãã¡ã«ã¯åããŸããã
ãã©ã«ããŒã®ãµã€ãºã¯åžžã«0ã§ããããµã€ãºã0ãã€ãã®ãã¡ã€ã«ãååšããå ŽåããããŸãã 100ïŒ ã®ä¿¡é ŒãåŸãããã«ãããã¯ç§ãã¡ã«ã¯é©ããŠããŸããã
æšæºã®www.w3.org/TR/FileAPIã¯ãã£ã¬ã¯ããªã«ã€ããŠåå¥ã«è©±ããŸãããããŠãŒã¶ãŒãäžæ£ãªãã¡ã€ã«ïŒä¿è·ãããŠãããèªã¿åãäžå¯ãªã©ïŒãæäœããããšãããšããã©ãŠã¶ãŒã¯
SECURITY_ERR
ãã¹ããŒã§ãããšè¿°ã¹ãŠããŸããããã
ç§ãåã£ãåºç€ã¯ã ãã©ãã°ã¢ã³ãããããã®äŸã§ã
FileReader
ã䜿çšããŠããªãœãŒã¹ã®ã¿ã€ãã決å®ããŸãã firefoxã§ã¯ããã©ã«ããŒããã¡ã€ã«ãšããŠèªã¿åããšã
reader.readAsDataURL
ã¡ãœããã¯äŸå€ãã¹ããŒããŸãã ã¯ãã ã§ã¯ããã®äŸå€ã¯ã¹ããŒãããŸãããã
reader
onerror
ã€ãã³ãã
onerror
ãŸãã ã¯ãã¹ããŠããã¡ã€ã«ãã©ãããå€æããé¢æ°ãååŸããŸãã
function isReadableFile(file, callback) { var reader = new FileReader(); reader.onload = function () { callback && callback(true); callback = null; } reader.onerror = function () { callback && callback(false); callback = null; } try { reader.readAsDataURL(file); } catch (e) { callback && callback(false); callback = null; } }
é¢æ°ã§ã¯ãã»ãã¥ãªãã£ã®ããã«ãã³ãŒã«ããã¯ãåé€ããŠãå床åŒã³åºãããªãããã«ããŸãïŒå°æ¥ã
FileReader
ã®åäœãå€æŽãããå¯èœæ§ããããŸãïŒã
Jsfiddle.net/azproduction/3sV23/8ã®äŸ
ãã¶ãããã¯ãã¡ã€ã«ãµã€ãºã«ãã£ãŠå¶éãããŠããŸããã 0ã®å Žåãããã¯ãã¡ã€ã«ã§ã¯ãªããšèããŸãïŒãµã€ãºã0ãã€ãã®ãã¡ã€ã«ãã¢ããããŒãããã®ã¯å¥åŠã ããã§ãïŒã
24. JavaScriptã®å®£èš/泚éïŒããããPython / Javaããã®çšèªïŒã«é¡äŒŒãããã®ã¯ãããŸããïŒ
çŽæ¥ã®ã¢ããã°ã¯ãããŸããã
PS質åãžã®åçãå¿ããå Žåã¯ãããäžåºŠè³ªåããŠãã ããã æåãŸãã¯2çªç®ã®éšåã®ãããã«ãåçããªã質åãããå Žå-質å-3çªç®ã«ãããŸã;ïŒ