<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>jmblog.jp &#187; javascript</title>
	<atom:link href="http://jmblog.jp/archives/tag/javascript/feed" rel="self" type="application/rss+xml" />
	<link>http://jmblog.jp</link>
	<description></description>
	<lastBuildDate>Fri, 12 Aug 2011 05:18:47 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>innerHTML あるいは jQuery.html() は HTMLをそのまま取得できるわけではない</title>
		<link>http://jmblog.jp/archives/876</link>
		<comments>http://jmblog.jp/archives/876#comments</comments>
		<pubDate>Mon, 21 Mar 2011 13:17:38 +0000</pubDate>
		<dc:creator>Yoshihide</dc:creator>
				<category><![CDATA[web development]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://jmblog.jp/?p=876</guid>
		<description><![CDATA[ご存知でしょうが、element.innerHTML を使うと HTML を取得することができます。Mozilla Developer Network (MDN) にも次のように書いてあります。

innerHTML は、与えられた要素に含まれる全てのマークアップ と内容を設定または取得します。
element.innerHTML &#8211; MDC Doc Centerより


また、jQuery.html() も、innerHTML と同様、HTML を取得することができます。

Get the HTML contents of the first element in the set of matched elements.
.html() – jQuery APIより

でも、場合によっては、HTML のソースをそのまま取得できるわけではないことをご存知でしたか？私は知りませんでした。
例えば、以下の例では、期待通りの HTML が返ってきます。

しかし、以下の場合はどうでしょうか？

&#60;p&#62;&#60;div&#62;foo&#60;/div&#62;&#60;/p&#62;
を期待するかもしれませんが、実際は少し異なる値が返ってきます。
Chrome や Safari などの Webkit 系のブラウザであれば、
&#60;p&#62;&#60;/p&#62;&#60;div&#62;foo&#60;/div&#62;&#60;p&#62;&#60;/p&#62;
Firefox の場合は、
&#60;p&#62;&#60;/p&#62;&#60;div&#62;foo&#60;/div&#62;
という HTML が取得されます。jQuery.html() の場合も同じ結果が得られます。
なぜこのようなことが起こるのでしょうか？不思議に思い、Quora で質問を投げてみました。すると、すぐにどなたかが答えてくれました。（Quora すげー！）また、Twitter でも同様の質問を投げてみたところ、@hogenishi1122 さんが答えてくれました。（感謝！）
innerHTML や jQuery.html() は HTML のソースをそのまま返すわけではなく、ブラウザが一度 DOMツリーに変換したものを返すとのこと。従って、invalid [...]]]></description>
			<content:encoded><![CDATA[<p>ご存知でしょうが、element.innerHTML を使うと HTML を取得することができます。Mozilla Developer Network (MDN) にも次のように書いてあります。</p>
<blockquote>
<p>innerHTML は、与えられた要素に含まれる全てのマークアップ と内容を設定または取得します。</p>
<p><cite><a href="https://developer.mozilla.org/ja/DOM/element.innerHTML">element.innerHTML &#8211; MDC Doc Center</a>より</cite></p>
</blockquote>
<p><span id="more-876"></span><br />
また、jQuery.html() も、innerHTML と同様、HTML を取得することができます。</p>
<blockquote>
<p>Get the HTML contents of the first element in the set of matched elements.</p>
<p><cite><a href="http://api.jquery.com/html/#html1">.html() – jQuery API</a>より</cite></p>
</blockquote>
<p>でも、場合によっては、HTML のソースをそのまま取得できるわけではないことをご存知でしたか？私は知りませんでした。</p>
<p>例えば、以下の例では、期待通りの HTML が返ってきます。<br />
<iframe style="width: 100%; height: 170px" src="http://jsfiddle.net/sHGf8/embedded/"></iframe></p>
<p>しかし、以下の場合はどうでしょうか？<br />
<iframe style="width: 100%; height: 170px" src="http://jsfiddle.net/6J6tj/1/embedded/"></iframe></p>
<div class="codecolorer-container html4strict twitlight" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">p</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">div</span>&gt;</span>foo<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;</span></div></div>
<p>を期待するかもしれませんが、実際は少し異なる値が返ってきます。<br />
Chrome や Safari などの Webkit 系のブラウザであれば、</p>
<div class="codecolorer-container html4strict twitlight" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">p</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">div</span>&gt;</span>foo<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">p</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;</span></div></div>
<p>Firefox の場合は、</p>
<div class="codecolorer-container html4strict twitlight" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">p</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">div</span>&gt;</span>foo<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span></div></div>
<p>という HTML が取得されます。jQuery.html() の場合も同じ結果が得られます。</p>
<p>なぜこのようなことが起こるのでしょうか？不思議に思い、<a href="http://www.quora.com/Why-does-innerHTML-or-jQuery-html-return-a-different-value-for-different-browsers-when-used-with-this-markup">Quora</a> で質問を投げてみました。すると、すぐにどなたかが答えてくれました。（Quora すげー！）また、Twitter でも同様の質問を投げてみたところ、<a href="http://twitter.com/#!/hogenishi1122/status/43640487340556288">@hogenishi1122</a> さんが答えてくれました。（感謝！）</p>
<p>innerHTML や jQuery.html() は HTML のソースをそのまま返すわけではなく、ブラウザが一度 DOMツリーに変換したものを返すとのこと。従って、invalid な HTML コードだと、それぞれのブラウザが解釈したDOMツリーが返ってくるというわけでした。</p>
<p>invalid な HTML を書かなければ、さほど問題にはならないかもしれませんが、必ずしも世の中がすべて valid だとは限りません。記憶の片隅に留めておけば、無用な苦労をすることもないかと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://jmblog.jp/archives/876/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery 1.5 の Deferred オブジェクトについてのメモ</title>
		<link>http://jmblog.jp/archives/856</link>
		<comments>http://jmblog.jp/archives/856#comments</comments>
		<pubDate>Wed, 23 Feb 2011 17:13:17 +0000</pubDate>
		<dc:creator>Yoshihide</dc:creator>
				<category><![CDATA[web development]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://jmblog.jp/?p=856</guid>
		<description><![CDATA[jQuery 1.5 から Deferred オブジェクトというものがサポートされるようになりました。jQuery.ajax() も Deferred オブジェクトを拡張した jqXHR オブジェクトを返すようになったし、Deferred オブジェクトとは何か知っておいたほうが、何かと便利なのではないかと思ったので、調べたことをメモっていきます。（あまり理解出来ていないかもしれないので、誤りがあったらフィードバックをお願いします！）

deferred.done(), deferred.fail(), deferred.then() について
以下の3つは同じ処理になる。つまり、deferred.done() は成功時、deferred.fail() は失敗時のコールバック処理を実装する。また deferred.then() は第一引数に成功時のコールバック関数、第二引数に失敗時のコールバック関数を指定することができる。
$.get&#40;&#34;test.php&#34;&#41;
.success&#40;function&#40;&#41;&#123; console.log&#40;&#34;succeeded&#34;, arguments&#41;; &#125;&#41;
.error&#40;function&#40;&#41;&#123; console.log&#40;&#34;failed!&#34;, arguments&#41;; &#125;&#41;;
$.get&#40;&#34;test.php&#34;&#41;
.done&#40;function&#40;&#41;&#123; console.log&#40;&#34;succeeded&#34;, arguments&#41;; &#125;&#41;
.fail&#40;function&#40;&#41;&#123; console.log&#40;&#34;failed!&#34;, arguments&#41;; &#125;&#41;;
$.get&#40;&#34;test.php&#34;&#41;.then&#40;
&#160; &#160; function&#40;&#41;&#123; console.log&#40;&#34;succeeded&#34;, arguments&#41;; &#125;,
&#160; &#160; function&#40;&#41;&#123; console.log&#40;&#34;failed!&#34;, arguments&#41;; &#125;
&#41;;
jQuery.when() について
jQuery.when() は Deferred オブジェクトを返す。なので、
$.when&#40; ... &#41;.done&#40; ... &#41;.fail&#40; ... &#41;;
$.when&#40; ... &#41;.then&#40; function&#40;&#41; &#123; ... [...]]]></description>
			<content:encoded><![CDATA[<p>jQuery 1.5 から Deferred オブジェクトというものがサポートされるようになりました。jQuery.ajax() も Deferred オブジェクトを拡張した jqXHR オブジェクトを返すようになったし、Deferred オブジェクトとは何か知っておいたほうが、何かと便利なのではないかと思ったので、調べたことをメモっていきます。（あまり理解出来ていないかもしれないので、誤りがあったらフィードバックをお願いします！）<br />
<span id="more-856"></span></p>
<h3>deferred.done(), deferred.fail(), deferred.then() について</h3>
<p>以下の3つは同じ処理になる。つまり、deferred.done() は成功時、deferred.fail() は失敗時のコールバック処理を実装する。また deferred.then() は第一引数に成功時のコールバック関数、第二引数に失敗時のコールバック関数を指定することができる。</p>
<div class="codecolorer-container javascript twitlight" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$.<span style="color: #660066;">get</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;test.php&quot;</span><span style="color: #009900;">&#41;</span><br />
.<span style="color: #660066;">success</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;succeeded&quot;</span><span style="color: #339933;">,</span> arguments<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><br />
.<span style="color: #660066;">error</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;failed!&quot;</span><span style="color: #339933;">,</span> arguments<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<div class="codecolorer-container javascript twitlight" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$.<span style="color: #660066;">get</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;test.php&quot;</span><span style="color: #009900;">&#41;</span><br />
.<span style="color: #660066;">done</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;succeeded&quot;</span><span style="color: #339933;">,</span> arguments<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><br />
.<span style="color: #660066;">fail</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;failed!&quot;</span><span style="color: #339933;">,</span> arguments<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<div class="codecolorer-container javascript twitlight" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$.<span style="color: #660066;">get</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;test.php&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">then</span><span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;succeeded&quot;</span><span style="color: #339933;">,</span> arguments<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;failed!&quot;</span><span style="color: #339933;">,</span> arguments<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<h3>jQuery.when() について</h3>
<p>jQuery.when() は Deferred オブジェクトを返す。なので、</p>
<div class="codecolorer-container javascript twitlight" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$.<span style="color: #660066;">when</span><span style="color: #009900;">&#40;</span> ... <span style="color: #009900;">&#41;</span>.<span style="color: #660066;">done</span><span style="color: #009900;">&#40;</span> ... <span style="color: #009900;">&#41;</span>.<span style="color: #660066;">fail</span><span style="color: #009900;">&#40;</span> ... <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
$.<span style="color: #660066;">when</span><span style="color: #009900;">&#40;</span> ... <span style="color: #009900;">&#41;</span>.<span style="color: #660066;">then</span><span style="color: #009900;">&#40;</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> ... <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> ... <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>ってな感じで使う。</p>
<p>引数には、1つ以上の Deferred オブジェクト（jqXHR オブジェクトを含む）、もしくは JavaScript のプレーンなオブジェクトを指定できる。<br />
1つの Deferred オブジェクトを指定するのはあまり意味がないっぽい？<br />
複数の Deferred オブジェクトを引数に指定することで真価を発揮する。</p>
<div class="codecolorer-container javascript twitlight" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$.<span style="color: #660066;">when</span><span style="color: #009900;">&#40;</span> $.<span style="color: #660066;">ajax</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;/page1&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> $.<span style="color: #660066;">ajax</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;/page2&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> $.<span style="color: #660066;">ajax</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;/page3&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><br />
.<span style="color: #660066;">done</span> <span style="color: #009900;">&#40;</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span> res1<span style="color: #339933;">,</span> res2<span style="color: #339933;">,</span> res3 <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> ... <span style="color: #009900;">&#125;</span> <span style="color: #009900;">&#41;</span><br />
.<span style="color: #660066;">fail</span><span style="color: #009900;">&#40;</span> ... <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>このように、$.ajax() を複数指定すると、最初の $.ajax() が成功したら、次の $.ajax() を実施、と続き、すべての $.ajax() が成功したら done() に進む、という流れになる。どこかの $.ajax が error になったら、その先の $.ajax() は実行されず、即、fail() が実行される。res1, res2, res3 は $.when() の引数で指定した複数の $.ajax() の成功時の戻り値がそれぞれセットされる。ここでは、$.ajax() を例にしたが、Deferred オブジェクトを返す関数なんかを引数に指定することも当然可能。</p>
<p>（随時、更新予定&#8230;）</p>
]]></content:encoded>
			<wfw:commentRss>http://jmblog.jp/archives/856/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript を書く人は「JavaScriptパターン」必読だと思う</title>
		<link>http://jmblog.jp/archives/827</link>
		<comments>http://jmblog.jp/archives/827#comments</comments>
		<pubDate>Fri, 18 Feb 2011 05:26:16 +0000</pubDate>
		<dc:creator>Yoshihide</dc:creator>
				<category><![CDATA[web development]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://jmblog.jp/?p=827</guid>
		<description><![CDATA[JavaScript に触れるようになって早10数年。人に「JavaScript は書けますか？」と聞かれたら、とりあえず「書けます」とは答えていた私ですが、実はあまり自信がなく、いつも「これってスタンダードなコーディング記法なんだろうか？」「きれいなコードの書き方を知りたいなぁ・・・」と心のなかで思っていました。特に、最近になって node.js などサーバーサイドでも JavaScript が使われるようになってきたため、ここらへんで本格的にスキルアップをしておいたほうがいいんじゃないかと思うようになっていました。

そんな思いを見事に解消してくれる本が、オライリーから発売されました！
&#187; JavaScriptパターン ―優れたアプリケーションのための作法

帯には「JavaScriptはこう書け！」とあります。そう、まさに知りたかったのはそこなのですよ。
さっそく読んでみたのですが、「へー！知らなかった！」という新たな発見と、「あの書き方はこういうことだったのか！」と膝を打つことの連続で、一気に読んでしまいました。
はっきり言って、この本の内容を知らない人は「JavaScript書けます」って公言しちゃダメ、っていうぐらい、これまで漫然と JavaScript を書いてきた人にはかなりおすすめの本です。
例えば、次の質問にはっきりと答えられない人は今すぐ読んだほうがいいと思います！（ちなみに私は全部知りませんでした。）
/*
&#160; 【質問】console に出力される値は？
*/
var myname = &#34;global&#34;;
function func&#40;&#41; &#123;
&#160; &#160; console.log&#40;myname&#41;; &#160;// &#34;global&#34; ? &#34;local&#34; ? それとも・・・
&#160; &#160; var myname = 'local';
&#160; &#160; console.log&#40;myname&#41;;
&#125;
func&#40;&#41;;
/*
&#160;【質問】 func1 と func2 の違いは？
*/
var func1 = function &#40;&#41; &#123;
&#160; &#160; console.log&#40;'called'&#41;;
&#160; &#160; return 2 + 2;
&#125;

var func2 = &#40;function &#40;&#41; &#123;
&#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>JavaScript に触れるようになって早10数年。人に「JavaScript は書けますか？」と聞かれたら、とりあえず「書けます」とは答えていた私ですが、実はあまり自信がなく、いつも「これってスタンダードなコーディング記法なんだろうか？」「きれいなコードの書き方を知りたいなぁ・・・」と心のなかで思っていました。特に、最近になって node.js などサーバーサイドでも JavaScript が使われるようになってきたため、ここらへんで本格的にスキルアップをしておいたほうがいいんじゃないかと思うようになっていました。<br />
<span id="more-827"></span></p>
<p>そんな思いを見事に解消してくれる本が、オライリーから発売されました！</p>
<p>&raquo; <a href="http://www.amazon.co.jp/gp/product/4873114888?ie=UTF8&#038;tag=0755-22&#038;linkCode=as2&#038;camp=247&#038;creative=7399&#038;creativeASIN=4873114888">JavaScriptパターン ―優れたアプリケーションのための作法</a><img src="http://www.assoc-amazon.jp/e/ir?t=0755-22&#038;l=as2&#038;o=9&#038;a=4873114888" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
<p><a href="http://www.amazon.co.jp/gp/product/4873114888?ie=UTF8&#038;tag=0755-22&#038;linkCode=as2&#038;camp=247&#038;creative=7399&#038;creativeASIN=4873114888"><img src="http://ecx.images-amazon.com/images/I/51ZoMJ%2BrLhL._SL160_.jpg" border="0" /></a></p>
<p>帯には「JavaScriptはこう書け！」とあります。そう、まさに知りたかったのはそこなのですよ。</p>
<p>さっそく読んでみたのですが、「へー！知らなかった！」という新たな発見と、「あの書き方はこういうことだったのか！」と膝を打つことの連続で、一気に読んでしまいました。</p>
<p>はっきり言って、この本の内容を知らない人は「JavaScript書けます」って公言しちゃダメ、っていうぐらい、これまで漫然と JavaScript を書いてきた人にはかなりおすすめの本です。</p>
<p>例えば、次の質問にはっきりと答えられない人は今すぐ読んだほうがいいと思います！（ちなみに私は全部知りませんでした。）</p>
<div class="codecolorer-container javascript twitlight" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #006600; font-style: italic;">/*<br />
&nbsp; 【質問】console に出力される値は？<br />
*/</span><br />
<span style="color: #003366; font-weight: bold;">var</span> myname <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;global&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #003366; font-weight: bold;">function</span> func<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>myname<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> &nbsp;<span style="color: #006600; font-style: italic;">// &quot;global&quot; ? &quot;local&quot; ? それとも・・・</span><br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> myname <span style="color: #339933;">=</span> <span style="color: #3366CC;">'local'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>myname<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
func<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<div class="codecolorer-container javascript twitlight" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #006600; font-style: italic;">/*<br />
&nbsp;【質問】 func1 と func2 の違いは？<br />
*/</span><br />
<span style="color: #003366; font-weight: bold;">var</span> func1 <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'called'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span> 2 <span style="color: #339933;">+</span> <span style="color: #CC0000;">2</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #003366; font-weight: bold;">var</span> func2 <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'called'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span> 2 <span style="color: #339933;">+</span> <span style="color: #CC0000;">2</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<div class="codecolorer-container javascript twitlight" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #006600; font-style: italic;">/*<br />
&nbsp;【質問】 (1) と (2) の違いは？<br />
*/</span><br />
<span style="color: #003366; font-weight: bold;">function</span> myFunc<span style="color: #009900;">&#40;</span>callback<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;1&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; callback<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;3&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #003366; font-weight: bold;">function</span> myCallback<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;2&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
myFunc<span style="color: #009900;">&#40;</span>myCallback<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// ... (1)</span><br />
myFunc<span style="color: #009900;">&#40;</span>myCallback<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// ... (2)</span></div></div>
<div class="codecolorer-container javascript twitlight" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #006600; font-style: italic;">/*<br />
&nbsp;【質問】jQuery でよく見るこのコード、どういう構文かわかる？<br />
*/</span><br />
<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">// ...</span><br />
<br />
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>jQuery<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p><a href="http://www.amazon.co.jp/gp/product/4873113911?ie=UTF8&#038;tag=0755-22&#038;linkCode=as2&#038;camp=247&#038;creative=7399&#038;creativeASIN=4873113911">JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス</a><img src="http://www.assoc-amazon.jp/e/ir?t=0755-22&#038;l=as2&#038;o=9&#038;a=4873113911" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> もあわせて読むと JavaScript のレベルがさらにアップすること間違いなし！</p>
]]></content:encoded>
			<wfw:commentRss>http://jmblog.jp/archives/827/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>preventDefault() と stopPropagation()</title>
		<link>http://jmblog.jp/archives/169</link>
		<comments>http://jmblog.jp/archives/169#comments</comments>
		<pubDate>Thu, 24 May 2007 16:11:09 +0000</pubDate>
		<dc:creator>Yoshihide</dc:creator>
				<category><![CDATA[web development]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://jmblog.jp/archives/169</guid>
		<description><![CDATA[先日公開した「投稿スラッグ（Post slug）が空白なら警告してくれるWordPress用Greasemonkeyスクリプト」を開発しているときに、JavaScriptでのイベントのキャンセルまわりで見事にハマってしまいました。そのときに調べてわかったことをまとめてみようと思います。（間違いがあれば是非ご指摘ください！）

やりたかったこと
WordPressの投稿画面で「公開（Publish）」ボタンをクリックしたときに、「投稿スラッグ（Post slug）」のテキストボックスに値が入っていなければ、確認ダイアログを出す。そこで「キャンセル」ボタンが押されたら、フォームの submit を中止する。

最初に思いついた方法
まず頭に浮かんだのは、submit ボタンに対して HTML でイベントハンドラを記述するという、とても古典的な方法でした。
&#60;input name=&#34;publish&#34; type=&#34;submit&#34; id=&#34;publish&#34; tabindex=&#34;5&#34; accesskey=&#34;p&#34; value=&#34;公開&#34; onClick=&#34;return CheckPostSlug();&#34; /&#62;
&#60;script type=&#34;text/javascript&#34;&#62;
function CheckPostSlug() {
&#160; &#160; if (document.forms[0].post_name.value == '') {
&#160; &#160; &#160; &#160; return confirm(&#34;WARNING!\n\n&#34; + &#34;Post slug is blank. Are you OK?\n&#34;);
&#160; &#160; }
}
&#60;/script&#62;
しかし、今回開発するのは Greasemonkey スクリプトです。直接 HTML を書き換えるわけにはいきません。DOM 操作で無理やりできないことはないかも知れませんが、あまりにもダサい。もっとスマートな方法を探ってみました。
submit がキャンセルできない・・・
まずは、
addEventListener()
メソッドを使って次のように書いてみました。
$&#40;'publish'&#41;.addEventListener&#40;'click', function&#40;&#41; &#123;
&#160; &#160; if &#40;$&#40;'post_name'&#41;.value == ''&#41; &#123;
&#160; [...]]]></description>
			<content:encoded><![CDATA[<p>先日公開した「<a href="http://jmblog.jp/archives/167">投稿スラッグ（Post slug）が空白なら警告してくれるWordPress用Greasemonkeyスクリプト</a>」を開発しているときに、<strong>JavaScriptでのイベントのキャンセルまわり</strong>で見事にハマってしまいました。そのときに調べてわかったことをまとめてみようと思います。（間違いがあれば是非ご指摘ください！）</p>
<p><span id="more-169"></span></p>
<h4>やりたかったこと</h4>
<p>WordPressの投稿画面で「公開（Publish）」ボタンをクリックしたときに、「投稿スラッグ（Post slug）」のテキストボックスに値が入っていなければ、確認ダイアログを出す。そこで「キャンセル」ボタンが押されたら、フォームの submit を中止する。</p>
<p><img src='http://jmblog.jp/wp-content/uploads/2007/05/wordpress-post-page.png' alt='Screenshot of WordPress Post Page' /></p>
<h4>最初に思いついた方法</h4>
<p>まず頭に浮かんだのは、submit ボタンに対して HTML でイベントハンドラを記述するという、とても古典的な方法でした。</p>
<div class="codecolorer-container html4strict twitlight" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;publish&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;submit&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;publish&quot;</span> <span style="color: #000066;">tabindex</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;5&quot;</span> <span style="color: #000066;">accesskey</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;p&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;公開&quot;</span> <span style="color: #000066;">onClick</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;return CheckPostSlug();&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span>&gt;</span><br />
function CheckPostSlug() {<br />
&nbsp; &nbsp; if (document.forms[0].post_name.value == '') {<br />
&nbsp; &nbsp; &nbsp; &nbsp; return confirm(&quot;WARNING!\n\n&quot; + &quot;Post slug is blank. Are you OK?\n&quot;);<br />
&nbsp; &nbsp; }<br />
}<br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span></div></div>
<p>しかし、今回開発するのは Greasemonkey スクリプトです。直接 HTML を書き換えるわけにはいきません。DOM 操作で無理やりできないことはないかも知れませんが、あまりにもダサい。もっとスマートな方法を探ってみました。</p>
<h4>submit がキャンセルできない・・・</h4>
<p>まずは、</p>
<div class="codecolorer-container text twitlight" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">addEventListener()</div></div>
<p>メソッドを使って次のように書いてみました。</p>
<div class="codecolorer-container javascript twitlight" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'publish'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'click'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'post_name'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">value</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">''</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000066;">confirm</span><span style="color: #009900;">&#40;</span>msg<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">// eventをキャンセル（してるつもり）</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #003366; font-weight: bold;">function</span> $<span style="color: #009900;">&#40;</span>id<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span>id<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>しかし、この方法ではうまくいきませんでした。（何度テスト用のエントリを投稿したことか・・・）いろいろ試してみたところ、clickイベントはキャンセルできているのですが、フォームのsubmitイベントがキャンセルできていないようです。では、submit 時のイベントをなくしてしまえということで、</p>
<div class="codecolorer-container javascript twitlight" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'publish'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'click'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'post_name'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">value</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">''</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000066;">confirm</span><span style="color: #009900;">&#40;</span>msg<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">// submit を無効に（してるつもり）</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'post'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">onsubmit</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>としたかったのですが、これは Greasemonkey のセキュリティ的な制限でできません。むむ・・・</p>
<h4>Event.stopPropagation() ?</h4>
<p>行き詰って <a href="http://www.amazon.co.jp/gp/redirect.html%3FASIN=0596101651%26tag=0755-22%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0596101651%253FSubscriptionId=1891KXW6NA8HCFV6PFR2" target="_blank">Greasemonkey Hacks</a> に載っているサンプルをあれこれ眺めていると、</p>
<div class="codecolorer-container text twitlight" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Event.stopPropagation()</div></div>
<p>というメソッドを見つけました。Google で調べてみたところ、</p>
<blockquote>
<p>stopPropagation メソッドは、イベントフローにおいてこれ以上イベントが伝えられるのを止めるために使用します。</p>
<p><cite><a href="http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/plugin/dom/org/w3c/dom/events/Event.html" target="_blank">Event (共通 DOM API)</a></cite></p>
</blockquote>
<p>とあります。おぉ、これかぁと思ったのですが、これもダメ。むむむむ・・・</p>
<h4>Event.preventDefault() !!</h4>
<p>結局、</p>
<div class="codecolorer-container text twitlight" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Event.preventDefault()</div></div>
<p>を使えばうまくいったのでした。</p>
<div class="codecolorer-container javascript twitlight" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'publish'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'click'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'post_name'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">value</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">''</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000066;">confirm</span><span style="color: #009900;">&#40;</span>msg<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">// click も submit もキャンセルできた！</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.<span style="color: #660066;">preventDefault</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p><div class="codecolorer-container text twitlight" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">preventDefault()</div></div>
<p>について調べてみると、</p>
<blockquote>
<p>preventDefault メソッドを使用するとイベントのキャンセルを通知できるため、そのイベントの結果として通常は実装により実行されるデフォルトのアクションが実行されません。</p>
<p><cite><a href="http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/plugin/dom/org/w3c/dom/events/Event.html#preventDefault()"  target="_blank">Event (共通 DOM API)</a></cite></p>
</blockquote>
<p>とあります。サブミットボタンの click イベントのあとには、フォームの submit イベントがデフォルトのアクションとして実装されているようなので、今回はこのメソッドが正解だったようです。</p>
<p>では、</p>
<div class="codecolorer-container text twitlight" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">stopPropagation()</div></div>
<p>は何だったのでしょう？これを理解するには、まず<strong>イベント伝播</strong> (event propagation) という概念を理解する必要があります。</p>
<h4>イベント伝播</h4>
<p>私も完全に理解しているわけではないのですが、誤りを恐れずにざっくりと説明すると（<a href="http://www.amazon.co.jp/gp/redirect.html%3FASIN=4873110270%26tag=0755-22%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/4873110270%253FSubscriptionId=1891KXW6NA8HCFV6PFR2" target="_blank">JavaScript本</a>を参考にしたのでたぶんあってるはず）、例えば、フォームのあるボタンをクリックしたとき、実は、</p>
<ol>
<li>
<p>まず、最上位である Window オブジェクトの Click イベントが発生。<br />
ここで例えば</p>
<div class="codecolorer-container text twitlight" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">window.onclick = function() { alert('window was clicked'); }</div></div>
<p>などと定義しているとアラートが表示される。</p>
</li>
<li>
<p>次に、その下位（例えばForm オブジェクト）の Click イベントが発生。<br />
ここで例えば</p>
<div class="codecolorer-container text twitlight" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">document.forms[0].onclick = function() { alert('form was clicked'); }</div></div>
<p>などと定義しているとアラートが表示される。</p>
</li>
<li>最後に、クリックした Button オブジェクトの Click イベントが発生。</li>
</ol>
<p>ということが起こっているのです。これが「<strong>イベント伝播</strong>」です。しかし、これは Firefox や Opera に限った話で、Internet Explorer の場合は、イベントの伝わり方が逆になります。つまり、</p>
<ol>
<li>まず、クリックした Button オブジェクトの Click イベントが発生。</li>
<li>次に、その上位（例えばForm オブジェクト）の Click イベントが発生。</li>
<li>最後に、最上位である Window オブジェクトの Click イベントが発生。</li>
</ol>
<p>となります。Firefox や Opera のように「<strong>上から下に</strong>」伝わっていくのを「<strong>イベントキャプチャリング方式</strong>」といい、IE のように「<strong>下から上に</strong>」伝わっていくのを「<strong>イベントバブリング方式</strong>」と言います。「バブリング」は「泡（バブル）」なので、下から上に伝わっていくと覚えればよいかと思います。IE なんて泡のように消えてし（ry </p>
<p>さきほどうまくいかなかった</p>
<div class="codecolorer-container text twitlight" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">stopPropagation()</div></div>
<p>は、このイベント伝播を途中で止めるときに利用するメソッドなのです。</p>
<div class="ins">
<ins datetime="2010-05-17T12:51:40+00:00"></p>
<p class="ins-title">[追記 2010-05-17]</p>
<p>はてブのコメントにて「addEventListenerの第3引数に false を指定すれば「イベントバブリング方式」で動作する」との情報をいただきましたので、追記しておきます。</p>
<p></ins>
</div>
<h4>IE でのイベントキャンセル</h4>
<p>なお、IE は</p>
<div class="codecolorer-container text twitlight" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Event.preventDefault()</div></div>
<p>と</p>
<div class="codecolorer-container text twitlight" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Event.stopPropagation()</div></div>
<p>に対応していません。その代わりに、グローバル変数 event のプロパティである returnValue と cancelBubble を使います。</p>
<table>
<tr>
<td>Firefox, Opera</td>
<td>Event.preventDefault();</td>
</tr>
<tr>
<td>IE</td>
<td>event.returnValue = false;</td>
</tr>
</table>
<table>
<tr>
<td>Firefox, Opera</td>
<td>Event.stopPropagation();</td>
</tr>
<tr>
<td>IE</td>
<td>event.cancelBubble = true;</td>
</tr>
</table>
<h4>まとめ</h4>
<p>イベント伝播が理解できれば効率のよいコードを書くことができます。例えば、「プルダウンリストの中をマウスホイールで知らずに変えちゃうことがあるので、すべてのプルダウンリストでマウスホイールが効かないようにしてほしい」という要望がユーザーからあったとします。（実際あったんですが。）この場合、すべての select 要素にイベントハンドラを定義していくとえらい大変ですが、</p>
<div class="codecolorer-container javascript twitlight" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">function</span> preventWheel<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; document.<span style="color: #660066;">onmousewheel</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> target_elm <span style="color: #339933;">=</span> event.<span style="color: #660066;">srcElement</span> <span style="color: #339933;">?</span> event.<span style="color: #660066;">srcElement</span> <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>target_elm <span style="color: #339933;">&amp;&amp;</span> target_elm.<span style="color: #660066;">tagName</span> <span style="color: #339933;">&amp;&amp;</span> target_elm.<span style="color: #660066;">tagName</span>.<span style="color: #660066;">toLowerCase</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">'select'</span> <span style="color: #339933;">&amp;&amp;</span> target_elm.<span style="color: #660066;">size</span> <span style="color: #339933;">&lt;=</span> 1<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; event.<span style="color: #660066;">returnValue</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; event.<span style="color: #660066;">cancelBubble</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>というふうに、上位の document オブジェクトで、伝播されてくるすべてのイベントを監視して、イベントの発生元が select 要素だったらキャンセルする、と書くことができるのです。ね、便利でしょ？</p>
<p>イベントまわりは、ブラウザごとに仕様が異なるせいもあり、よくわかっていないとはまりますが、使いこなせるようになれば、かなり強力な武器になり得ると思うので、しっかり見につけたいと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://jmblog.jp/archives/169/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>TinyURLのリンク先を取得するAPI</title>
		<link>http://jmblog.jp/archives/131</link>
		<comments>http://jmblog.jp/archives/131#comments</comments>
		<pubDate>Sun, 29 Apr 2007 14:08:08 +0000</pubDate>
		<dc:creator>Yoshihide</dc:creator>
				<category><![CDATA[web development]]></category>
		<category><![CDATA[greasemonkey]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://jmblog.jp/archives/131</guid>
		<description><![CDATA[Twitter 用に TinyURL のリダイレクト先URLを取得する Greasemonkey スクリプトを作ったんですが、すでに同じものを作っておられる方がいたので、公開はこっそりと行うこととして、このエントリでは、このGreasemonkey スクリプトを作るときに見つけた、TinyURL のリンク先を取得する API をご紹介。

&#187; TinyURL Callback API
使い方はカンタン。
http://remysharp.com/tinyurlapi?callback=CallbackFunc&#38;url=http://tinyurl.com/2acavb

というふうに、コールバック関数名とTinyURLを渡すだけ。すると、
CallbackFunc&#40;&#34;http://jmblog.jp/download/tinyurl_restorer.user.js&#34;&#41;;
というふうにリンク先のURLがコールバック関数と共に返ってくるので、
var orginal_url;
function CallbackFunc&#40;url&#41; &#123;
&#160; &#160; original_url = url;
&#125;
という感じに、事前に定義しておいたコールバック関数で受け取ればOK。
しかし、どうしてこの手の API を TinyURL.com が公開していないのか不思議です・・・ニーズはいっぱいあるのにね。
]]></description>
			<content:encoded><![CDATA[<p>Twitter 用に TinyURL のリダイレクト先URLを取得する Greasemonkey スクリプトを作ったんですが、<a href="http://d.hatena.ne.jp/ono_matope/20070428#1177790750" target="_blank">すでに同じものを作っておられる方がいた</a>ので、公開は<a href="http://jmblog.jp/download/tinyurl_restorer.user.js">こっそりと</a>行うこととして、このエントリでは、このGreasemonkey スクリプトを作るときに見つけた、TinyURL のリンク先を取得する API をご紹介。</p>
<p><span id="more-131"></span></p>
<p>&raquo; <a href="http://remysharp.com/tinyurlapi" target="_blank"><strong>TinyURL Callback API</strong></a></p>
<p>使い方はカンタン。</p>
<p><div class="codecolorer-container text twitlight" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">http://remysharp.com/tinyurlapi?callback=CallbackFunc&amp;url=http://tinyurl.com/2acavb</div></div>
</p>
<p>というふうに、コールバック関数名とTinyURLを渡すだけ。すると、</p>
<div class="codecolorer-container javascript twitlight" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">CallbackFunc<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;http://jmblog.jp/download/tinyurl_restorer.user.js&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>というふうにリンク先のURLがコールバック関数と共に返ってくるので、</p>
<div class="codecolorer-container javascript twitlight" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> orginal_url<span style="color: #339933;">;</span><br />
<span style="color: #003366; font-weight: bold;">function</span> CallbackFunc<span style="color: #009900;">&#40;</span>url<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; original_url <span style="color: #339933;">=</span> url<span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>という感じに、事前に定義しておいたコールバック関数で受け取ればOK。</p>
<p>しかし、どうしてこの手の API を TinyURL.com が公開していないのか不思議です・・・ニーズはいっぱいあるのにね。</p>
]]></content:encoded>
			<wfw:commentRss>http://jmblog.jp/archives/131/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

