<?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>Mon, 05 Jul 2010 05:02:13 +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>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[webdev]]></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 blackboard" 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 blackboard" 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 blackboard" 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 blackboard" 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 blackboard" 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 blackboard" 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 blackboard" 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 blackboard" 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 blackboard" 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 blackboard" 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 blackboard" 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 blackboard" 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 blackboard" 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 blackboard" 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 blackboard" 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[webdev]]></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 blackboard" 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 blackboard" 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 blackboard" 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>
		<item>
		<title>Lightbox JS v2.0 shortcut keys add-on</title>
		<link>http://jmblog.jp/archives/116</link>
		<comments>http://jmblog.jp/archives/116#comments</comments>
		<pubDate>Sat, 10 Feb 2007 16:42:44 +0000</pubDate>
		<dc:creator>Yoshihide</dc:creator>
				<category><![CDATA[webdev]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Lightbox]]></category>

		<guid isPermaLink="false">http://jmblog.jp/archives/116</guid>
		<description><![CDATA[

[追記 2007-04-12]
Lightbox 2 が v2.03 にバージョンアップして、キーボードショートカットの機能が改善されました。右カーソル、左カーソルでの移動が可能になり、Escキーで閉じることができるようになっています。ということで、このスクリプトは無用の長物と相成りました・・・


Lightbox JS v2.0 という画像をかっこよく表示させる有名なスクリプトがあります。複数の画像を「Image Set」として用意するとスライドショーが作成され、キーボードで前後に移動することができるのですが、nキーとpキーでしか移動できないので、あまり感覚的ではありません。そこで、カーソルキーでも移動できるようにしてユーザビリティを向上させるスクリプトを作成してみました。

Lightbox JS v2.0 shortcut keys add-on
&#187;sample
使い方はカンタン。Lightbox JS v2.0 のスクリプトのあとに読み込むだけです。

&#38;lt;script&#38;nbsp;type=&#38;quot;text/javascript&#38;quot;&#38;nbsp;src=&#38;quot;js/prototype.js&#38;quot;&#38;gt;&#38;lt;/script&#38;gt;
&#38;lt;script&#38;nbsp;type=&#38;quot;text/javascript&#38;quot;&#38;nbsp;src=&#38;quot;js/scriptaculous.js?load=effects&#38;quot;&#38;gt;&#38;lt;/script&#38;gt;
&#38;lt;script&#38;nbsp;type=&#38;quot;text/javascript&#38;quot;&#38;nbsp;src=&#38;quot;js/lightbox.js&#38;quot;&#38;gt;&#38;lt;/script&#38;gt;
&#60;strong&#62;&#38;lt;script&#38;nbsp;type=&#38;quot;text/javascript&#38;quot;&#38;nbsp;src=&#38;quot;js/lightbox_shortcut_keys_addon.js&#38;quot;&#38;gt;&#38;lt;/script&#38;gt;&#60;/strong&#62;

これで、以下のショートカットキーが使えるようになります。

次の画像へ&#160;&#160;nキー、→（右カーソル）、↓（下カーソル）
前の画像へ&#160;&#160;pキー、←（左カーソル）、↑（上カーソル）
閉じる&#160;&#160;xキー、oキー、cキー、Escキー

ちなみに開発のきっかけは、playback.js です。これを使ったプレゼンテーション資料がカーソルキーで移動できてすごく便利だったので作ってみました。
なお、不具合などあれば、お手数ですがご報告ください。よろしくお願いします。
]]></description>
			<content:encoded><![CDATA[<div class="ins">
<ins date="2007-04-12"></p>
<p class="ins-title">[追記 2007-04-12]</p>
<p><a href="http://www.huddletogether.com/projects/lightbox2/" target="_blank">Lightbox 2</a> が v2.03 にバージョンアップして、キーボードショートカットの機能が改善されました。右カーソル、左カーソルでの移動が可能になり、Escキーで閉じることができるようになっています。ということで、このスクリプトは無用の長物と相成りました・・・</p>
<p></ins>
</div>
<p><a href="http://www.huddletogether.com/projects/lightbox2/" target="_blank">Lightbox JS v2.0</a> という画像をかっこよく表示させる有名なスクリプトがあります。複数の画像を「Image Set」として用意するとスライドショーが作成され、キーボードで前後に移動することができるのですが、nキーとpキーでしか移動できないので、あまり感覚的ではありません。そこで、カーソルキーでも移動できるようにしてユーザビリティを向上させるスクリプトを作成してみました。</p>
<p><span id="more-116"></span></p>
<p><a  class="download" href="http://jmblog.jp/download/lightbox_shortcut_keys_addon.js">Lightbox JS v2.0 shortcut keys add-on</a></p>
<p>&raquo;<a href="/sample/lightbox/" target="_blank">sample</a></p>
<p>使い方はカンタン。Lightbox JS v2.0 のスクリプトのあとに読み込むだけです。</p>
<pre>
<div class="codecolorer-container text blackboard" 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">&amp;lt;script&amp;nbsp;type=&amp;quot;text/javascript&amp;quot;&amp;nbsp;src=&amp;quot;js/prototype.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;<br />
&amp;lt;script&amp;nbsp;type=&amp;quot;text/javascript&amp;quot;&amp;nbsp;src=&amp;quot;js/scriptaculous.js?load=effects&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;<br />
&amp;lt;script&amp;nbsp;type=&amp;quot;text/javascript&amp;quot;&amp;nbsp;src=&amp;quot;js/lightbox.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;<br />
&lt;strong&gt;&amp;lt;script&amp;nbsp;type=&amp;quot;text/javascript&amp;quot;&amp;nbsp;src=&amp;quot;js/lightbox_shortcut_keys_addon.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/strong&gt;</div></div>
</pre>
<p>これで、以下のショートカットキーが使えるようになります。</p>
<ul>
<li><strong>次の画像へ</strong>&nbsp;&nbsp;nキー、→（右カーソル）、↓（下カーソル）</li>
<li><strong>前の画像へ</strong>&nbsp;&nbsp;pキー、←（左カーソル）、↑（上カーソル）</li>
<li><strong>閉じる</strong>&nbsp;&nbsp;xキー、oキー、cキー、Escキー</li>
</ul>
<p>ちなみに開発のきっかけは、<a href="http://f-shin.net/labs/2006/10/playbackjs.html" target="_blank">playback.js</a> です。これを使ったプレゼンテーション資料がカーソルキーで移動できてすごく便利だったので作ってみました。</p>
<p>なお、不具合などあれば、お手数ですがご報告ください。よろしくお願いします。</p>
]]></content:encoded>
			<wfw:commentRss>http://jmblog.jp/archives/116/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>角丸にチャレンジ &#8211; JavaScript番外編</title>
		<link>http://jmblog.jp/archives/98</link>
		<comments>http://jmblog.jp/archives/98#comments</comments>
		<pubDate>Mon, 21 Aug 2006 13:15:13 +0000</pubDate>
		<dc:creator>Yoshihide</dc:creator>
				<category><![CDATA[webdesign, design]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[角丸]]></category>

		<guid isPermaLink="false">http://jmblog.jp/archives/98</guid>
		<description><![CDATA[Amazon から「インスタントストア」というサービスがはじまりました。Amazon のアソシエイトIDがあれば、独自のオンラインストアを簡単に作成できてしまうという代物です。

で、本題は「インスタントストア」ではなくここで使われている角丸です。HTMLコードを見るとあの Nifty Corners ではありませんか！これは実績十分ですねー。
というわけで、私のインスタントストアです。（いや、これが本題ではなく。）
&#187; jmblog.jp おすすめの9冊
]]></description>
			<content:encoded><![CDATA[<p>Amazon から「インスタントストア」というサービスがはじまりました。Amazon のアソシエイトIDがあれば、独自のオンラインストアを簡単に作成できてしまうという代物です。</p>
<p><span id="more-98"></span></p>
<p>で、本題は「インスタントストア」ではなくここで使われている角丸です。HTMLコードを見るとあの <strong><a href="http://www.html.it/articoli/niftycube/index.html">Nifty Corners</a></strong> ではありませんか！これは実績十分ですねー。</p>
<p>というわけで、私のインスタントストアです。（いや、これが本題ではなく。）</p>
<p>&raquo; <a href="http://astore.amazon.co.jp/0755-22" target="_blank">jmblog.jp おすすめの9冊</a></p>
]]></content:encoded>
			<wfw:commentRss>http://jmblog.jp/archives/98/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>角丸にチャレンジ &#8211; JavaScript編</title>
		<link>http://jmblog.jp/archives/96</link>
		<comments>http://jmblog.jp/archives/96#comments</comments>
		<pubDate>Fri, 18 Aug 2006 16:52:27 +0000</pubDate>
		<dc:creator>Yoshihide</dc:creator>
				<category><![CDATA[webdesign, design]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[角丸]]></category>

		<guid isPermaLink="false">http://jmblog.jp/archives/96</guid>
		<description><![CDATA[今回は、画像を使わずに JavaScript だけで角丸を実現させる方法を紹介します。

角丸を表示するための JavaScript ライブラリは数多く存在します。その中からいくつかピックアップしてみました。
&#187; Nifty Corners Cube
有名な Nifty Corners の最新バージョンです。恐らく、これが角丸用ライブラリの元祖じゃないでしょうか。初めて見たときは、「こんなことが画像なしでできてしまうのかー！」とびっくりしました。まだご存じない方も、サンプルを見ればきっと驚くはず。使い方もすごくシンプルです。どういう仕組みになっているかは、最初のバージョンのページに詳しく解説があります。
&#187; curvyCorners
アンチエイリアスが売りのライブラリ。背景に画像があってもきれいに見えます。（デモ）
&#187; Mochikit
Ajax なエフェクトや UI を実現させるための JavaScript ライブラリとして有名な Mochikit ですが、角丸にも対応しています。実装方法もかなり洗練されている感じ。JavaScript に通じた人ならこれが一番使いやすいかもしれないですね。（デモ）
&#187; Rico
Mochikit と同様、こちらも有名な JavaScript ライブラリです。角丸のみ使う場合は、Encytemedia: Rico rounded corners without all of Rico で公開されているスクリプトを使うとよいでしょう。
&#187; Spiffy Corners
こちらは JavaScript のライブラリではなく、角丸のジェネレーターです。クラス名、背景色、前景色を指定すれば、CSS と HTML を生成してくれます。（やってることは他とほぼ同じ。）JavaScript が苦手な人はこれが一番お手軽かも。
まだまだたくさんありますので、気になる方は、
del.icio.us/tag/rounded+corners+javascript あたりで探してみてはいかがでしょうか？
]]></description>
			<content:encoded><![CDATA[<p>今回は、画像を使わずに JavaScript だけで角丸を実現させる方法を紹介します。</p>
<p><span id="more-96"></span></p>
<p>角丸を表示するための JavaScript ライブラリは数多く存在します。その中からいくつかピックアップしてみました。</p>
<h3>&raquo; <a href="http://www.html.it/articoli/niftycube/index.html" target="_blank">Nifty Corners Cube</a></h3>
<p>有名な Nifty Corners の最新バージョンです。恐らく、これが角丸用ライブラリの元祖じゃないでしょうか。初めて見たときは、「こんなことが画像なしでできてしまうのかー！」とびっくりしました。まだご存じない方も、<a href="http://www.html.it/articoli/niftycube/nifty12.html" target="_blank">サンプル</a>を見ればきっと驚くはず。使い方もすごくシンプルです。どういう仕組みになっているかは、<a href="http://www.html.it/articoli/nifty/index.html" target="_blank">最初のバージョンのページ</a>に詳しく解説があります。</p>
<h3>&raquo; <a href="http://www.curvycorners.net/index.php" target="_blank">curvyCorners</a></h3>
<p>アンチエイリアスが売りのライブラリ。背景に画像があってもきれいに見えます。（<a href="http://www.curvycorners.net/examples/demos/demo.html" target="_blank">デモ</a>）</p>
<h3>&raquo; <a href="http://mochikit.com/" target="_blank">Mochikit</a></h3>
<p>Ajax なエフェクトや UI を実現させるための JavaScript ライブラリとして有名な Mochikit ですが、角丸にも対応しています。実装方法もかなり洗練されている感じ。JavaScript に通じた人ならこれが一番使いやすいかもしれないですね。（<a href="http://mochikit.com/examples/rounded_corners/index.html" target="_blank">デモ</a>）</p>
<h3>&raquo; <a href="http://openrico.org/rico/demos.page?demo=rico_corner" target="_blank">Rico</a></h3>
<p>Mochikit と同様、こちらも有名な JavaScript ライブラリです。角丸のみ使う場合は、<a href="http://encytemedia.com/blog/articles/2005/12/01/rico-rounded-corners-without-all-of-rico" target="_blank">Encytemedia: Rico rounded corners without all of Rico</a> で公開されているスクリプトを使うとよいでしょう。</p>
<h3>&raquo; <a href="http://www.spiffycorners.com/" target="_blank">Spiffy Corners</a></h3>
<p>こちらは JavaScript のライブラリではなく、角丸のジェネレーターです。クラス名、背景色、前景色を指定すれば、CSS と HTML を生成してくれます。（やってることは他とほぼ同じ。）JavaScript が苦手な人はこれが一番お手軽かも。</p>
<p style="margin-top:1.5em;">まだまだたくさんありますので、気になる方は、<br />
<a href="http://del.icio.us/tag/rounded%2Bcorners%2Bjavascript" target="_blank">del.icio.us/tag/rounded+corners+javascript</a> あたりで探してみてはいかがでしょうか？</p>
]]></content:encoded>
			<wfw:commentRss>http://jmblog.jp/archives/96/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
