<?xml version="1.0" encoding="utf-8" ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <meta http-equiv="Content-Script-Type" content="text/javascript" />
  <link rel="stylesheet" type="text/css" href="//blog.8-p.info/2009/wp-content/themes/b8i/ALL.css" />

  <link rel="alternate" type="application/rss+xml"
             href="//blog.8-p.info/2009/feed" title="Japanese + English" />
  <link rel="alternate" type="application/atom+xml"
             href="//blog.8-p.info/2009/tag/lang-en/feed/atom" title="English" />

  <link rel="icon" href="//blog.8-p.info/favicon.ico" type="image/vnd.microsoft.icon" />
  <title>blog.8-p.info</title>

<link rel="EditURI" type="application/rsd+xml" title="RSD" href="//blog.8-p.info/2009/xmlrpc.php?rsd" />
<link rel="wlwmanifest" type="application/wlwmanifest+xml" href="//blog.8-p.info/2009/wp-includes/wlwmanifest.xml" /> 


</head>

<body>

<div id="header">
  <div class="main">
    <h1><a href="/">blog.8-p.info</a></h1>
    <p>加藤和良 (1984年うまれ) の個人的なブログです。</p>
  </div>
  <div class="sidebar">
    <form method="get" action="//blog.8-p.info/2009/">
      <div id="search">
        <input type="text" class="text" id="searchKeyword"  name="s"
               value="" />
      </div>
    </form>
  </div>
</div>

<div id="body">
   <div class="main">

<div class="entry" id="entry275">
  <h2 class="entry-title"><a href="//blog.8-p.info/2009/01/dom-scripting">『DOM Scripting 標準ガイドブック』を読んだ</a>
    (4)  </h2>
  <div class="yui-g meta">
    <div class="date yui-u first">
      2009-01-17 11:45    </div>
    <div class="tags yui-u">
      <a href="//blog.8-p.info/2009/tag/book" rel="tag">book</a>    </div>
  </div>
  <div class="body"><p>まえに人におすすめされて少しだけ借りて読んだ <a href="http://domscripting.com/book/">DOM Scripting: Web Design with JavaScript and the Document Object Model</a> という本があって、それの日本語訳の『<a href="http://www.amazon.co.jp/gp/product/4839922373?ie=UTF8&#038;tag=8pinfo-22&#038;linkCode=as2&#038;camp=247&#038;creative=7399&#038;creativeASIN=4839922373">DOM Scripting 標準ガイドブック</a><img src="http://www.assoc-amazon.jp/e/ir?t=8pinfo-22&#038;l=as2&#038;o=9&#038;a=4839922373" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />』が売っていたので買って読んだ。初版が2007年6月なので、最近出た本じゃないです。</p>
<h3>文法まわりは微妙</h3>
<p>2章の JavaScript の文法に対する記述はあんまりうなづけないところがある。変数名が snake_case なのは趣味の問題だけどたぶん lowerCamelCase のほうが多数派。</p>
<p>配列を</p>
<blockquote><pre>
var beatles = Array("ジョン", "ポール", "ジョージ", "リンゴ");
</pre>
</blockquote>
<p>とするほうが [] より「良い」(p.33) とも思えないし、連想配列がほしいときに {} じゃなくて</p>
<blockquote><pre>
var lennon = Array();
lennon["name"] = "ジョン";
lennon["year"] = 1940;
lennon["living"] = false;
</pre>
</blockquote>
<p>としているのも、厳密にはまちがいじゃないのかなー。push, pop とかしないものを Array にしても、とは思う。</p>
<p>あ、クラスっぽいものを定義 (function の prototype をどうこう) したりには踏み込みません。それは正しい判断だと思う。</p>
<h3>HTML と JavaScript のつきあわせかた</h3>
<p>5, 6章と、8, 9 章にある DOM まわりのはなしはかなり良い。4, 5, 6 章では </p>
<pre>&lt;a href="images/fireworks.jpg" title="打ち上げ花火"&gt;</pre>
<p>みたいなリンクのリストからインラインで画像が切り替わるページを、8章では abbr から dl, dt, dd のリストを、blockquote の cite 属性からリンクを、accessskey 属性からまたリストを生成、9章では table にストライプをつけたりしている。</p>
<p>10章は DOM の要素を変数置き場にしてるのがあんまり</p>
<blockquote><pre>
var elem = document.getElementById(elementID);
if (elem.movement) {
  clearTimeout(elem.movement);
}
</pre>
</blockquote>
<p>好きじゃないな。</p>
<p>で、Web で JavaScript を書くときに考えなきゃいけないことは3つあると思う。</p>
<p>ひとつはプログラミング言語一般のこと。適切に関数なりクラスに処理をまとめたり、スコープを狭く保ったり、ループの中で getElementById しなかったり。これは、<strong>プログラマならわかる</strong>ことだ。</p>
<p>次に、クロスブラウザ間での差異のこと。これは複数のブラウザで動作確認すればわかる。センスじゃなくて努力でなんとかなる。(User-Agent を見て分岐するなメソッドの有無を見ろ、というのはこの本だと p.98 にあります)</p>
<p>最後が、HTML と JavaScript のつきあわせかただ。なぜ href=&#8221;photo.jpg&#8221; を href=&#8221;javascript:openPhoto()&#8221; や onclick=&#8221;openPhoto()&#8221; href=&#8221;#&#8221; と書き換えるべきではないのか。「Lightbox で開くからユーザービリティが高い」というのは全然わかっていない。この種の書き方は HTML から意味を剥奪しているという点で間違っていて、その間違いは「Googlebot がリンクをたどってくれない」「真ん中のボタンでクリックしてもタブで開けない」といったかたちで運営者や利用者にはねかえってくる。</p>
<p>じゃあどうするの、というところがこの本にはちゃんと書いてある。「HTML と JavaScript のつきあわせかた」という問題に「ちゃんとマークアップされた文章に対して段階的強化 (progressive enhancement) として振る舞いを追加する」という解をだし、その実現方法を丁寧に説明しているところが素敵だと思います。</p>
</div>
</div>

    <div class="paginate">
                </div>
  </div>
  <div class="sidebar"><h2>About me and this blog</h2>
<p>
  All articles are written by <a href="http://8-p.info/me/">加藤和良</a>.
  A few are <a href="/2009/tag/lang-en">written in English</a>.
</p>

<ul>
  <li>
    <h2>Recent articles</h2>
    <ul>	<li><a href='//blog.8-p.info/2009/12/wordpress' title='さよなら WordPress'>さよなら WordPress</a></li>
	<li><a href='//blog.8-p.info/2009/12/chrome-repl-released' title='ChromeRepl released'>ChromeRepl released</a></li>
	<li><a href='//blog.8-p.info/2009/12/hatena' title='Hatena&#8217;s routing problem'>Hatena&#8217;s routing problem</a></li>
	<li><a href='//blog.8-p.info/2009/12/test-synchronized' title='Test::Synchronized released'>Test::Synchronized released</a></li>
	<li><a href='//blog.8-p.info/2009/11/26' title='11月をふりかえる'>11月をふりかえる</a></li>
	<li><a href='//blog.8-p.info/2009/11/subversion-file-find' title='Subversion のワーキングコピー上の File::Find を速くする'>Subversion のワーキングコピー上の File::Find を速くする</a></li>
	<li><a href='//blog.8-p.info/2009/11/chrome-repl' title='ChromeRepl - a remote REPL client for Google Chrome'>ChromeRepl - a remote REPL client for Google Chrome</a></li>
	<li><a href='//blog.8-p.info/2009/10/october' title='10月をふりかえる'>10月をふりかえる</a></li>
	<li><a href='//blog.8-p.info/2009/10/linux-db-system' title='『Linux-DB システム 構築/運用入門』を読んだ'>『Linux-DB システム 構築/運用入門』を読んだ</a></li>
	<li><a href='//blog.8-p.info/2009/10/cubic-volume' title='体積パズル'>体積パズル</a></li>
	<li><a href='//blog.8-p.info/2009/10/scala-scripting' title='Scala で書き捨てスクリプト'>Scala で書き捨てスクリプト</a></li>
	<li><a href='//blog.8-p.info/2009/09/september' title='9月をふりかえる'>9月をふりかえる</a></li>
	<li><a href='//blog.8-p.info/2009/09/greasekit-1-7' title='GreaseKit 1.7 released'>GreaseKit 1.7 released</a></li>
	<li><a href='//blog.8-p.info/2009/09/gcd-1' title='C にクロージャのようなものを追加する Grand Central Dispatch'>C にクロージャのようなものを追加する Grand Central Dispatch</a></li>
	<li><a href='//blog.8-p.info/2009/09/greasekit-1-6' title='GreaseKit 1.6 released'>GreaseKit 1.6 released</a></li>
	<li><a href='//blog.8-p.info/2009/09/yapcasia-2009' title='YAPC::Asia 2009 スタッフ日記'>YAPC::Asia 2009 スタッフ日記</a></li>
	<li><a href='//blog.8-p.info/2009/09/clickatell-sms' title='Clickatell 経由で SMS を送信する'>Clickatell 経由で SMS を送信する</a></li>
	<li><a href='//blog.8-p.info/2009/09/devel-nytprof' title='Devel::NYTProf を読む'>Devel::NYTProf を読む</a></li>
	<li><a href='//blog.8-p.info/2009/08/august' title='8月をふりかえる'>8月をふりかえる</a></li>
	<li><a href='//blog.8-p.info/2009/08/toeic' title='TOEIC スコアとか'>TOEIC スコアとか</a></li>
	<li><a href='//blog.8-p.info/2009/08/july-kpt' title='7月の KPT'>7月の KPT</a></li>
	<li><a href='//blog.8-p.info/2009/08/managers-schedule' title='Does anyone like &#8220;Manager&#8217;s Schedule&#8221;?'>Does anyone like &#8220;Manager&#8217;s Schedule&#8221;?</a></li>
	<li><a href='//blog.8-p.info/2009/07/wewlc' title='『レガシーコード改善ガイド』を読もう (あるいは、テストを書こう)'>『レガシーコード改善ガイド』を読もう (あるいは、テストを書こう)</a></li>
	<li><a href='//blog.8-p.info/2009/07/newspeak-on-bitbucket' title='Newspeak on Bitbucket'>Newspeak on Bitbucket</a></li>
	<li><a href='//blog.8-p.info/2009/07/newspeak' title='Newspeak - The search engine for commit logs'>Newspeak - The search engine for commit logs</a></li>
	<li><a href='//blog.8-p.info/2009/07/php-or-perl' title='What language should we learn?'>What language should we learn?</a></li>
	<li><a href='//blog.8-p.info/2009/06/june-kpt' title='6月の KPT'>6月の KPT</a></li>
	<li><a href='//blog.8-p.info/2009/06/html' title='HTML + CSS + JavaScript を組み合わせる難しさ'>HTML + CSS + JavaScript を組み合わせる難しさ</a></li>
	<li><a href='//blog.8-p.info/2009/06/dsvn-el' title='dsvn.el から Subversion をつかう'>dsvn.el から Subversion をつかう</a></li>
	<li><a href='//blog.8-p.info/2009/06/google-page-speed' title='Google Page Speed を読む'>Google Page Speed を読む</a></li>
	<li><a href='//blog.8-p.info/2009/05/may-kpt' title='5月の KPT'>5月の KPT</a></li>
	<li><a href='//blog.8-p.info/2009/05/testapache2-003-and-004' title='Test::Apache2 0.03 and 0.04'>Test::Apache2 0.03 and 0.04</a></li>
	<li><a href='//blog.8-p.info/2009/05/code-smell' title='コードの匂いは人に移る'>コードの匂いは人に移る</a></li>
	<li><a href='//blog.8-p.info/2009/05/test-apache2-released' title='Test::Apache2 をリリースした'>Test::Apache2 をリリースした</a></li>
	<li><a href='//blog.8-p.info/2009/05/april-kpt' title='4月の KPT'>4月の KPT</a></li>
	<li><a href='//blog.8-p.info/2009/04/test-apache2' title='My new project: Test::Apache2'>My new project: Test::Apache2</a></li>
	<li><a href='//blog.8-p.info/2009/04/project-root' title='プロジェクトのルートディレクトリを探す'>プロジェクトのルートディレクトリを探す</a></li>
	<li><a href='//blog.8-p.info/2009/04/danboard' title='Danboard is my XFD'>Danboard is my XFD</a></li>
	<li><a href='//blog.8-p.info/2009/04/glitchcam' title='glitchcam'>glitchcam</a></li>
	<li><a href='//blog.8-p.info/2009/03/kpt' title='3月の KPT'>3月の KPT</a></li>
	<li><a href='//blog.8-p.info/2009/03/textfield-js-2' title='JavaScript でプレースホルダ、の続き'>JavaScript でプレースホルダ、の続き</a></li>
	<li><a href='//blog.8-p.info/2009/03/gnu-strlen' title='GNU strlen を読む'>GNU strlen を読む</a></li>
	<li><a href='//blog.8-p.info/2009/03/textfield-js' title='JavaScript でプレースホルダつき入力欄を作る'>JavaScript でプレースホルダつき入力欄を作る</a></li>
	<li><a href='//blog.8-p.info/2009/02/life' title='2月の反省と近況'>2月の反省と近況</a></li>
	<li><a href='//blog.8-p.info/2009/02/class-sniff-combine_graphs' title='New Class::Sniff has &#8220;combine_graphs&#8221;'>New Class::Sniff has &#8220;combine_graphs&#8221;</a></li>
	<li><a href='//blog.8-p.info/2009/02/class-sniff' title='Class::Sniff で継承木をかく'>Class::Sniff で継承木をかく</a></li>
	<li><a href='//blog.8-p.info/2009/02/simbl' title='SIMBL で Cocoa アプリケーションにコードをつぎたす'>SIMBL で Cocoa アプリケーションにコードをつぎたす</a></li>
	<li><a href='//blog.8-p.info/2009/01/hreview' title='hReview is just a draft'>hReview is just a draft</a></li>
	<li><a href='//blog.8-p.info/2009/01/unwired-life' title='断線生活'>断線生活</a></li>
	<li><a href='//blog.8-p.info/2009/01/dom-scripting' title='『DOM Scripting 標準ガイドブック』を読んだ'>『DOM Scripting 標準ガイドブック』を読んだ</a></li>
	<li><a href='//blog.8-p.info/2009/01/object-kv-mapping' title='オブジェクトを key-value ストアに直列化する'>オブジェクトを key-value ストアに直列化する</a></li>
	<li><a href='//blog.8-p.info/2009/01/chrome-ui-test' title='Google Chrome の UI テスト (実装編)'>Google Chrome の UI テスト (実装編)</a></li>
	<li><a href='//blog.8-p.info/2009/01/refactoring' title='テストぬきリファクタリング'>テストぬきリファクタリング</a></li>
	<li><a href='//blog.8-p.info/2009/01/unittest-js' title='UnittestJS でクロスブラウザテスト'>UnittestJS でクロスブラウザテスト</a></li>
	<li><a href='//blog.8-p.info/2009/01/red-prompt' title='コマンドが失敗したらプロンプトを赤くする'>コマンドが失敗したらプロンプトを赤くする</a></li>
	<li><a href='//blog.8-p.info/2009/01/blogging-in-english' title='Blogging in English'>Blogging in English</a></li>
	<li><a href='//blog.8-p.info/2009/01/2009' title='2009'>2009</a></li>
</ul>
  </li>
</ul>

<ul><li id="linkcat-2" class="linkcat"><h2>Links</h2>
	<ul class='xoxo blogroll'>
<li><a href="http://collisions.doppac.cc/">collisions.doppac.cc</a></li>
<li><a href="http://googletesting.blogspot.com/">Google Testing Blog</a></li>
<li><a href="http://www.grafikcache.com/">Grafikcache</a></li>
<li><a href="http://news.ycombinator.com/">Hacker News</a></li>
<li><a href="http://someru.blog74.fc2.com/">Hang Reviewers High</a></li>
<li><a href="http://labs.ideo.com/">IDEO Labs</a></li>
<li><a href="http://blog.makezine.com/">MAKE: Blog</a></li>
<li><a href="http://d.hatena.ne.jp/KZR/">Radium Software</a></li>
<li><a href="http://steps.dodgson.org/">steps to phantasien</a></li>

	</ul>
</li>
</ul>

<p>
  <a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0 Transitional" height="31" width="88" /></a>
</p>
</div>
</div>

<div id="footer">Powered by <a href="http://wordpress.org/">WordPress</a></div>


<!-- Google Analytics -->
<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
var pageTracker = _gat._getTracker("UA-329758-2");
pageTracker._trackPageview();
</script>

<script type="text/javascript" src="//blog.8-p.info/2009/wp-content/themes/b8i/ALL.js"></script>

<script type="text/javascript">//<![CDATA[
(function () {
  var elements = document.body.getElementsByTagName('pre');
  var i, pre;
  for (i = 0; i < elements.length; i++) {
    pre = elements[i];
    if ((pre.innerText || pre.textContent).match(/^[%\(]/)) {
      ;
    } else {
      pre.className += ' prettyprint';
    }
  }
  prettyPrint();

  (new TextField($('searchKeyword'))).setPlaceholder('Search');
})();
//]]></script>

</body>
</html>
