<?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>Screw-Axis &#187; Javascript</title>
	<atom:link href="http://screw-axis.com/category/tips/javascript-tips/feed/" rel="self" type="application/rss+xml" />
	<link>http://screw-axis.com</link>
	<description>flexible, elastic and principled.</description>
	<lastBuildDate>Tue, 31 Jan 2012 02:09:44 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>[jQuery Mobile] 日本語リファレンス1.0に更新</title>
		<link>http://screw-axis.com/2011/12/19/jquery-mobile-1-0-reference/</link>
		<comments>http://screw-axis.com/2011/12/19/jquery-mobile-1-0-reference/#comments</comments>
		<pubDate>Mon, 19 Dec 2011 01:45:26 +0000</pubDate>
		<dc:creator>nao58</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery Mobile]]></category>

		<guid isPermaLink="false">http://screw-axis.com/?p=947</guid>
		<description><![CDATA[かなり更新を怠けていたjQuery Mobile日本語リファレンスですが、正式版がリリースされたのを機に一気にリニューアルしました(とはいえ、デザイン的にはむしろ独自部分を減らして公式の丸コピにしたイメージですが)。 j [...]
Related posts:<ol>
<li><a href='http://screw-axis.com/2012/01/27/jquery-mobile-1-0-1/' rel='bookmark' title='[jQuery Mobile] 1.0.1公開'>[jQuery Mobile] 1.0.1公開</a></li>
<li><a href='http://screw-axis.com/2011/12/22/jquery-mobile-cheat-sheet/' rel='bookmark' title='[jQuery Mobile] チートシートつくりました'>[jQuery Mobile] チートシートつくりました</a></li>
<li><a href='http://screw-axis.com/2012/01/20/jquery-mobile-pageevent-cheatsheet/' rel='bookmark' title='[jQuery Mobile] ページイベント・チートシート'>[jQuery Mobile] ページイベント・チートシート</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://screw-axis.com/wp-content/uploads/2011/04/jquery-logo.jpg" alt="" title="jQuery mobile" width="240" height="150" class="alignright size-full wp-image-912" style="padding-left: 10px;" />かなり更新を怠けていたjQuery Mobile日本語リファレンスですが、正式版がリリースされたのを機に一気にリニューアルしました(とはいえ、デザイン的にはむしろ独自部分を減らして公式の丸コピにしたイメージですが)。</p>
<p><a href="http://dev.screw-axis.com/doc/jquery_mobile/">jQuery Mobile 1.0 日本語リファレンス</a></p>
<p>アルファ版からは当然ながら大きく変わっていて、特にAPI関連は、まったくの別物。放置していて申し訳ありませんでした。<span id="more-947"></span></p>
<p>jQuery MobileではjQueryの知識も必要になる部分が(当然ながら?)結構あり、こちらも直近の更新はキャッチアップしてないなと思ったり。余計なことですが、名前がそのまんまな「<a href="http://semooh.jp/jquery/">jQuery日本語リファレンス</a>」は前職時代に自分が作って遺してきたものです。後輩の子たち、全然更新してくれないな&#8230;とか。</p>
<p>最近jQuery Mobile関連の仕事を続けてもらいまして、特に米国では急速にユーザが増えていることを実感します。<a href="http://www.jqmgallery.com/">ギャラリー</a>に上げられるサイトも増えていて、アプリ(多分、PhoneGapを使用)でもjQuery Mobileを利用したものが散見されるようになりました。</p>
<p>自分でも、趣味サイト1本作ろうかと画策中。楽しみです。<!--more--></p>
<div style="background-color:#eee8aa;padding:15px;margin-bottom:10px;">
<div style="float:left;">
<a href="http://www.amazon.co.jp/gp/product/4774149829/ref=as_li_ss_il?ie=UTF8&#038;tag=paiitbla-22&#038;linkCode=as2&#038;camp=247&#038;creative=7399&#038;creativeASIN=4774149829"><img border="0" src="http://ws.assoc-amazon.jp/widgets/q?_encoding=UTF8&#038;Format=_SL160_&#038;ASIN=4774149829&#038;MarketPlace=JP&#038;ID=AsinImage&#038;WS=1&#038;tag=paiitbla-22&#038;ServiceVersion=20070822" ></a><img src="http://www.assoc-amazon.jp/e/ir?t=paiitbla-22&#038;l=as2&#038;o=9&#038;a=4774149829" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></div>
<div style="float:left; margin-left:10px;">
<div style="color:#090;"><strong>[PR] jQuery Mobile リファレンスが書籍として発売されることになりました</strong></div>
<h4><a href="http://www.amazon.co.jp/gp/product/4774149829/ref=as_li_ss_il?ie=UTF8&#038;tag=paiitbla-22&#038;linkCode=as2&#038;camp=247&#038;creative=7399&#038;creativeASIN=4774149829" style="color:#009;">jQuery Mobile ポケットリファレンス</a></h4>
<p>
<div>森 直彦 (著)</div>
<div>技術評論社 (2012/1/20)</div>
<div>新品 <span style="color:#900;">￥2,709</span></div>
</p>
<p><a href="http://www.amazon.co.jp/gp/product/4774149829/ref=as_li_ss_il?ie=UTF8&amp;tag=paiitbla-22&amp;linkCode=as2&amp;camp=247&amp;creative=7399&amp;creativeASIN=4774149829"><img src="https://images-na.ssl-images-amazon.com/images/G/09/buttons/buy-from-tan.gif" style="border:none;"></a></p>
</div>
<div style="clear:both;"></div>
</div>
<p>Related posts:<ol>
<li><a href='http://screw-axis.com/2012/01/27/jquery-mobile-1-0-1/' rel='bookmark' title='[jQuery Mobile] 1.0.1公開'>[jQuery Mobile] 1.0.1公開</a></li>
<li><a href='http://screw-axis.com/2011/12/22/jquery-mobile-cheat-sheet/' rel='bookmark' title='[jQuery Mobile] チートシートつくりました'>[jQuery Mobile] チートシートつくりました</a></li>
<li><a href='http://screw-axis.com/2012/01/20/jquery-mobile-pageevent-cheatsheet/' rel='bookmark' title='[jQuery Mobile] ページイベント・チートシート'>[jQuery Mobile] ページイベント・チートシート</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://screw-axis.com/2011/12/19/jquery-mobile-1-0-reference/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[jQuery Mobile] ベータ2 リリースノート</title>
		<link>http://screw-axis.com/2011/08/05/jquery-mobile-beta2/</link>
		<comments>http://screw-axis.com/2011/08/05/jquery-mobile-beta2/#comments</comments>
		<pubDate>Fri, 05 Aug 2011 03:40:08 +0000</pubDate>
		<dc:creator>nao58</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery Mobile]]></category>

		<guid isPermaLink="false">http://screw-axis.com/?p=926</guid>
		<description><![CDATA[公開されたので、例によって公式のをザクッと。 ベータ2のリリース内容 今回のリリースでは、ライブラリに大幅な向上があります。 ウィジェットの切り離しによって、必要なコンポーネントだけを選択取り込み可能に DOMキャッシュ [...]
Related posts:<ol>
<li><a href='http://screw-axis.com/2011/12/22/jquery-mobile-bartender/' rel='bookmark' title='[jQuery Mobile] BartenderプラグインでフッタをiOSアプリ風にする'>[jQuery Mobile] BartenderプラグインでフッタをiOSアプリ風にする</a></li>
<li><a href='http://screw-axis.com/2011/12/19/jquery-mobile-actionsheet/' rel='bookmark' title='[jQuery Mobile] ActionSheetプラグイン'>[jQuery Mobile] ActionSheetプラグイン</a></li>
<li><a href='http://screw-axis.com/2012/01/10/jquery-mobile-seo-usability/' rel='bookmark' title='[jQuery Mobile] SEOとユーザビリティを両立させるポイント'>[jQuery Mobile] SEOとユーザビリティを両立させるポイント</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://jquerymobile.com/wp-content/uploads/2011/07/beta2.png" class="alignright" width="240" />公開されたので、例によって<a href="http://jquerymobile.com/blog/2011/08/03/jquery-mobile-beta-2-released/">公式の</a>をザクッと。</p>
<h3>ベータ2のリリース内容</h3>
<p>今回のリリースでは、ライブラリに大幅な向上があります。</p>
<ul>
<li>ウィジェットの切り離しによって、必要なコンポーネントだけを選択取り込み可能に</li>
<li>DOMキャッシュ機能により、メモリ使用量の低減</li>
<li>ページのプリキャッシュ・オプション</li>
<li>ページ構造が柔軟に</li>
<li>チェックボックス、ラジオボタンのデザイン向上</li>
<li>JavaScriptによる動的ページを作る場合の拡張機能追加</li>
</ul>
<p>ベータ1リリースから5週間の尽力で、正式版リリースに大きく前進しています。<br />
<span id="more-926"></span></p>
<h3>ベータ3</h3>
<p>正式版のRCとしてバグフィックスやパフォーマンス調整に入る前に、更に追加したい幾つかの重要な機能が残されています。来月リリース予定のベータ3では pushState のサポートや、切り替え動作の Firefox や Opera での向上、開発者向けの拡張機能実装などが含まれます。</p>
<p>jQuery Mobile 1.0では、ベースとなる jQuery core の 1.6.2 以上が必須となることに注意してください。jQuery coreでリリースされている更に上のバージョンもサポートされますが、基本線はこのバージョンを基にしています。</p>
<h3>サポート対象プラットフォームの更新</h3>
<p>ベータ2では、OperaとFirefox向けのCSSサポートを強化しました。また、Android 2.3搭載モバイルとHoneycombタブレット、HP Palm WebOS  3.0タブレットをサポート対象としています。更にNokia S60以降のデバイスをBグレードに加えました。</p>
<p>Nokia S60以降をBグレードとしたのは、これらの端末がハッシュの変更イベントを正しく検知しないためです。つまり、Nokia端末ではAjaxを使ったページ切り替え機能のような拡張機能が動作しないことになります。</p>
<p>この段階で、jQuery Mobileは現在使われている大部分のデスクトップ、スマートフォン、タブレット、電子リーダー上で動作するようになりました。加えて、プログレッシブ・エンハンスメント手法を採っていることで、古いブラウザ上でも動作します。ここでサポートしている広範囲のプラットフォーム上で、ユニヴァーサルなアクセシビリティを担保することが出来ています。</p>
<p>詳しくは、更新した <a href="http://dev.screw-axis.com/doc/jquery_mobile/#/doc/jquery_mobile/overview/supported_platforms/">jQuery Mobile 日本語リファレンス：サポートするプラットフォーム</a> 参照。</p>
<h3>ウィジェット：分離により柔軟なビルドが可能に</h3>
<p>ページプラグインからウィジェットを「分離」させることは長年の課題でしたが、遂にそれが実現しました(参照 <a href="https://github.com/jquery/jquery-mobile/commit/fdb77bfa528a8d12fdc5408110605054fb0a557e">1</a> <a href="https://github.com/jquery/jquery-mobile/commit/2a6c7fc1b982c4308a0450a308f5a66a10e949cf">2</a> <a href="https://github.com/jquery/jquery-mobile/commit/64e6ef0e720a448e8862246ffeaa504ea5e8ac78">3</a>)。「分離」とは、実際にどういうことか。各ウィジェットやユーティリティは、各個のスクリプトファイルに分割されています。しかし、ページプラグインが全ての公式プラグインをページ上にマークアップされていないかどうか確認するために、結局全てのプラグインファイルを読み込む必要があったのです。これによって、不要なプラグインを外すとエラーを起こすことになってしまいました。今後のウィジェット追加に際しても、非常に良くない慣行です。</p>
<p>今回のリリースで、全てのUIウィジェットはjQuery Mobileライブラリから完全に分離されました。そのため、もし特定のプロジェクトにおいて不要なプラグインがあれば、それを単純に削除することが出来ます。この変更によって実際に必要なプラグインだけを取り込めば良くなり、ダウンロードされるライブラリのサイズを劇的に小さくすることが出来るでしょう。現在、更に完全な分離が進められています。現時点で、次のファイルは分離されていますので、カスタム・ビルドの際に不要なものは取り除くことが可能です。</p>
<ul>
<li>page header/content/footer</li>
<li>collapsible</li>
<li>controlgroup</li>
<li>fieldcontain</li>
<li>fixheaderfooter</li>
<li>button</li>
<li>checkboxradio</li>
<li>select</li>
<li>slider</li>
<li>textinput</li>
<li>links theming</li>
<li>listview</li>
<li>navbar</li>
<li>grid</li>
</ul>
<p>いくつかのウィジェットは相互に関係しているので、依存関係表の作成も必要になってきます。たとえば、上記の多くのプラグインが動作にはbuttonプラグインを必要としますので、これを削除するには依存関係にある全てのプラグインが不要である場合だけということになります。</p>
<p>こうした推奨依関係表の作成や、分離機能自体も現在なお更新中です。究極的には、この機能はダウンロード・ビルダーに実装されることになると思われます。</p>
<h3>&#8220;create&#8221;イベントの追加</h3>
<p>個々のプラグインにウィジェットを適用する作業は、多くの場合、&#8221;pagecreate&#8221;イベントで自動的にウィジェット自身によって初期化されます。ページ上で該当するウィジェットがあった場合、プラグインスクリプトが自動的にエンハンス処理を行っていました。たとえば、セレクトメニュープラグインがロードされれば、ページ上のセレクト要素は自動的にエンハンスされます。</p>
<p>この処理が、今後は要素に対して &#8220;create&#8221; イベントを発行することでも可能になりました。これによって、手動で初期化する際の手間が大きく軽減されます。これまでは、コンテンツがAjaxや動的なマークアップによって変更された際、全てのプラグインを手動で初期化する必要がありました。</p>
<p>今後は、マークアップに &#8220;create&#8221; イベントを発行することで、ページが作られた時同様に必要なプラグインのチェックや処理を自動的に行わせることができます。たとえばログインフォームなどでAjaxを用いてHTMLのブロックを持ってきた場合、このブロックに対して &#8220;create&#8221; イベントを発行することで自動的に内包する input や button などのウィジェットをエンハンスすることが出来ます。例えば、次のようなコードになるでしょう。</p>
<pre name="code" class="javascript">
$( ...new markup that contains widgets... ).appendTo( ".ui-page" ).trigger( "create" );
</pre>
<p>ここで &#8220;create&#8221; イベントと &#8220;refresh&#8221; メソッドの違いに注意してください。新しい &#8220;create&#8221; イベントは、生のマークアップに対して包含する複数のウィジェットを適用します。一方 &#8220;refresh&#8221; メソッドは(幾つかの)ウィジェットに実装されており、既に適用されたウィジェットに対してプログラムから操作を行った場合などに、見た目の更新をするために呼び出すものです。</p>
<p>たとえば、ページがロードされた後で動的に ul 要素を追加し、そこに data-role=&#8221;listview&#8221; 属性を指定したとします。この要素に対して &#8220;create&#8221; イベントを実行させれば、この要素は listview スタイルのウィジェットになります。このリストに、プログラムから更に幾つかのアイテムを追加したとします。その場合は、リストビューウィジェットの &#8220;refresh&#8221; メソッドを呼び出して、リストの見栄えを更新してやります。</p>
<h3>DOMキャッシュ管理機能</h3>
<p>従来、Ajaxによるページ遷移時には、移動前のDOMに移動先のDOMを追加していくようになっています。これまで、この追加されたページは全体がリフレッシュされるまで追加されたままになっている仕様でした。そのため、あまりに多くのページを行き来されると、ブラウザ上のメモリを消費して動作を重くさせたり、最悪はクラッシュさせる危険性がありました。</p>
<p>ベータ2では、DOMを小さく保つための簡単な仕組みを実装しています。それは、次のように機能します。Ajaxによってページがロードされた場合、遷移が完了すると以前のページはDOMから一度削除されます。このページにユーザが戻ってきた場合、ブラウザはページ内容をキャッシュから取り出すか、必要であれば再度サーバへ要求するようになります。これが階層化リストの場合であれば、ユーザがリストに含まれないページへ遷移した際に全てのリストページを削除することになります。複数ページを内包したファイルである場合はこの限りでなく、あくまでjQuery MobileによってAjaxで取得されたページに限った動作です。</p>
<p>新しく追加されたページオプション &#8220;domCache&#8221; によって、以前のようにDOMをキャッシュし続けるか、それとも削除して小さく保つかを制御することが出来ます。初期状態では、この &#8220;domCache&#8221; オプションは &#8220;false&#8221; に指定されています。これは、ベータ1以前とは異なりDOMのサイズを積極的に制御しようとします。もしこれを &#8220;true&#8221; に変えるならば、DOMのサイズに関する問題を自分自身で、複数のデバイスに対してテストする必要が出てくるでしょう。</p>
<p>もしこの &#8220;domCache&#8221; を各ページ単位で指定したい場合、ページコンテナ要素に対して data-dom-cache=&#8221;true&#8221; 属性を指定するか、次のようなコードを記述します。</p>
<pre name="code" class="javascript">
elem.page({ domCache: true});
</pre>
<p>この domCache オプションはグローバル設定も可能です。</p>
<pre name="code" class="javascript">
$.mobile.page.prototype.options.domCache = true;
</pre>
<h3>ページのプリフェッチ・オプションの追加</h3>
<p>今回追加されたクールな機能のひとつが、このプリフェッチ・オプションです。Ajaxによるページ取得をプリフェッチさせることができます。たとえば、各写真が別個のHTMLページになっているフォトギャラリーを作るとしましょう。スライドショーで前後のページをプリフェッチさせることにより、Ajaxローダが逐一動かずに写真を表示させることが可能になります。使い方は簡単で、ページ上のリンク要素に data-prefetch 属性を指定するだけです。フレームワークがバックグラウンドで自動的にページをレイジー・ロードしてDOMに追加しておきます。jQuery Mobileによるサイト構築時、HTMLページは個別に分けられることを奨励していますが、実際は複数ページのテンプレートやネスト構造リスト(!)を使って、ページ切り替えを速くしようとしている姿を見かけます。このプリフェッチ機能が、そうした手法の代替になることが期待されます。</p>
<pre name="code" class="html">
<a href="foo/bar/baz" data-prefetch>link text</a>
</pre>
<p>プログラムから $.mobile.loadpage( url ); を呼ぶことでも、ページをプリフェッチできます。プリフェッチリンクは、当然ながらそこに遷移されない場合でも追加のHTTPリクエストを発生させますので、ユーザが遷移する可能性の高いリンクのみに適用するよう心がけましょう。</p>
<h3>グローバル・コンフィグ・オプションの追加：autoInitializePage</h3>
<p>ページの初期化処理を更に制御したい開発者のために、新たに autoInitializePage オプションを追加しました。これを false に設定すると、ページ作成時の自動初期化処理が停止し、開発者が手動によるページ初期化を行う前にマークアップを操作したりすることができるようになります。初期状態ではオプションは true に設定されています。</p>
<h3>ロード時のメッセージを、実行後に指定可能に</h3>
<p>以前は、ロード時のテキストメッセージを初期化オプションとして設定可能なだけで、特定の状況で動的にメッセージを変えることは出来ませんでした。追加機能により、実行時にプログラムから動的にメッセージを変えることが可能です。</p>
<pre name="code" class="javascript">
$.mobile.loadingMessage = "My custom message!";
</pre>
<h3>スワイプイベント発生の閾値設定追加</h3>
<p>スワイプに関するコードは、jquery.mobile.js内でかなりハードコーディングされています。このイベントが発生するための閾値も定数になっていますが、開発者がこの値を調整したい場合もあるでしょう。そのための指定が出来るようになりました。</p>
<ul>
<li><strong>scrollSupressionThreshold</strong> (default: 10px)</li>
<li><strong>durationThreshold</strong> (default: 1000ms)</li>
<li><strong>horizontalDistanceThreshold </strong> (default: 30px)</li>
<li><strong>verticalDistanceThreshold</strong> (default: 75px)</li>
</ul>
<h3>vClick機能の停止</h3>
<p>ベータ1で実装されたvClick機能ですが、テストの結果、様々な問題を引き起こすことがわかりました。そこで、元通りに戻すことになったとのことです。問題について詳しくは、翻訳は割愛します。興味がある方は<a href="http://jquerymobile.com/blog/2011/08/03/jquery-mobile-beta-2-released/">元記事</a>を。</p>
<h3>ページコンテナがオプションに</h3>
<p><img src="http://jquerymobile.com/wp-content/uploads/2011/07/role-page.png" class="alignright" height="120" />文書構造をよりフレキシブルにするため、ページコンテナとしての data-role=&#8221;page&#8221; 属性付きの要素はオプション扱いとなりました。これによって既存のサイト流用や外部コンテンツとのマッシュアップがしやすくなったはずです。</p>
<p>これで page, header, content, footer の data-role 要素は全てオプションとなりました。<a href="http://jsbin.com/ejevis/edit#source">ここ</a>で、ページのコード例を確認できます。</p>
<p>実際背後では、コンテナが無い場合にはフレームワークが自動的にマークアップを追加しています。しかし、実際に記述するマークアップはシンプルに出来るでしょう。ただし、複数ページを包含させるためには、やはりページコンテナは必要となります。</p>
<h3>チェックボックスとラジオボタンのデザイン変更</h3>
<p><img src="http://jquerymobile.com/wp-content/uploads/2011/06/jquery-mobile-check-radios.png" class="alignright" height="200" style="margin-left: 10px;" />以前のチェックボックスやラジオボタンは、ハイライト時に背景が全て変わっていました。これは、特にチェックリストで複数のアイテムが選択可能な時に、少し目立ち過ぎの感がありました。そこで、デザインをよりスッキリしたものに変更することにしました。</p>
<p>コントロールの新デザインは、ややシンプルなものになっています。チェックボックスやラジオボタンは、タップするとボタン全体がハイライトされるのではなく、シンボルの色が変わるだけになっています。ただし、横方向に並べてグループ化されたチェックやラジオは、依然としてボタン全体が彩色されます。</p>
<div class="clear"></div>
<h3>サポートプラットフォームの拡大</h3>
<p>ブラウザのサポート対象拡大に伴い、CSS3によるbackground gradients指定のベンダープレフィックスを追加しました。Opera用(-o)、Internet Explorer用(-ms)のプレフィックスが、通常のルールに追加されています。</p>
<pre name="code" class="css">
background-image: -webkit-linear-gradient(top, #3c3c3c, #111); /* Chrome 10+, Saf5.1+ */
background-image:    -moz-linear-gradient(top, #3c3c3c, #111); /* FF3.6 */
background-image:     -ms-linear-gradient(top, #3c3c3c, #111); /* IE10 */
background-image:      -o-linear-gradient(top, #3c3c3c, #111); /* Opera 11.10+ */
background-image:         linear-gradient(top, #3c3c3c, #111); /* Standard, non-prefixed */
</pre>
<p>これによって、backgroundのgradients機能が WebKit, Firefox, Opera, Internet Explorer 10, そしてプレフィックスを付けないことによって標準準拠している全てのブラウザで使えるようになりました。以前<a href="http://jquerymobile.com/blog/2011/07/08/jquery-mobile-team-update-week-of-july-4th/">ブログで書かれた</a>ように、一度 -ms プレフィックスを外さなければなりませんでした。これは IE9 が border radius などの機能についてコンフリクトを起こし、Microsoftがこれを修正してくれないためです。このため、WP7やMangoを含む古いバージョンのIEでは、背景色がフラットなものになってしまいます。この問題について詳しくは <a href="https://github.com/jquery/jquery-mobile/issues/2046">issue #2046</a> を参照してください。</p>
<h3>コードフォーマットのクリーンアップとJSLint対応</h3>
<p>全てのコードフォーマットがjQueryコアのスタイルガイドに準拠したものになりました。これによって、ライブラリが <a href="http://www.jslint.com/">JSLint</a> などバリデーションツールで動くようになっています。</p>
<h3>ベータ1からの更新</h3>
<p>ベータ1で追加された useFastClick オプションは、削除されています。これは、前述のとおり vclick が使われないようになっているためです。</p>
<p>この他、細かいバグ修正などの変更履歴は<a href="http://jquerymobile.com/blog/2011/08/03/jquery-mobile-beta-2-released/">元記事</a>参照のこと。</p>
<p><a href="http://dev.screw-axis.com/doc/jquery_mobile/">日本語リファレンス</a>については、徐々に更新していきます。</p>
<p>Related posts:<ol>
<li><a href='http://screw-axis.com/2011/12/22/jquery-mobile-bartender/' rel='bookmark' title='[jQuery Mobile] BartenderプラグインでフッタをiOSアプリ風にする'>[jQuery Mobile] BartenderプラグインでフッタをiOSアプリ風にする</a></li>
<li><a href='http://screw-axis.com/2011/12/19/jquery-mobile-actionsheet/' rel='bookmark' title='[jQuery Mobile] ActionSheetプラグイン'>[jQuery Mobile] ActionSheetプラグイン</a></li>
<li><a href='http://screw-axis.com/2012/01/10/jquery-mobile-seo-usability/' rel='bookmark' title='[jQuery Mobile] SEOとユーザビリティを両立させるポイント'>[jQuery Mobile] SEOとユーザビリティを両立させるポイント</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://screw-axis.com/2011/08/05/jquery-mobile-beta2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery Mobile 日本語リファレンス</title>
		<link>http://screw-axis.com/2011/04/07/jquery-mobile-reference/</link>
		<comments>http://screw-axis.com/2011/04/07/jquery-mobile-reference/#comments</comments>
		<pubDate>Thu, 07 Apr 2011 02:00:56 +0000</pubDate>
		<dc:creator>nao58</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://screw-axis.com/?p=906</guid>
		<description><![CDATA[久しぶりにリファレンスの日本語化など。今月中にはアルファ期間を終えてベータリリースされる予定の、ｊQuery Mobileです。 jQuery Mobile 日本語マニュアル jQuery MobileはjQueryコア [...]
Related posts:<ol>
<li><a href='http://screw-axis.com/2011/12/19/jquery-mobile-actionsheet/' rel='bookmark' title='[jQuery Mobile] ActionSheetプラグイン'>[jQuery Mobile] ActionSheetプラグイン</a></li>
<li><a href='http://screw-axis.com/2011/08/05/jquery-mobile-beta2/' rel='bookmark' title='[jQuery Mobile] ベータ2 リリースノート'>[jQuery Mobile] ベータ2 リリースノート</a></li>
<li><a href='http://screw-axis.com/2011/12/19/jquery-mobile-pagination/' rel='bookmark' title='[jQuery Mobile] Paginationプラグイン'>[jQuery Mobile] Paginationプラグイン</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://screw-axis.com/wp-content/uploads/2011/04/jquery-logo.jpg" alt="" title="jQuery mobile" width="240" height="150" class="alignright size-full wp-image-912" style="padding-left: 10px;" />久しぶりにリファレンスの日本語化など。今月中にはアルファ期間を終えてベータリリースされる予定の、ｊQuery Mobileです。</p>
<p><a href="http://dev.screw-axis.com/doc/jquery_mobile/">jQuery Mobile 日本語マニュアル</a></p>
<p>jQuery MobileはjQueryコアベースのモバイル端末用フレームワークですが、触ってみてもらえるとわかるようにJava Scriptのコーディングが必要な部分は、ほとんどありません。マークアップを基本に、jQuery Mobileが data- で始まる属性値を探してプラグイン化していくスタイルで、昔自分が作った <a href="http://semooh.jp/jglycy/">jGlycy</a> と基本的な発想は同じ。HTML5で data- 属性が使えるようになったことで、きっちり採用になりました。<span id="more-906"></span></p>
<h3>雑感</h3>
<p>しばらくいじってみた感想ですが、「さすが&#8230;」の部分と、「やっぱりまだアルファ版」の部分が、結構あります。</p>
<p>基本コンセプトは、分かりやすいものです。Ajaxによるページの切り替え機構も見事ですが、トランジションがスムーズなだけにDLのディレイがモッサリ感じてしまうことも確か。パケット料金がかかることとのトレードになりますが、サイト構造によってはプリロードの機能が欲しいかも。</p>
<p>フォームの制御は、文句無く使うべき。やっぱりネイティブコントロールは、タッチパネルにフレンドリーでないので、操作キツいですから。長めのセレクトリストなどが別ページに自動的にジェネレートされるのも自然だし、開発者は大分助かると思います。</p>
<p>ちょっとひっかかるのは、ひとつはブラウザの履歴制御。ハッシュを書き換えながらやっていくのですが、途中でリロードなどを挟むと上手く繋がらないことが多い感じが。スマートフォン上では余計な操作が減るので問題は大分減ると思いますが、ちょっとストレスです。</p>
<p>その他、現時点では意外とバグが多い印象です。リファレンスに記載されていることでも、実際には動かない機能が幾つか。公式ドキュメントでもデモは実際には説明してあるコードでは無かったり、デモ自体が上手く動いていなかったり。この辺は、日本語リファレンスの方では注意書きを添えたり、割愛してしまったりしました。ベータ版では、ちゃんと仕上げてくると思います。</p>
<p>jQuery UIであまり盛り上がらなかったテーマローラーについては、今後の提供予定に入っています。確かにデフォルトのテーマもすぐに見飽きる感じなので、センスの良い選択肢が幾つかあると嬉しいですが、デザイナーさん次第でしょうか。</p>
<p>最後に、ここで前に説明した<a href="http://screw-axis.com/2011/02/16/responsive-layout1/">レスポンシブ・レイアウト</a>対応の機能もキッチリ入っています。ここは特に今後キモになってくると思いますので、スマホ対応サイト構築時は初手から考慮しておくことをオススメします。</p>
<p>Related posts:<ol>
<li><a href='http://screw-axis.com/2011/12/19/jquery-mobile-actionsheet/' rel='bookmark' title='[jQuery Mobile] ActionSheetプラグイン'>[jQuery Mobile] ActionSheetプラグイン</a></li>
<li><a href='http://screw-axis.com/2011/08/05/jquery-mobile-beta2/' rel='bookmark' title='[jQuery Mobile] ベータ2 リリースノート'>[jQuery Mobile] ベータ2 リリースノート</a></li>
<li><a href='http://screw-axis.com/2011/12/19/jquery-mobile-pagination/' rel='bookmark' title='[jQuery Mobile] Paginationプラグイン'>[jQuery Mobile] Paginationプラグイン</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://screw-axis.com/2011/04/07/jquery-mobile-reference/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[js] Ajax通信がF5で更新されない場合</title>
		<link>http://screw-axis.com/2009/08/12/ajax_xhr_f5/</link>
		<comments>http://screw-axis.com/2009/08/12/ajax_xhr_f5/#comments</comments>
		<pubDate>Wed, 12 Aug 2009 12:40:02 +0000</pubDate>
		<dc:creator>nao58</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Cache]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://screw-axis.com/?p=689</guid>
		<description><![CDATA[画像やスクリプトなどの外部ファイル取り込みを高速化するために、キャッシュ制御は不可欠です。 しかし、設定をうっかりすると(あるいは、しないと)、キャッシュが強すぎて全くデータが更新されないような場合があります。 今回のキ [...]
Related posts:<ol>
<li><a href='http://screw-axis.com/2009/07/15/js-degrading-script-tags/' rel='bookmark' title='[js] 外部ファイルロードを便利、高速に'>[js] 外部ファイルロードを便利、高速に</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://farm1.static.flickr.com/164/435720036_61f24af0d8_m.jpg" alt="fortuneteller" title="fortuneteller" width="240" height="178" class="alignright size-full" style="margin-left: 5px;" />画像やスクリプトなどの外部ファイル取り込みを高速化するために、<a href="/2009/06/06/web-google-page-speed%e3%81%a7%e3%82%b5%e3%82%a4%e3%83%88%e3%82%92%e9%ab%98%e9%80%9f%e5%8c%961/">キャッシュ制御</a>は不可欠です。<br />
しかし、設定をうっかりすると(あるいは、しないと)、キャッシュが強すぎて全くデータが更新されないような場合があります。<br />
今回のキーワードは、「IE」と「F5キー」、そして「XMLHttpRequest」。<br />
「<a href="http://www.amazon.co.jp/gp/product/487311361X?ie=UTF8&#038;tag=paiitbla-22&#038;linkCode=as2&#038;camp=247&#038;creative=1211&#038;creativeASIN=487311361X">ハイパフォーマンスWebサイト</a>」の著者であるStevesSuders氏のblogで紹介された「<a href="http://www.stevesouders.com/blog/2009/08/11/f5-and-xhr-deep-dive/">F5 and XHR deep dive</a>」を検証してみます。<br />
<span id="more-689"></span></p>
<h5>「F5」でXHR通信結果が更新されない</h5>
<p>通常、キャッシュが設定された外部ファイル取り込みは、その期限が来るまでは再通信されません。しかしブラウザをF5やCtrl+rなどで明示的にリロードした場合はその限りではなく、ファイルの再取得が行われるのが一般的です。<br />
しかし、キャッシュ指定の条件によっては、XMLHttpRequestを用いた、いわゆるAjax通信時が発生しなくなってしまうと<a href="http://blog.httpwatch.com/2009/08/07/ajax-caching-two-important-facts/comment-page-1/">HttpWatchの記事</a>で伝えられました。<br />
これを検証するために、簡単なプログラムを作ってみます。</p>
<h5>検証プログラムの説明</h5>
<p>まずは、取り込まれるjsファイルを用意します。<br />
サーバサイドで毎回ジェネレートされる、現在時刻を指定された要素に出力するだけのスクリプトです。</p>
<p><a href="http://dev.screw-axis.com/sandbox/f5_cache/js.php?id=hoge" target="_blank">検証用スクリプト</a></p>
<p>呼び出す度に日時が更新されることが分かると思います。</p>
<p>そして必要なのはキャッシュコントロール。<br />
パケット監視などが出来る人は見ていただけばわかるのですが、パラメータに応じて次のようなヘッダを付与します。</p>
<dl>
<dt>cache=1</dt>
<dd>キャッシュ有効。Expiresを30日後にし、Cache-Controlのmax-ageも30日間に設定します。</dd>
<dt>cache=-1</dt>
<dd>キャッシュ無効。Expiresを30日前にし、Cache-Controlのmax-ageは0とします。</dd>
<dt>cache=0</dt>
<dd>キャッシュ指定無し。ExpireもCache-Controlも指定しません。</dd>
</dl>
<p>ついでに、画像も用意してみました。同様にサーバサイドで現在時刻の画像を作成して返します。キャッシュ制御も同じです。</p>
<p><a href="http://dev.screw-axis.com/sandbox/f5_cache/img.php">検証用画像</a></p>
<p>これを、テスト用のHTMLで取り込みます。<br />
スクリプトは、scriptタグによる単純な取り込みと、XMLHttpRequestによるAjax通信の2種類。画像はimgタグで指定しています。<br />
前述の3種類のキャッシュ制御を行うページは、次の通りです。</p>
<ul>
<li><a href="http://dev.screw-axis.com/sandbox/f5_cache/test.php?cache=-1">キャッシュ無効</a></li>
<li><a href="http://dev.screw-axis.com/sandbox/f5_cache/test.php?cache=1">キャッシュ有効</a></li>
<li><a href="http://dev.screw-axis.com/sandbox/f5_cache/test.php?cache=0">キャッシュ指定無し</a></li>
</ul>
<p>これで、ページを開いた時の時刻(正確には、サーバがリクエストを受け付けた時刻)が表示されるはずです。リロードや再訪問時に、キャッシュが効いていれば日時はキャッシュされた時のままになります。</p>
<p>順に見ていきましょう。</p>
<h5>キャッシュ無効の場合</h5>
<table class="grid" cellspacing="0" style="width: 400px;">
<tr>
<th></th>
<th colspan="3">通常遷移</th>
<th colspan="3">F5リロード</th>
</tr>
<tr>
<th></th>
<th>Image</th>
<th>Script</th>
<th>XHR</th>
<th>Image</th>
<th>Script</th>
<th>XHR</th>
</tr>
<tr>
<th>Chrome2</th>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
<tr>
<th>FF3.0</th>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
<tr>
<th>FF3.5</th>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
<tr>
<th>Opera9</th>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
<tr>
<th>Opera10</th>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
<tr>
<th>IE6</th>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
<tr>
<th>IE7</th>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
<tr>
<th>IE8</th>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
<tr>
<th>Safari3</th>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
</table>
<p>いずれの場合も期待通り、キャッシュは全くききませんでした。<br />
ページ遷移を行った場合も、F5でリロードした場合も、全て最新に更新されます。</p>
<h5>キャッシュ有効の場合</h5>
<table class="grid" cellspacing="0" style="width: 400px;">
<tr>
<th></th>
<th colspan="3">通常遷移</th>
<th colspan="3">F5リロード</th>
</tr>
<tr>
<th></th>
<th>Image</th>
<th>Script</th>
<th>XHR</th>
<th>Image</th>
<th>Script</th>
<th>XHR</th>
</tr>
<tr>
<th>Chrome2</th>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
<tr>
<th>FF3.0</th>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
<tr>
<th>FF3.5</th>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
<tr>
<th>Opera9</th>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>更新</td>
<td>更新</td>
<td>キャッシュ</td>
</tr>
<tr>
<th>Opera10</th>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
<tr>
<th>IE6</th>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>更新</td>
<td>更新</td>
<td>キャッシュ</td>
</tr>
<tr>
<th>IE7</th>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>更新</td>
<td>更新</td>
<td>キャッシュ</td>
</tr>
<tr>
<th>IE8</th>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>更新</td>
<td>更新</td>
<td>キャッシュ</td>
</tr>
<tr>
<th>Safari3</th>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
</table>
<p>動作が分かれました。<br />
通常にページ遷移を行った場合は、Opera10を除き一律にキャッシュが使われる期待通りの動作です。(Opera10はまだbetaのため、最終的にどういった仕様になるかは不明です)<br />
F5などでリロードを行うと、画像やscript要素で取り込んだものは、いずれも再読み込みされます。<br />
しかしXMLHttpRequestでの通信は、ChromeやFFでは再通信が行われるのに対し、IEとOpera9ではそのままキャッシュが有効になってしまいました。これはCtrl+F5のようなスーパーリロードを用いても、変わりません。</p>
<h5>キャッシュ指定無しの場合</h5>
<table class="grid" cellspacing="0" style="width: 400px;">
<tr>
<th></th>
<th colspan="3">通常遷移</th>
<th colspan="3">F5リロード</th>
</tr>
<tr>
<th></th>
<th>Image</th>
<th>Script</th>
<th>XHR</th>
<th>Image</th>
<th>Script</th>
<th>XHR</th>
</tr>
<tr>
<th>Chrome2</th>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
<tr>
<th>FF3.0</th>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
<tr>
<th>FF3.5</th>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
<tr>
<th>Opera9</th>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
<tr>
<th>Opera10</th>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>キャッシュ</td>
<td>更新</td>
<td>更新</td>
<td>キャッシュ</td>
</tr>
<tr>
<th>IE6</th>
<td>更新</td>
<td>更新</td>
<td>キャッシュ</td>
<td>更新</td>
<td>更新</td>
<td>キャッシュ</td>
</tr>
<tr>
<th>IE7</th>
<td>更新</td>
<td>更新</td>
<td>キャッシュ</td>
<td>更新</td>
<td>更新</td>
<td>キャッシュ</td>
</tr>
<tr>
<th>IE8</th>
<td>更新</td>
<td>更新</td>
<td>キャッシュ</td>
<td>更新</td>
<td>更新</td>
<td>キャッシュ</td>
</tr>
<tr>
<th>Safari3</th>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
<td>更新</td>
</tr>
</table>
<p>かなり無軌道になっています。Operaに至っては、通常のページ遷移でも動作に違いが出てしまいました。</p>
<h5>ETagについて</h5>
<p>StevesSuders氏の検証ではETagについても含まれています。<br />
今回は検証結果を見やすくするために、レスポンス304については確認していません。<br />
氏のページによれば、Safari4はIf-Modified-Sinceを送らずに常に再送信されてしまうようです。</p>
<h5>まとめ</h5>
<ol>
<li>Expiresを指定しないことは、動作を全く制御しないのと同じこと。可能な限りきちんと、用途にあわせてキャッシュの制御を行うべきです。</li>
<li>Ajax通信でキャッシュをされたくない場合(多くの場合、この用途でしょう)、Expiresを過去に指定してキャッシュを無効にしましょう。</li>
<li>或いは、通信にエポックタイムのようなユニークなIDをパラメータに付与し、キャッシュできないようにするのも良い方法です。</li>
<li>Ajax通信をキャッシュしたい場合、Expiresをキャッシュしたい期間、きちんと指定しましょう。ただし、その際にはF5でリロードしても更新されないブラウザがいることを知っておきましょう。</li>
<li>Operaを対応ブラウザにするならば、バージョン10がどのような仕様になるか注意しておきましょう。</li>
</ol>
<p>Related posts:<ol>
<li><a href='http://screw-axis.com/2009/07/15/js-degrading-script-tags/' rel='bookmark' title='[js] 外部ファイルロードを便利、高速に'>[js] 外部ファイルロードを便利、高速に</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://screw-axis.com/2009/08/12/ajax_xhr_f5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[js] 外部ファイルロードを便利、高速に</title>
		<link>http://screw-axis.com/2009/07/15/js-degrading-script-tags/</link>
		<comments>http://screw-axis.com/2009/07/15/js-degrading-script-tags/#comments</comments>
		<pubDate>Wed, 15 Jul 2009 05:48:53 +0000</pubDate>
		<dc:creator>nao58</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Performance]]></category>

		<guid isPermaLink="false">http://screw-axis.com/?p=667</guid>
		<description><![CDATA[2週間ほど前に入手したSteve Sounders氏の新刊「Even Faster Web Sites」ですが、ようやく本格的に読み始めました。 前の「ハイパフォーマンスWebサイト ―高速サイトを実現する14のルール」 [...]
Related posts:<ol>
<li><a href='http://screw-axis.com/2009/05/17/javascript%e3%81%aenull%e3%81%a8undefined%e3%81%a8false%e3%81%a80%e3%81%a8%e7%a9%ba%e6%96%87%e5%ad%97%e3%81%a8/' rel='bookmark' title='[Javascript] nullとundefinedとfalseと0と空文字と'>[Javascript] nullとundefinedとfalseと0と空文字と</a></li>
<li><a href='http://screw-axis.com/2009/06/11/web-google-page-speed%e3%81%a7%e3%82%b5%e3%82%a4%e3%83%88%e3%82%92%e9%ab%98%e9%80%9f%e5%8c%963/' rel='bookmark' title='[Web] Google Page Speedでサイトを高速化(3)'>[Web] Google Page Speedでサイトを高速化(3)</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://farm1.static.flickr.com/170/467072434_c8c1e1468b_m.jpg" alt="tricky" title="tricky" width="240" height="160" class="alignright size-full" style="margin-left: 5px;" />2週間ほど前に入手したSteve Sounders氏の新刊「<a href="http://www.amazon.co.jp/gp/product/0596522304?ie=UTF8&#038;tag=paiitbla-22&#038;linkCode=xm2&#038;camp=247&#038;creativeASIN=0596522304">Even Faster Web Sites</a>」ですが、ようやく本格的に読み始めました。<br />
前の「<a href="http://www.amazon.co.jp/gp/product/487311361X?ie=UTF8&#038;tag=paiitbla-22&#038;linkCode=as2&#038;camp=247&#038;creative=1211&#038;creativeASIN=487311361X">ハイパフォーマンスWebサイト ―高速サイトを実現する14のルール</a>」は発刊前にネット上で読んでいたのでスルーしてしまいましたが、今回はちゃんと購入。前のものが基本をしっかりと抑えた王道的内容だったのに比べて、比較的トリッキーなテクニックが増えているように思います。</p>
<p>今回は本書の5章から「へー」と思った、外部スクリプトを他のファイルのロードを妨げることなく取得し、なおかつそのファイルのロードが終わった際に後続のスクリプトが実行されるための方法(複雑)を確認してみます。<br />
<span id="more-667"></span></p>
<h5>SCRIPTタグを減らすテクニック</h5>
<p>この技法はまず、jQueryの作者であるJohn Resig氏のblogポスト <a href="http://ejohn.org/blog/degrading-script-tags/">Degrading Script Tags</a> に端を発します。<br />
まず、次のコードを見て下さい。</p>
<pre name="code" class="html">
&lt;script src="jquery.js"&gt;&lt;/script&gt;
&lt;script&gt;
  jQuery(document).ready(function($){
    $("div").text("loaded!");
  });
&lt;/script&gt;
</pre>
<p>これを、次のように書けたら幸せだよね、という話。</p>
<pre name="code" class="html">
&lt;script src="jquery.js"&gt;&lt;/script&gt;
  jQuery("div").text("loaded!");
&lt;/script&gt;
</pre>
<p>これなら、SCRIPTタグが少なくて済むし、コードの依存関係もハッキリする。srcに記述されたファイルのロードが失敗したら中身のコードが実行されない形なら、万が一の場合にもスクリプトエラーにならずに済むと。</p>
<p>次のようなコードを外部ファイル(この例で言えばjquery.js)の最後に加えれば、これが実装できます。</p>
<pre name="code" class="javascript">
(function(){
var scripts = document.getElementsByTagName("script");
var curScript = scripts[ scripts.length - 1 ];

if ( curScript.executed )
  return;

// ... jQuery ...

curScript.executed = true;
var script = curScript.innerHTML;
if ( script ) {
  jQuery(document).ready(function(){
    jQuery.globalEval( script );
  });
}
})();
</pre>
<p>もちろんこれは、jQuery以外のライブラリでも適用可能な、非常にクールな手法です。<br />
正直なところ、自分は最初のこのポストが投稿された際にはそれほど感銘を受けなかった記憶があります。それは「スクリプトのロードと実行が連動する」点に私が着目できていなかったからで、単にscriptタグを減らせるシンタックス程度の認識しかありませんでした。<br />
今回改めて読み返してみて、直観的な良い記述方法だなと思いました。</p>
<h5>他ファイルのロードブロック問題</h5>
<p>見たように素晴らしいテクニックなのですが、この方法にもまだパフォーマンスの観点から改善の余地があるとSteve Sounders氏は指摘しています。<br />
それが、<a href="/2009/06/11/web-google-page-speed%e3%81%a7%e3%82%b5%e3%82%a4%e3%83%88%e3%82%92%e9%ab%98%e9%80%9f%e5%8c%963/">スクリプトのダウンロードが他の外部ファイルのダウンロードをブロックしてしまう問題</a>の回避についてです。</p>
<p>前述のテクニックはjsファイルのロードについては通常の方法であるため、ブロックは発生してしまいます。これを避け、なおかつロード完了とスクリプト実行がきちんと連動するように改良されたスクリプトが、<a href="http://stevesouders.com/efws/degrading-script-tag.php?t=1247630376">こちら</a>で紹介されています。</p>
<pre name="code" class="javascript">
function init(){
  jQuery("div").text("loaded!");
}

var domscript = document.createElement('script');
domscript.src = "jquery.js";
if ( -1 != navigator.userAgent.indexOf('Opera')){
  domscript.innerHTML = 'init();';
}else{
  domscript.text = 'init();';
}
document.getElementsByTagName('head')[0].appendChild(domscript);
</pre>
<p>この呼び出し方と前述のテクニックを組み合わせることで、高速な外部ファイル呼び出しと、そのロード完了に依存するスクリプトの記述が可能になります。</p>
<p>但し、この方法を使うには外部ファイル側に自要素の中身をコールバック(?)する仕組みを埋め込まなければならず、汎用的に使うのは難しくなってしまいます。<br />
将来的にこの記述をブラウザ側がサポートしてくれた場合であればまだしも、現時点では同書の別項で紹介されている<a href="http://stevesouders.com/efws/script-onload.php">Onload技法</a>の方が優れているとしています。<br />
こちらの検証は、また機会があれば。</p>
<p>Related posts:<ol>
<li><a href='http://screw-axis.com/2009/05/17/javascript%e3%81%aenull%e3%81%a8undefined%e3%81%a8false%e3%81%a80%e3%81%a8%e7%a9%ba%e6%96%87%e5%ad%97%e3%81%a8/' rel='bookmark' title='[Javascript] nullとundefinedとfalseと0と空文字と'>[Javascript] nullとundefinedとfalseと0と空文字と</a></li>
<li><a href='http://screw-axis.com/2009/06/11/web-google-page-speed%e3%81%a7%e3%82%b5%e3%82%a4%e3%83%88%e3%82%92%e9%ab%98%e9%80%9f%e5%8c%963/' rel='bookmark' title='[Web] Google Page Speedでサイトを高速化(3)'>[Web] Google Page Speedでサイトを高速化(3)</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://screw-axis.com/2009/07/15/js-degrading-script-tags/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[js] 演算子+と-の速度差と最速ループ</title>
		<link>http://screw-axis.com/2009/06/17/js-speed-of-sum-subtract/</link>
		<comments>http://screw-axis.com/2009/06/17/js-speed-of-sum-subtract/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 15:53:00 +0000</pubDate>
		<dc:creator>nao58</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://screw-axis.com/?p=576</guid>
		<description><![CDATA[先週はGoogle Developer Day 2009に行ってきまして、非常に有意義なセッションもあれば、それなりのものもありましたが。 今回は個人的に最も良かったパメラさんのGoogle Maps高速化セッションから [...]
No related posts.]]></description>
			<content:encoded><![CDATA[<p><img src="http://farm1.static.flickr.com/48/125489887_124cf772c5_m.jpg" alt="math" title="math" width="240" height="158" class="alignright size-full" style="margin-left: 5px;" />先週はGoogle Developer Day 2009に行ってきまして、非常に有意義なセッションもあれば、それなりのものもありましたが。</p>
<p>今回は個人的に最も良かったパメラさんのGoogle Maps高速化セッションから、大量マーカーの効果的なプロット方法&#8230;は、また今度時間がある時にして、その際に彼女がポロっと漏らした「+=は-=に比べて遅いし」を軽く検証してみました。（FOXでアメリカン・アイドルを観ながら）</p>
<p>検証は、ループカウンタをアップしていく/ダウンしていく方法で比較しています。</p>
<p>※2009.09.27<br />
検証プログラムの問題を指摘いただき、末尾に追加してあります。</p>
<p><span id="more-576"></span></p>
<h5>検証プログラム</h5>
<pre name="code" class="javascript">
/* (1) sum */
var s = get_ms();
for(var i=0; i&lt;arr.length; ++i){
  arr[i] = i;
}
var e = get_ms();
dump(e-s);

/* (2) subtract */
var s = get_ms();
for(var i=arr.length; i&gt;0; --i){
  arr[i] = i;
}
var e = get_ms();
dump(e-s);
</pre>
<p>get_msはミリ秒を取得する関数、dumpは結果を出力する関数として用意しました。arrは、500,000個の添え字を持つ単純な配列です。<br />
これを、公平を期すために同一プロセス内で交互に実行します。結果の単位はミリ秒となります。</p>
<h5>結果</h5>
<p>[Firefox3.0.1]</p>
<pre>
(1) 107
(2) 92
(1) 106
(2) 92
(1) 107
(2) 90
(1) 107
(2) 92
</pre>
<p>足し算、引き算の順です。</p>
<p>[Internet Explorer 7]<br />
IEはFFに比べてこの実験では遅く、しかも「スクリプトの実行に時間が&#8230;」というエラーが出てしまいます。止める方法はあるのでしょうが、調べるのも面倒なので、配列のサイズを200,000に減らし、繰り返し回数も減らしてあります。</p>
<pre>
(1) 110
(2) 94
(1) 125
(2) 93
(1) 110
(2) 93
</pre>
<h5>まとめ</h5>
<p>疑う余地はなく、減算の方が高速という結果が出ました。FF2やIE8などはTV前のここの環境には無いので試していませんが、傾向としては充分だと思います。<br />
特に大きなループでは可能ならば和算よりも減算を使うようにするのが良さそうです。</p>
<p>なお、カウントダウンでのループが可能なアルゴリズムであれば、比較演算も省略できる次の形の方が、より高速でした。</p>
<pre name="code" class="javascript">
/* (3) while-subtract */
var s = get_ms();
var i=arr.length;
while(--i){
  arr[i] = i;
}
var e = get_ms();
dump(e-s);
</pre>
<p>[Firefox3.0.1]</p>
<pre>
(1) 110
(2) 91
(3) 77
(1) 106
(2) 92
(3) 77
</pre>
<p>コード量も少なく、お勧めの記述です。</p>
<h5>2009.09.27追記</h5>
<p>コメント欄で指摘をいただきました。<br />
初歩的なミスで、lengthの評価回数が釣り合っておりませんでしたので、改めてやってみます。</p>
<pre name="code" class="javascript">
var len = arr.length;

/* (1) sum */
var s = get_ms();
for(var i=0; i&lt;len; ++i){
  arr[i] = i;
}
var e = get_ms();
dump(e-s);

/* (2) subtract */
var s = get_ms();
for(var i=len; i&gt;0; --i){
  arr[i] = i;
}
var e = get_ms();
dump(e-s);
</pre>
<h5>結果</h5>
<p>[Firefox3.5.3] (500,000ループ)</p>
<pre>
(1)100
(2)97
(2)100
(1)95
(2)100
(1)97
</pre>
<p>[Internet Explorer 8] (200,000ループ)</p>
<pre>
(1)47
(2)62
(1)47
(2)62
(1)47
(2)63
</pre>
<p>[Chrome 2] (5,000,000ループ)</p>
<pre>
(1)29
(2)26
(1)29
(2)26
(1)28
(2)25
</pre>
<h5>再まとめ</h5>
<p>結果、FF3.5やChrome2では傾向は変わらないものの、その差は縮まりました。<br />
また、IE8では寧ろ加算の方が速くなっています。<br />
前回テストした際のバージョンに該当するブラウザが手元に無いので比較実験になっていませんが、加減算の速度差は気にするほどではないと言えるかもしれません。</p>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://screw-axis.com/2009/06/17/js-speed-of-sum-subtract/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[Javascript] nullとundefinedとfalseと0と空文字と</title>
		<link>http://screw-axis.com/2009/05/17/javascript%e3%81%aenull%e3%81%a8undefined%e3%81%a8false%e3%81%a80%e3%81%a8%e7%a9%ba%e6%96%87%e5%ad%97%e3%81%a8/</link>
		<comments>http://screw-axis.com/2009/05/17/javascript%e3%81%aenull%e3%81%a8undefined%e3%81%a8false%e3%81%a80%e3%81%a8%e7%a9%ba%e6%96%87%e5%ad%97%e3%81%a8/#comments</comments>
		<pubDate>Sat, 16 May 2009 15:55:37 +0000</pubDate>
		<dc:creator>nao58</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://screw-axis.com/?p=134</guid>
		<description><![CDATA[大抵の、特に変数の型宣言を行わないタイプの言語では、型の異なる値の条件式は悩みの種です。 Javascriptもご他聞に洩れずというか、undefinedとnullが異なる分だけ更にややこしくなっているようです。 暗黙の [...]
Related posts:<ol>
<li><a href='http://screw-axis.com/2009/05/20/php-%e8%ab%96%e7%90%86%e6%bc%94%e7%ae%97%e5%ad%90%e3%80%8cand-or%e3%80%8d%e3%81%a8%e3%80%8c-%e3%80%8d%e3%81%ae%e9%81%95%e3%81%84/' rel='bookmark' title='[PHP] 論理演算子「and, or」と「&amp;&amp;, ||」の違い'>[PHP] 論理演算子「and, or」と「&#038;&#038;, ||」の違い</a></li>
<li><a href='http://screw-axis.com/2011/12/20/jquery-mobile-photoswipe/' rel='bookmark' title='[jQuery Mobile] PhotoSwipeプラグイン'>[jQuery Mobile] PhotoSwipeプラグイン</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<style>
table.matrix{
  margin-left: 20px;
  border-top: 1px solid #000;
  border-left: 1px solid #000;
}
table.matrix th{
  border-right: 1px solid #000;
  border-bottom: 1px solid #000;
}
table.matrix td{
  text-align: center;
  border-right: 1px solid #000;
  border-bottom: 1px solid #000;
}
</style>
<p>大抵の、特に変数の型宣言を行わないタイプの言語では、型の異なる値の条件式は悩みの種です。<br />
Javascriptもご他聞に洩れずというか、undefinedとnullが異なる分だけ更にややこしくなっているようです。<br />
暗黙の型変換で痛い目にあわないよう、ちょっと実験してまとめてみます。<br />
実験にはとりあえず、手っ取り早いので <a href="http://www.billyreisinger.com/jash/index.html">Jash</a> を使用。<br />
一緒に試してみるならば、<a href="javascript:(function(){document.body.appendChild(document.createElement('script')).src='http://www.billyreisinger.com/jash/source/latest/Jash.js';})();">こちら</a>のBookmarkletをクリックしてコンソールに入力しながら読むとわかりやすいかもしれません。</p>
<h5>nullとundefined</h5>
<p>nullとundefined。たまに「同じもの？」と聞かれることもあるので、とりあえず確かめて見ます。</p>
<pre class="jash">
>> null==undefined
true
</pre>
<p>あれ、同じでしょうか？<br />
<span id="more-134"></span></p>
<pre class="jash">
>> null===undefined
false
</pre>
<p>もちろん違います。<br />
しかし、== 演算子で比較する限りは「同じ」と言ってもよいようです。<br />
では、実際は何が違うのでしょうか？typeofで確認してみます。</p>
<pre class="jash">
>> typeof null
object
>> typeof undefined
undefined
</pre>
<p>nullはobjectなんですね。<br />
根本的に型が違う（undefinedには型が無い？）ようです。</p>
<h5>演算子: ==</h5>
<p>ではこの == という曖昧な演算子について検証してみます。<br />
登場人物はfalseと、それと等しくなりそうな7つの値「undefined」「null」「&#8221;(空文字)」「0(数値のゼロ)」「&#8217;0&#8242;(文字列としてのゼロ)」「&#8221;\n&#8221;(改行)」「&#8221; &#8220;(スペース)」。<br />
先ほどのように、それぞれを == で結んでみましょう。</p>
<pre class="jash">
>> false==null
false
</pre>
<p>全て試したマトリックスが次のものです。（undefはundefined）</p>
<table class="matrix" cellspacing="0" style="width: 400px;">
<tr>
<th></th>
<th>false</th>
<th>undef</th>
<th>null</th>
<th>&#8221;</th>
<th>0</th>
<th>&#8217;0&#8242;</th>
<th>&#8220;\n&#8221;</th>
<th>&#8221; &#8220;</th>
</tr>
<tr>
<th>false</th>
<td style="color:blue">true</td>
<td style="color:red">false</td>
<td style="color:red">false</td>
<td style="color:blue">true</td>
<td style="color:blue">true</td>
<td style="color:blue">true</td>
<td style="color:blue">true</td>
<td style="color:blue">true</td>
</tr>
<tr>
<th>undef</th>
<td style="color:red">false</td>
<td style="color:blue">true</td>
<td style="color:blue">true</td>
<td style="color:red">false</td>
<td style="color:red">false</td>
<td style="color:red">false</td>
<td style="color:red">false</td>
<td style="color:red">false</td>
</tr>
<tr>
<th>null</th>
<td style="color:red">false</td>
<td style="color:blue">true</td>
<td style="color:blue">true</td>
<td style="color:red">false</td>
<td style="color:red">false</td>
<td style="color:red">false</td>
<td style="color:red">false</td>
<td style="color:red">false</td>
</tr>
<tr>
<th>&#8221;</th>
<td style="color:blue">true</td>
<td style="color:red">false</td>
<td style="color:red">false</td>
<td style="color:blue">true</td>
<td style="color:blue">true</td>
<td style="color:red">false</td>
<td style="color:red">false</td>
<td style="color:red">false</td>
</tr>
<tr>
<th>0</th>
<td style="color:blue">true</td>
<td style="color:red">false</td>
<td style="color:red">false</td>
<td style="color:blue">true</td>
<td style="color:blue">true</td>
<td style="color:blue">true</td>
<td style="color:blue">true</td>
<td style="color:blue">true</td>
</tr>
<tr>
<th>&#8217;0&#8242;</th>
<td style="color:blue">true</td>
<td style="color:red">false</td>
<td style="color:red">false</td>
<td style="color:red">false</td>
<td style="color:blue">true</td>
<td style="color:blue">true</td>
<td style="color:red">false</td>
<td style="color:red">false</td>
</tr>
<tr>
<th>&#8220;\n&#8221;</th>
<td style="color:blue">true</td>
<td style="color:red">false</td>
<td style="color:red">false</td>
<td style="color:red">false</td>
<td style="color:blue">true</td>
<td style="color:red">false</td>
<td style="color:blue">true</td>
<td style="color:red">false</td>
</tr>
<tr>
<th>&#8221; &#8220;</th>
<td style="color:blue">true</td>
<td style="color:red">false</td>
<td style="color:red">false</td>
<td style="color:red">false</td>
<td style="color:blue">true</td>
<td style="color:red">false</td>
<td style="color:red">false</td>
<td style="color:blue">true</td>
</tr>
</table>
<p>さて、いかがでしょう。<br />
かなりの無秩序さにゲンナリです。<br />
かろうじて文字列同士はキャストが行われない分だけ理解しやすいですが&#8230;つまり、ここで挙げた文字列は全てfalseや0と等価になるものの、お互いは等価にはならないと。</p>
<h5>演算子: ===</h5>
<p>では、型まで含めた === 演算子を用いた場合はどうでしょう。</p>
<pre class="jash">
>> false===0
false
</pre>
<p>これは、予想通り全ての異なる値間で false となりました。<br />
厳密な比較を行うのならば、やはりこれを使うのが良さそうです。</p>
<h5>演算子: !</h5>
<p>では、if文の中での暗黙の条件式はではどうでしょう。<br />
前項で false との等価比較だったので、あわせてここは「!」を付けた条件式に真と評価されるかどうかを試してみます。<br />
わかりにくいですね。つまり例えば undefined のテストであれば、次のような式で試したということです。</p>
<pre class="jash">
>> (!undefined ? true : false)
true
</pre>
<p>先ほどと同じ値を用いて試したのが、次の表です。</p>
<table class="matrix" cellspacing="0" style="width: 100px;">
<tr>
<th>false</th>
<td style="color:blue">true</td>
</tr>
<tr>
<th>undefined</th>
<td style="color:blue">true</td>
</tr>
<tr>
<th>null</th>
<td style="color:blue">true</td>
</tr>
<tr>
<th>&#8221;</th>
<td style="color:blue">true</td>
</tr>
<tr>
<th>0</th>
<td style="color:blue">true</td>
</tr>
<tr>
<th>&#8217;0&#8242;</th>
<td style="color:red">false</td>
</tr>
<tr>
<th>&#8220;\n&#8221;</th>
<td style="color:red">false</td>
</tr>
<tr>
<th>&#8221; &#8220;</th>
<td style="color:red">false</td>
</tr>
</table>
<p>なんと、 == 演算子のどの列とも合致しない結果です。<br />
つまり、こういうことなのですね。</p>
<pre class="jash">
>> hoge=null
null
>> (hoge==false?true:false)
false
>> (!hoge?true:false)
true
</pre>
<h5>まとめ</h5>
<p>では、実際にはどうコーディングすれば安全なのでしょうか。<br />
動きをある程度ちゃんと把握していれば、あとは用途にあわせて&#8230;という言い方に結局はなると思います。<br />
しかし、型が怪しい場合は極力 == は使わない方が良いと言えそうです。</p>
<p><strong>未定義の変数を調べる場合は typeof を使う</strong></p>
<pre>( typeof v == 'undefined' )</pre>
<p><strong>型を意識して正確に比較するなら === を使う</strong><br />
当然のことながら。<br />
しかし実のところ、Javascriptでこういったケースはあまり多くないと思います。</p>
<p><strong>テキストボックスに入力があるかを確かめる場合</strong><br />
これは、よく見ると結構難問です。<br />
純粋に文字列が全く入っていないことを確かめるならば、=== を使えば確実です。</p>
<pre>( text.value==='' )</pre>
<p>しかし、必須入力確認をしたい場合、空白文字や改行が入っただけの状態は望ましくないはず。この条件では、そうした状態はパスしてしまいます。JavaScriptにはtrim関数が標準で無いので、これはそれなりに厄介。</p>
<p>では、意外とこれではどうでしょう。</p>
<pre>( text.value==false )</pre>
<p>こうすれば空白や改行は大丈夫ですが、「0」や「000」などと入力された場合に未入力と判定されてしまいます。</p>
<p>ここはやはり、正規表現などを用いるのが良さそうです。</p>
<p>まとめてみましたが、あんまりスッキリしませんでした。</p>
<p>Related posts:<ol>
<li><a href='http://screw-axis.com/2009/05/20/php-%e8%ab%96%e7%90%86%e6%bc%94%e7%ae%97%e5%ad%90%e3%80%8cand-or%e3%80%8d%e3%81%a8%e3%80%8c-%e3%80%8d%e3%81%ae%e9%81%95%e3%81%84/' rel='bookmark' title='[PHP] 論理演算子「and, or」と「&amp;&amp;, ||」の違い'>[PHP] 論理演算子「and, or」と「&#038;&#038;, ||」の違い</a></li>
<li><a href='http://screw-axis.com/2011/12/20/jquery-mobile-photoswipe/' rel='bookmark' title='[jQuery Mobile] PhotoSwipeプラグイン'>[jQuery Mobile] PhotoSwipeプラグイン</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://screw-axis.com/2009/05/17/javascript%e3%81%aenull%e3%81%a8undefined%e3%81%a8false%e3%81%a80%e3%81%a8%e7%a9%ba%e6%96%87%e5%ad%97%e3%81%a8/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

