<?xml version="1.0" encoding="utf-8" ?><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" 
			xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" 
			xmlns:cc="http://web.resource.org/cc/" xml:lang="ja">
<channel rdf:about="http://hkom.blog1.fc2.com/?xml">
<title>anything from here</title>
<link>http://hkom.blog1.fc2.com/</link>
<description>CSSやJavascript自習の苦闘史を綴っていきたい。</description>
<dc:language>ja</dc:language>
<items>
<rdf:Seq>
<rdf:li rdf:resource="http://hkom.blog1.fc2.com/blog-entry-760.html" />
<rdf:li rdf:resource="http://hkom.blog1.fc2.com/blog-entry-759.html" />
<rdf:li rdf:resource="http://hkom.blog1.fc2.com/blog-entry-758.html" />
<rdf:li rdf:resource="http://hkom.blog1.fc2.com/blog-entry-757.html" />
<rdf:li rdf:resource="http://hkom.blog1.fc2.com/blog-entry-756.html" />
<rdf:li rdf:resource="http://hkom.blog1.fc2.com/blog-entry-755.html" />
<rdf:li rdf:resource="http://hkom.blog1.fc2.com/blog-entry-754.html" />
<rdf:li rdf:resource="http://hkom.blog1.fc2.com/blog-entry-753.html" />
<rdf:li rdf:resource="http://hkom.blog1.fc2.com/blog-entry-752.html" />
<rdf:li rdf:resource="http://hkom.blog1.fc2.com/blog-entry-751.html" />
<rdf:li rdf:resource="http://hkom.blog1.fc2.com/blog-entry-750.html" />
<rdf:li rdf:resource="http://hkom.blog1.fc2.com/blog-entry-749.html" />
<rdf:li rdf:resource="http://hkom.blog1.fc2.com/blog-entry-748.html" />
<rdf:li rdf:resource="http://hkom.blog1.fc2.com/blog-entry-747.html" />
<rdf:li rdf:resource="http://hkom.blog1.fc2.com/blog-entry-746.html" />
<rdf:li rdf:resource="http://hkom.blog1.fc2.com/blog-entry-745.html" />
<rdf:li rdf:resource="http://hkom.blog1.fc2.com/blog-entry-744.html" />
<rdf:li rdf:resource="http://hkom.blog1.fc2.com/blog-entry-743.html" />
<rdf:li rdf:resource="http://hkom.blog1.fc2.com/blog-entry-742.html" />
<rdf:li rdf:resource="http://hkom.blog1.fc2.com/blog-entry-741.html" />
<rdf:li rdf:resource="http://hkom.blog1.fc2.com/blog-entry-740.html" />
</rdf:Seq>
</items>
</channel>
<item rdf:about="http://hkom.blog1.fc2.com/blog-entry-760.html">
<link>http://hkom.blog1.fc2.com/blog-entry-760.html</link>
<title>Navigate Bar に係る Ajax Javascript コードを見直した。</title>
<description> Navigate Bar を改善した
ここで言うところの Navigate Bar とは、各エントリイ最上部付近に表示している「 直前のEntry(4) | ホーム(5) |  直後のEntry(6) 」のことである。
「改善した」と言ってもそのバーの見た目は全く変えていない。
このバーは、3 つの文字列の上にマウスカーソルを載せると、直前の10本の記事タイトル、または最近の10本の記事タイトル、または直後の10本の記事タイトルを、それぞれの文字列に対応して
 </description>
<content:encoded>
<![CDATA[ <h4 class="addBgImg">Navigate Bar を改善した</h4>
<p>ここで言うところの Navigate Bar とは、各エントリイ最上部付近に表示している「 直前のEntry(4) | ホーム(5) |  直後のEntry(6) 」のことである。</p>
<p>「改善した」と言ってもそのバーの見た目は全く変えていない。</p>
<p>このバーは、3 つの文字列の上にマウスカーソルを載せると、直前の10本の記事タイトル、または最近の10本の記事タイトル、または直後の10本の記事タイトルを、それぞれの文字列に対応して表示するためのものだ。この表示に jquery.js の Ajax 関係コードを利用していることは改めて触れるまでもないだろう。</p>
<p>今回その表示 / 隠蔽方法を jquery.js で提供されている fadeIn / Out メソッドに変更したのであるが、変更はそれだけではない。</p>
<p class="mt_1">記事リストの表示位置は以前と全く変えていないが、その表示/隠蔽コードを全面的に見直し、エントリイ番号 750 ～ 754 において解読した offset、position、innerWidth/Height、outerWidth/Height メソッドを積極的に利用するように改訂したのだ。</p>
<p>これによりコードがすっきりしたことは言うまでもないが、一連の位置・サイズ関連メソッドの利用実績を重ねることに意義があった。</p>
<p>そして案の定、実際に利用してみて貴重な成果を得ることが出来た。</p>

<h4 class="addBgImg">IE における jQuery("A").css("marginTop") 返値の特異性</h4>
<p>或る HTML 要素 A （ この要素は position：absolute ; に指定されていると仮定する）の margin-top 値を、スタイルシートにおいて margin-tpo:0; に指定したと仮定する。すると、誰しもその場合には jQuery("A").css("marginTop") は ゼロを返すと予想する。実際 Firefox ではきちんとゼロを返す。</p>
<p class="mt_1">ところが IE8（標準モードで描画した）では、何と auto が返される。これは明らかなバグであるが、このことによって、Navigate Bar に関するコードのエラー原因がなかなか掴めず、エラー箇所の特定にこの土日を費やしてしまったのである。</p>
<p class="mt_1">またしても IE 対策に時間が割かれ、恨めしい思いだけが残ったのだ。</p>
<p>IE よ。Microsoftよ。いい加減にしてくれ！！！！──と絶叫したい。</p> ]]>
</content:encoded>
<dc:subject>Javascript</dc:subject>
<dc:date>2010-02-08T00:35:49+09:00</dc:date>
<dc:creator>hkom</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://hkom.blog1.fc2.com/blog-entry-759.html">
<link>http://hkom.blog1.fc2.com/blog-entry-759.html</link>
<title>Fc2 ブログのファイル上書きアップロードについて（続編）</title>
<description> どうやら改善が図られたようだ
Fc2 ブログのファイルの上書きアップロードは相変わらず正常に機能していない ← こちらのエントリイで、「相変わらず」上書きアップロードが出来ないことを嘆き、抗議的記事を書いた。
しかし、その後使っていてどうやらやっと改善が図られた模様なので、Fc2 社の名誉のためにもその旨を報告するエントリイを、敢えて記述することにする。

改善の内容
ここ数日、ファイル上書きアップロードを
 </description>
<content:encoded>
<![CDATA[ <h4 class="addBgImg">どうやら改善が図られたようだ</h4>
<p><a href="http://hkom.blog1.fc2.com/blog-entry-757.html" target="_blank">Fc2 ブログのファイルの上書きアップロードは相変わらず正常に機能していない</a> ← こちらのエントリイで、「相変わらず」上書きアップロードが出来ないことを嘆き、抗議的記事を書いた。</p>
<p class="mt_1">しかし、その後使っていてどうやらやっと改善が図られた模様なので、Fc2 社の名誉のためにもその旨を報告するエントリイを、敢えて記述することにする。</p>

<h4 class="addBgImg">改善の内容</h4>
<p>ここ数日、ファイル上書きアップロードを複数回使ってみて、上書きアップロードの不備改善は次のように図られた、と言えるのではないかと思う。</p>
<ul class="ml_2 pl_0">
<li>上書きアップロードをしようとすると、かなり五月蠅くて適わないのだが、「上書きしますか？」と確認するダイアログが表示される。</li>
<li>上書き結果は即座には反映されず、一定の時間が経過してから反映される。</li>
<li>その反映時間は数分なのか、数十分なのか確定的には分からないが、経験的には数分と言えるようだ。</li></ul>
 ]]>
</content:encoded>
<dc:subject>Blog</dc:subject>
<dc:date>2010-02-07T23:58:24+09:00</dc:date>
<dc:creator>hkom</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://hkom.blog1.fc2.com/blog-entry-758.html">
<link>http://hkom.blog1.fc2.com/blog-entry-758.html</link>
<title>今更であるが...IE8 の Web 標準 ( W3C ) 準拠モードと 2 つの互換モードについて（メモ）</title>
<description> IE はまだ存命す
インターネットエクスプローラ（以下 IE ）の性能と評判の悪さはよく知られているところである。他方、それにも拘わらず IE のシェアが恐ろしく鈍い速度でしか低下しない。（ それでも一時の「 80 ％以上 」という異常な状況は改善され、確実に低下していることは喜ばしい。）
IE7 登場前の一時期には、評判の悪い IE 6 が改善されぬママ長い間「放置」されていたことから、「 MS 社はブラウザ開発から撤退か？ 
 </description>
<content:encoded>
<![CDATA[ <h4 class="addBgImg">IE はまだ存命す</h4>
<p>インターネットエクスプローラ（以下 IE ）の性能と評判の悪さはよく知られているところである。他方、それにも拘わらず IE のシェアが恐ろしく鈍い速度でしか低下しない。（ それでも一時の「 80 ％以上 」という異常な状況は改善され、確実に低下していることは喜ばしい。）</p>
<p>IE7 登場前の一時期には、評判の悪い IE 6 が改善されぬママ長い間「放置」されていたことから、「 MS 社はブラウザ開発から撤退か？ 」の観測も流れたことがあった。しかし幸か不幸か、IE 7 が登場してしまい、その後現時点の最新バージョンである IE 8 迄登場してしまった。かくして撤退観測は願望的予測として裏切られてしまった。</p>
<p class="mt_1">さて、IE 8 の描画モードであるが、これがややこしいことになっている───ということを、恥ずかしながら最近まで知らずにいた。</p>
<p>このブログを立ち上げた時点で、ブラウザの表示は標準と後方互換という２種類のモードがあることを学習し、努めて標準モードで描画されるようなHTML 文を書くように心掛けてきたつもりだ。</p>
<p>そして、一貫して W3C 準拠を拒絶しつづけて来た IE が、IE 8 において遂に匙を投げ、W3C の軍門に下ったことを喜びをもって歓迎した。しかし、IE 8 に描画モードが３つ用意されていることは、寡聞にして知らぬママ現在に至ってしまった。</p>

<h4 class="addBgImg">またまたやってくれた MS 社───ややこしいったらありゃしねえ</h4>
<p class="ml_2 point2">以下の記事は、<a href="http://www.atmarkit.co.jp/fdotnet/special/ie8review/ie8review_01.html" target="_blank">Internet Explorer 8正式版レビュー － ＠IT</a> に多くを負っている。</p>
<p class="mt_1">W3C 準拠をここ迄遅延させてきた結果、自ら蒔き散らしてきた W3C 非準拠ブラウザが大量に出回り、未だに多くの利用者がそれを使っている異常事態が存在している。</p>
<p>まさか自動車のようにリコールするわけにも行かず、苦肉の策として 3 つのモードを用意せざるを得なかったわけだ。</p>
<p>IE 8 には次のように 3 つの描画モードが存在している。</p>
<ul class="pl_0 ml_2">
	<li>IE8標準モード（IE8標準、完全な標準CSS）</li>
	<li>IE7互換モード（IE7標準、IE7互換の標準CSS）</li>
	<li>Quirksモード（IE5標準、MS-CSS 5／6／7対応）</li>
</ul>
<p>IE 8 には (1) W3C 準拠モード＝IE 8 標準モード、(2) IE 7 標準モード、(3) IE 5/6 互換モードの 3 種類が存在している。そして (2) のIE 7 互換モードがこれまでのブラウザにはない第三の選択肢であり、特殊なモードだ。</p>
<p class="mt_1">ここからややこしさが始まる。これらの 3 つの描画モードを指定する IE 8 独自の方法（ またしてもやってくれたわけだ。IE 独自がまたまた登場したのだから ）が存在するということと、サイト閲覧者が (1)と(2) のモードを IE 8 上で切り替えられる、ということだ。</p>
<p class="mt_1">或る頁を IE 8 で描画した場合、DOCTYPE 宣言内容やその有無によって  (1) 標準モードと (3) 後方互換モードを切り替えられるが、(2) のIE 7 標準モードは X-UA-Compatible meta タグを指定するという IE 8 固有の特殊な方法によって指定する。</p>
<p>しかも、(1) の W3C 準拠モードで作成された Web サイトを、IE 8 で閲覧する場合、閲覧者がブラウザ上で容易に (2) の IE 7 標準モードに切り替えることが出来、かつ、二度目以降の当該サイト閲覧時には、以前に同じ閲覧者が指定した IE 7 標準モードでそのサイトが描画されるのである。一旦、IE 7 標準モードに切り替えてしまうと、以後には当該サイトは切り替えられたモードで描画される「出血サービス」迄付いているわけだ。</p>
<p class="ta_r"><a title="ページトップへ" class="Back2Top">▲ToTop</a></p>

<h4 class="addBgImg">meta タグによる 6 種類の IE 8 描画モード指定</h4>
<p>meta タグに拠る描画モードの指定は次のように行うそうだが、この value 値がかなりややこしい。<br />
&lt;meta http-equiv="X-UA-Compatible" content="IE=value" /&gt;<br /></p>
<p>value には次の 6 つの値のいずれかが指定できる。</p>
<dl class="ml_1 point2">
	<dt class="lime">edge</dt><dd class="ml_2">最新（IE 9 が登場すればその標準モードで描画し、現時点では DOCTYPE 宣言有無には関係なくIE 8 標準モードで描画する。）</dd>
	<dt class="lime">emulateIE8</dt><dd class="ml_2">DOCTYPE 宣言がない場合には後方互換モードになり、ある場合にはその指定に従う。</dd>
	<dt class="lime">8</dt><dd class="ml_2">DOCTYPE 宣言の有無に拘わらず常にIE 8 標準モードで描画する。</dd>
	<dt class="lime">emulateIE7</dt><dd class="ml_2">DOCTYPE 宣言がない場合には後方互換モードになり、ある場合には、IE 7 標準モードで描画する。</dd>
	<dt class="lime">7</dt><dd class="ml_2">DOCTYPE 宣言の有無に拘わらず常にIE 7 標準モードで描画する。</dd>
	<dt class="lime">5</dt><dd class="ml_2">今日でいうところの後方互換モードで描画する。</dd>
</dl>
<p class="mt_1">常に IE8 標準で、あるいは IE7 標準で描画する content 指定が用意されているが、これは裏返せば DOCTYPE 宣言を無効化することになる。</p>
<p>W3C 標準準拠を拒絶し続けてきた過去の遺産の「継承性」に責任を負わざるを得ない顛末が、またしても W3C 勧告にはない IE 固有の方法を実装せざるを得ないという、何とも奇怪な対応策を招いてしまったのだ。</p>

<h4 class="addBgImg">IE の各種描画モードによる差異を視覚的に把握するツール</h4>
<p>エントリイ冒頭で触れた <a href="http://www.atmarkit.co.jp/fdotnet/special/ie8review/ie8review_01.html" target="_blank">Internet Explorer 8正式版レビュー － ＠IT</a> に紹介されている、<a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=8e6ac106-525d-45d0-84db-dccff3fae677&displaylang=en" target="_blank">Expression Web 3 Super Preview for Internet Explorer</a> を使ってみたが、それよりも遙かに優れたツールが Core Services 社から提供されている。 （ Core Services 社は、Javascript デバッグツール Companion J や Web 頁チェッカー DebugBar を提供しているフランスの会社らしい。）</p>
<p class="mt_1">それは IE Tester だ。<a href="http://www.my-debugbar.com/wiki/IETester/HomePage" target="_blank">My DebugBar | IETester / Browser Compatibility Check for Internet Explorer Versions from 5.5 to 8</a></p><p>実際に使ってみたところ、時々「落ちてしまう」基礎的欠陥はあるものの、バージョンによる描画状態の差異を比較するには、十分快適に使えると思われる。</p>

<h4 class="addBgImg">現在閲覧している homepage の描画モードを取得するブックマークレット</h4>
<p>エントリイ冒頭で触れた <a href="http://www.atmarkit.co.jp/fdotnet/special/ie8review/ie8review_01.html" target="_blank">Internet Explorer 8正式版レビュー － ＠IT</a> に紹介されている、IE の描画モードを取得するスクリプトをブックマークレットにしてみた。</p>
<pre class="point ml_1 lh_11 ov_a">■IE の描画モード取得ブックマークレット
(function(){var renderingMode = document.documentMode;
alert("現在のレンダリング・モードは「" + renderingMode + "」です。");})();</pre>
<div class="ta_c mt_1"><button id="btn758-1" class="larger pink">描画モード取得ブックマークレットを実行する</button></div>
<script type="text/javascript">//<!--
	$("#btn758-1").click(
		function(){
			var renderingMode = document.documentMode;
			alert("現在のレンダリング・モードは「" + renderingMode + "」です。");
			$(this).blur();
		}
	).css("backgroundColor","navy");
//--></script> ]]>
</content:encoded>
<dc:subject>テンプレート編集</dc:subject>
<dc:date>2010-02-07T12:18:49+09:00</dc:date>
<dc:creator>hkom</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://hkom.blog1.fc2.com/blog-entry-757.html">
<link>http://hkom.blog1.fc2.com/blog-entry-757.html</link>
<title>Fc2 ブログのファイルの上書きアップロードは相変わらず正常に機能していない</title>
<description> Done Message「上書きしました」は何なんだ！？
ファイル上書き行為を履行すると、上書き確認ダイアログが表示され、その行為が終わると「上書きしました」と履行済みメッセージがファイルアップロード頁内に発せられる。
にもかかわらず、結局上書きは行われないのだ。
そもそも、上書き確認ダイアログは数日前からやっと表示されるようになった新機能だ。そして数日前には、複数のファイルにおいて、問題なく上書きが出来たこ
 </description>
<content:encoded>
<![CDATA[ <h4 class="addBgImg">Done Message「上書きしました」は何なんだ！？</h4>
<p>ファイル上書き行為を履行すると、上書き確認ダイアログが表示され、その行為が終わると「上書きしました」と履行済みメッセージがファイルアップロード頁内に発せられる。</p>
<p>にもかかわらず、結局上書きは行われないのだ。</p>
<p class="mt_1">そもそも、上書き確認ダイアログは数日前からやっと表示されるようになった新機能だ。そして数日前には、複数のファイルにおいて、問題なく上書きが出来たことも何回かあった。</p>
<p>しかし、上書き確認メッセージと上書き完了メッセージは表示されるのに、昨日も本日も上書き出来ない。</p>
<p>一体どうなっているのか？？</p>
<h4 class="addBgImg">ファイル上書きアップロードは、いつになったら正常に機能するのだろう</h4>
<p>この問題は数年前から、<a href="http://blog.fc2.com/forum/" target="_blank">FC2ブログ ユーザーフォーラム</a>  で相当の数の投稿がやりとりされてきたが、未だに解決しないようだ。</p>
<p>一体何時になったら正常に機能するのだろうか？</p>
<p>基本機能がこのように不十分なまま放置されることは、いかに無料サービスとは言え余りにユーザー軽視ではないだろうか！</p> ]]>
</content:encoded>
<dc:subject>Blog</dc:subject>
<dc:date>2010-02-04T07:55:44+09:00</dc:date>
<dc:creator>hkom</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://hkom.blog1.fc2.com/blog-entry-756.html">
<link>http://hkom.blog1.fc2.com/blog-entry-756.html</link>
<title>DropBox　を複数人の、複数のパソコンや　iPhone　で共用する　SFS</title>
<description> その存在は数年前から知っていたが、殆ど利用しなかったのは...
その理由は単純だ。複数の PC や複数の人と共有すべきファイルが余り存在しなかったからである。そのため複数のパソコンでファイル共有する場合には、主に usb メモリ経由で同期化を図ってきた。それで十分だったのだ。
しかし、この度或る事情により、ファイル共有を複数の人と複数の PC や iPhone において行う必要に迫られて、改めて DropBox を利用することに
 </description>
<content:encoded>
<![CDATA[ <h4 class="addBgImg">その存在は数年前から知っていたが、殆ど利用しなかったのは...</h4>
<p>その理由は単純だ。複数の PC や複数の人と共有すべきファイルが余り存在しなかったからである。そのため複数のパソコンでファイル共有する場合には、主に usb メモリ経由で同期化を図ってきた。それで十分だったのだ。</p>
<p>しかし、この度或る事情により、ファイル共有を複数の人と複数の PC や iPhone において行う必要に迫られて、改めて DropBox を利用することにした。</p>
<p class="mt_1">早速自宅 PC 内にストックされているあるフォルダとファイル約 115 MB を DropBox に「入れた」。つまりオンラインストレージに送信したのである。</p>
<p>そしてその子フォルダを持つフォルダを共有化し、複数のメルアドを「招待」した。招待先に自分の iPhone アドレスを含めたことは言うまでもない。</p>

<h4 class="addBgImg"> DropBox を介した情報共有はいわばソーシャルフォルダシステム(SFS)と言える</h4>
<p>DropBox からの「招待状」は直ぐに届いたので、さっそくこれを承諾した。</p>
<p>すると、数分の内に子フォルダを持つフォルダ内の全てのファイル 115 MB が、iPhone にダウンロードされ、同期が図られた。</p>
<p class="mt_1">こうして、自宅 PC、我が iPhone、我が DropBox の MyFoleder、及びその他の招待者のPC の、都合 4 つ以上の「媒体」に、同一のファイルが保存され、常に自動同期が図られることになったのである。 </p>
<p class="mt_1">さて、DropBox を介した情報共有のあり方は、まだ共有する他人は少ないものの、いわばソーシャルフォルダによる社会的情報共有と言うことが出来る───ということに改めて気がついたのである。</p>
<p>SMS に準えて言えば、このシステムは SFS と言える。SDS ： ソーシャルディスクシステムと言っても良いだろう。</p>
<p>新しい社会的な情報共有ツールとして、DropBox を積極的に位置づけ利用することが出来る、ということを改めて認識した次第である。</p>
 ]]>
</content:encoded>
<dc:subject>IT</dc:subject>
<dc:date>2010-02-01T03:13:53+09:00</dc:date>
<dc:creator>hkom</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://hkom.blog1.fc2.com/blog-entry-755.html">
<link>http://hkom.blog1.fc2.com/blog-entry-755.html</link>
<title>Android 携帯端末  ドコモ「Xperia」 登場</title>
<description> 「スマートフォン戦争」の狼煙あがる！
1 月 21 日、ついにそれが出た！ 日本におけるスマートフォンの本格的普及＝「スマートフォン戦争」の火ぶたが切られたのだ。
iPhone が一人勝ちした 2009 年は、日本の「スマートフォン元年」と言って良いだろう。
そして、一人勝ち故の競争の欠如が、Apple と ソフトバンクを奢らせていることは間違いない。
その意味で､競争が始まるとすればユーザーから見れば歓迎すべきことに違いな
 </description>
<content:encoded>
<![CDATA[ <h4 class="addBgImg">「スマートフォン戦争」の狼煙あがる！</h4>
<p>1 月 21 日、ついにそれが出た！ 日本におけるスマートフォンの本格的普及＝「スマートフォン戦争」の火ぶたが切られたのだ。</p>
<p>iPhone が一人勝ちした 2009 年は、日本の「スマートフォン元年」と言って良いだろう。</p>
<p>そして、一人勝ち故の競争の欠如が、Apple と ソフトバンクを奢らせていることは間違いない。</p>
<p>その意味で､競争が始まるとすればユーザーから見れば歓迎すべきことに違いない。</p>
<p>iPhone キラーは <a href="http://japan.cnet.com/review/editors/story/0,3800080080,20407069,00.htm?tag=nl" target="_blank">iPhoneか、Xperiaか？--ドコモ「Xperia」ファーストインプレッション:レビュー - CNET Japan</a> に紹介されている。</p>
<p>iPhone との大きさやデザイン比較は、<a href="http://weekly.ascii.jp/elem/000/000/015/15138/" target="_blank">iPhoneキラー『ドコモ スマートフォン Xperia SO-01B(Xperia X10)』業界最速動画レポート！</a> に掲載されている写真が参考になるし、同サイトからアクセス出来る you tubeの各種動画も商品理解を深める。例えばこれなど。</p>
<p class="ta_c"><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/m19Lu-JUW1Q&color1=0xb1b1b1&color2=0xcfcfcf&hl=ja_JP&feature=player_embedded&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowScriptAccess" value="always"></param><embed src="http://www.youtube.com/v/m19Lu-JUW1Q&color1=0xb1b1b1&color2=0xcfcfcf&hl=ja_JP&feature=player_embedded&fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="425" height="344"></embed></object></p>
<p class="mt_1">注目の料金は、”パケ・ホーダイ ダブル”のスマートフォン定額通信料で月額 5,985 円だそうだから、割引なしの iPhone 定額通信料よりも約千円安い。</p>
<p>そしてカメラ解像度は日本では非常識な iPhone の 300M に比べて 810M と十分だし、何よりも落としやすいサイズなのにストラップ穴のない iPhone がデザイン偏重の自己陶酔主義であるのに対して、Xperia はしっかりストラップが付けられるのも素晴らしい。</p><p>要するに、Xperia は日本の実情を踏まえた「KAIZEN」が施されていると言えるだろう。</p>
<p class="mt_1">そしてデザインなども重要な要素だが、何よりも重要なことは競争によって定額通信料が少しでも安くなることだ。それこそが、iPhone の伸びを＜天文学的水準＞にまで到達させなかった原因であり、第 2 のスマートフォン Xperia も初期価格及びランニングコストで魅力がなければ、高嶺の花とならざるを得ない。</p>
<p class="mt_1">何よりも通信料の値下げを強く、強く望みたい。</p>

<h4 class="addBgImg">iPhone に対する Xperia は Mac に対する Windows か</h4>
<p>先行した Mac を Windows が追いかけ、追い抜いたように、Xperia は iPhone を凌駕するのだろうか？</p><p>否、一世を風靡したウォークマンが iPod によって、僅か 1 年でシェアを奪われてしまった恨みを晴らすように、Xperia （ Sony Ericsson 製 ）が iPhone の牙城を崩し、トップシェアを奪うのだろうか？</p>
<p>それとも、iPhone が引き続き独走し続けるのだろうか？</p>
<p class="mt_1">野次馬的興味は尽きない。</p>
 ]]>
</content:encoded>
<dc:subject>モバイル</dc:subject>
<dc:date>2010-01-26T22:10:29+09:00</dc:date>
<dc:creator>hkom</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://hkom.blog1.fc2.com/blog-entry-754.html">
<link>http://hkom.blog1.fc2.com/blog-entry-754.html</link>
<title>jquery.js が 1.4 にアップデート</title>
<description> それは恒例行事となった
確か 1 月 14 日が jquery.js の誕生日なのだそうだ。
そして、毎年、その時が来ると確実にバージョンアップが重ねられてきた。
今年も同様に、1.3.2 から 1.4 へとバージョンアップされ、非圧縮ファイルでは 何と 6000 行を数えるまでに巨大化した。
さて、現在進行中の「 HTML 要素の位置・サイズ取得に関わるメソッド等の解読 」作業に当たって、1.3.2 でほぼ作業を終えていたのだが、折角バージョ
 </description>
<content:encoded>
<![CDATA[ <h4 class="addBgImg">それは恒例行事となった</h4>
<p>確か 1 月 14 日が jquery.js の誕生日なのだそうだ。</p>
<p>そして、毎年、その時が来ると確実にバージョンアップが重ねられてきた。</p>
<p>今年も同様に、1.3.2 から 1.4 へとバージョンアップされ、非圧縮ファイルでは 何と 6000 行を数えるまでに巨大化した。</p>
<p class="mt_1">さて、現在進行中の「 HTML 要素の位置・サイズ取得に関わるメソッド等の解読 」作業に当たって、1.3.2 でほぼ作業を終えていたのだが、折角バージョンアップされたのだからと、大変なルーティンワークだったが、「 HTML 要素の位置・サイズ取得に関わるメソッド等の解読 」に係るエントリイ（エントリイNo.749 ～753）を、全て 最新版の 1.4 対応に改訂した。</p>
<p class="mt_1">その改訂作業を行いながら気になったのだが、今回のバージョンアップでは、かなり堅実な記法が採用されていることだ。if 条件 を適用する行が 1 行しかなくても（必要ないのに） { } で括ったり、余り必要ないと思われる箇所でも this[0] をわざわざ elem 変数に代入したり、不要と思われる過剰な記述が目立つのだ。</p>
<p>これはおそらく、バグチェックしやすいように、確実な記法を採用した結果と思われるが、クールな記法が特徴だった jquery.js だけに、何故か寂しい気がする。</p>

<h4 class="addBgImg">ますます巨大化する jquery</h4>
<p>しかも、jquery.js は年々巨大化している。致し方ないこととは言え、今後も止まることなく巨大化を続けていくのだろうか？</p>
<p>機能の豊富さをキャッチアップしていくこと自体、大変な手間であり、そのことが利用のハードルを高くするのではないか、と懸念する。</p>
<p class="mt_1">例えば、簡易版のようなものを検討する必要があるのではなかろうか、とさえ思えてくる。まあ、そのようなものとして使える core.js があるが...</p>

<h4 class="addBgImg">豊富な機能に圧倒されつつ...</h4>
<p>それでも食らいついて、キャッチアップしようと必死になっているのは、jquery.js が javascript 学習の「教科書的」存在と言えるからである。</p>
<p>その存在を知り、大胆不敵にも解読しようと決意したのは、2007 年 10 月だった。</p>
<p>そして、その存在を知るまでと、2 年余の学習を重ねてきた現在とを比べれば、Javascript に関する知識とその利用度合いは、幼稚園児と大学生程の天地の差が付いている。我ながら嬉しい驚きを覚えるほどだ。</p>
<p>そのような進化を遂げることが出来たのは、偏に jquery.js に食らいき、それを何とか理解してやろう、そして理解した上で jquery.js を利用して縦横無尽にコードを書いてみたい、という単純であるが、強い欲求の結果に他ならない。</p>
<p class="mt_1">今後もますます巨大化し、多機能化することは間違いないだろうが、引き続き食らいついて行こう、と決意を新たにしている昨今である。</p> ]]>
</content:encoded>
<dc:subject>Javascript</dc:subject>
<dc:date>2010-01-25T01:28:04+09:00</dc:date>
<dc:creator>hkom</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://hkom.blog1.fc2.com/blog-entry-753.html">
<link>http://hkom.blog1.fc2.com/blog-entry-753.html</link>
<title>jquery.js (1.4)  による要素位置の測定と適正な配置 (5)  コード解読 (4)</title>
<description> jQuery.offset……適正な配置 (2) コード解読 (1) で解読済み
jQuery().offset……適正な配置 (2) コード解読 (1) で解読済み
jQuery().position……適正な配置 (3) コード解読 (2) で解読済み
jQuery().offsetParent……適正な配置 (3) コード解読 (2) で解読済み
jQuery().scrollLeft……適正な配置 (4) コード解読 (3) で解読済み
jQuery().scrollTop……適正な配置 (4) コード解読 (3) で解読済み
jQuery().innerHeight……このエント
 </description>
<content:encoded>
<![CDATA[ <div class="point ml_2 mr_3 lh_11"><ol class="ml_0 pl_3 mt_0 mb_0">
<li>jQuery.offset……<a href="http://hkom.blog1.fc2.com/blog-entry-750.html" target="_blank">適正な配置 (2) コード解読 (1) で解読済み</a></li>
<li>jQuery().offset……<a href="http://hkom.blog1.fc2.com/blog-entry-750.html" target="_blank">適正な配置 (2) コード解読 (1) で解読済み</a></li>
<li>jQuery().position……<a href="http://hkom.blog1.fc2.com/blog-entry-751.html" target="_blank">適正な配置 (3) コード解読 (2) で解読済み</a></li>
<li>jQuery().offsetParent……<a href="http://hkom.blog1.fc2.com/blog-entry-751.html" target="_blank">適正な配置 (3) コード解読 (2) で解読済み</a></li>
<li>jQuery().scrollLeft……<a href="http://hkom.blog1.fc2.com/blog-entry-752.html" target="_blank">適正な配置 (4) コード解読 (3) で解読済み</a></li>
<li>jQuery().scrollTop……<a href="http://hkom.blog1.fc2.com/blog-entry-752.html" target="_blank">適正な配置 (4) コード解読 (3) で解読済み</a></li>
<li><span class="pink">jQuery().innerHeight</span>……このエントリイで解読します</li>
<li><span class="pink">jQuery().innerWidth</span>……このエントリイで解読します</li>
<li><span class="pink">jQuery().outerHeight</span>……このエントリイで解読します</li>
<li><span class="pink">jQuery().outerWidth</span>……このエントリイで解読します</li>
<li><span class="pink">jQuery().height</span>……このエントリイで解読します</li>
<li><span class="pink">jQuery().width</span>……このエントリイで解読します</li>
</ol></div>

<h4 class="addBgImg">jQuery().innerHeight()/innerWidth()/outerHeight()/outerWidth() メソッド、並びに jQuery().height()/widdth() メソッドの概要</h4>
<div class="f_l" style="width:400px">
<p>これらの 6 つのインスタンスメソッドは、HTML 要素の大きさを計測するか、あるいは大きさを指定するメソッドです。（サイズ指定は、height 及び width メソッドのみ。つまり content だけがサイズ指定できる。）</p>
<p class="mt_1">まず、以上のメソッドを分かりやすく図解してみました。横幅の説明だけですが、敢えて煩雑にしてまで縦方向を示す必要はないでしょう。</p>
<p>これらのメソッドが、W3C 勧告の視覚整形モデルに準拠したボックスの各部寸法を取得するためのものであることは、図から一目瞭然です。</p>
</div>
<p class="f_r"><img src="http://blog-imgs-30.fc2.com/h/k/o/hkom/jQuery()-mesureSize.gif" alt="各メソッドのサイズ測定箇所図" border="0" width="271" height="307" /></p>
<dl class="c_b">
<dt class="borderLeft10"><em>jQuery().innerHeight()/innerWidth()</em></dt>
<dd class="ml_2">HTML 要素の <span class="pink">padding 辺間のサイズを計測する</span>読み取り専用メソッドで、返値は全て単位なしのピクセル数となります。</dd>
<dt class="borderLeft10"><em>jQuery().outerHeight(margin)/outerWidth(margin)</em></dt>
<dd class="ml_2">引数 margin が true の場合には、HTML 要素の <span class="pink">margin 辺間のサイズを計測する</span>読み取り専用メソッドとなり、引数がないか false の場合には、HTML 要素の <span class="pink">border 辺間のサイズを計測する</span>読み取り専用メソッドとなります。ここに、返値は全て単位なしのピクセル数となります。</dd>
<dt class="borderLeft10"><em>jQuery().height(size)、jQuery().width(size)</em></dt>
<dd class="ml_2">引数がある場合には、HTML 要素の <span class="pink">content の高さや幅を指定</span>し、そのサイズで表示させます。その際の指定単位は px に限定されず、適正な文字列ならば em ％など他の単位も使用できます。<br />他方、引数がない場合には、HTML 要素の <span class="pink">content の高さや幅の、単位なしのピクセル数を取得</span>します。</dd>
</dl>
<h4 class="addBgImg c_b">jQuery().innerHeight()/innerWidth()/outerHeight()/outerWidth() メソッド、並びに jQuery().height()/widdth() メソッドのコード解読</h4>
<p>これらのメソッドは 1 つの jQuery.each クラスメソッド内で定義されています。</p>
<p>このクラスメソッド内では、三項演算子が頻繁かつ多重的に使用されており、全体で 50 行近い長いコードとなっています。</p>
<p class="mt_1">これらのメソッドは html 要素に適用できるので、ページ内の各要素のサイズ計測に利用できることは勿論ですが、window、body、document などの頁等の全体を指す要素に対して適用して、文書全体の高さや window の横幅などの情報を得ることも出来ます。</p>
<pre class="point ml_1 lh_11 ov_a h_500">5946:// Create innerHeight, innerWidth, outerHeight and outerWidth methods
　　 <span class="aquamarine">// 'Height' と 'Width' を対象として巡回走査する</span>
5947:jQuery.each([ "Height", "Width" ], function(i, name){
5948:　<span class="aquamarine">// i が 1 の時には変数 tl に Leftを、i が 0 の時には Top を代入する。</span>
5949:　var type = name.toLowerCase();
5950:
5951:　// innerHeight and innerWidth
　　　 <span class="aquamarine">// jQuery インスタンスメソッド innerHeight 及び innerWidth を定義する。</span>
5952:　jQuery.fn["inner" + name] = function(){
5953:　　return this[0] ? <span class="aquamarine">// インスタンスに HTML 要素が登録されていれば</span>
　　　　　 <span class="aquamarine">// 最初の HTML 要素の padding 辺までの height 又は width プロパティ値を取得する。</span>
　　　　　 <span class="aquamarine">// false 指定があるので算出スタイル値ではなく指定済みの CSS 値が取得される。</span>
5954:　　　jQuery.css( this[0], lower, false, "padding" ) :
5955:　　　null; <span class="aquamarine">// インスタンスに HTML 要素が登録されていなければ null 値を返す。</span>
5956:　};
5957:
5958:　// outerHeight and outerWidth
　　　 <span class="aquamarine">// jQuery インスタンスメソッド outerHeight 及び outerWidth を定義する。</span>
5959:　jQuery.fn["outer" + name] = function(margin) {
5960:　　return this[0] ? <span class="aquamarine">// インスタンスに HTML 要素が登録されていれば</span>
　　　　　 <span class="aquamarine">/* 引数が true ならばその margin 辺までの、引数が
　　　　　  * 無指定か false ならばその border 辺までの、height 又は width CSS
　　　　　  * スタイル値を取得する。ここでも false 指定があるので、算出スタイル値
　　　　　  * ではなく指定されている CSS スタイル値が取得される。
　　　　　  */</span>
5961:　　　jQuery.css( this[0], lower, false, margin ? "margin" : "border" ) :
5962:　　　null; <span class="aquamarine">// インスタンスに HTML 要素が登録されていなければ null 値を返す。</span>
5963:　};
5964:　
　　　 <span class="aquamarine">// jQuery インスタンスメソッド width() 及び height() を引数 size 付きで
　　　 // jQuery.prototype オブジェクトに登録する。</span>
5965:　jQuery.fn[ type ] = function( size ) {
5966:　　// Get window width or height
5967:　　var elem = this[0]; <span class="aquamarine">// インスタンスに登録されている最初の html 要素への参照</span>
5968:　　if ( !elem ) { <span class="aquamarine">// elem がない場合の処理である</span>
　　　　　 <span class="aquamarine">// 引数 size がなければ nullを返し、あれば jQuery インスタンスを返す。</span>
5969:　　　return size == null ? null : this;
5970:　　}
5971:　　<span class="aquamarine">// ＜ケース 1＞ elem が window の時には、</span>
5972:　　return ("scrollTo" in elem && elem.document) ?
　　　　　 // does it walk and quack like a window ?
　　　　　 <span class="aquamarine">// ↑ は慣用句なのでしょうか？意味が分かりません。</span>
5973:　　　// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
　　　　　 <span class="aquamarine">// 人は皆は、標準/互換モード判別に document.documentElement か document.bodyを使用する。</span>
　　　　　 <span class="aquamarine">// CSS1標準モードならば document.documentElement.clientHeight/clientWidth を</span>
5974:　　　elem.document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] ||
　　　　　 <span class="aquamarine">// 互換モードならば document.body.clientHeight/clientWidth を返す。</span>
5975:　　　document.body[ "client" + name ] :
5976:
5977:　　　// Get document width or height
　　　　　 <span class="aquamarine">// elem が document の場合</span>
5978:　　　(elem.nodeType === 9) ? // is it a document
5979:　　　　// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
　　　　　　 <span class="aquamarine">// scrollWidth/Height 値と offsetWidth/Height 値の大きい方を返す。</span>
5980:　　　　Math.max(
5981:　　　　　elem.document.documentElement["client" + name],
5982:　　　　　elem.body["scroll" + name], elem.document.documentElement["scroll" + name],
5983:　　　　　elem.body["offset" + name], elem.document.documentElement["offset" + name]
5984:　　　　) :
5985:
5986:　　　　// Get or set width or height on the element
　　　　　　 <span class="aquamarine">// ＜ケース 2＞ elem が window でない場合</span>
5987:　　　　size === undefined ? <span class="aquamarine">// ＜ケース 2-a＞引数 size が未定義の時には</span>
5988:　　　　　// Get width or height on the element
　　　　　　　 <span class="aquamarine">// elem の height 値 または width 値を px 単位付きで返す。</span>
5989:　　　　　jQuery.css( elem, type ) :
5980:
5991:　　　　　// Set the width or height on the element (default to pixels if value is unitless)
　　　　　　　 <span class="aquamarine">/* ＜ケース 2-b＞引数 size がある場合には
　　　　　　　  * インスタンスに登録されている HTML 要素の height 又は width 値を
　　　　　　　  * 引数が文字列型ならば size とし、引数が文字列型でないならば
　　　　　　　  * size に px 文字列を追加した値とする。
　　　　　　　  */</span>
5992:　　　　　this.css( type, typeof size === "string" ? size : size + "px" );
5993:　}; <span class="aquamarine">// 5965行の function はここまで</span>
5994:
5995:});</pre> ]]>
</content:encoded>
<dc:subject>Javascript</dc:subject>
<dc:date>2010-01-24T23:53:54+09:00</dc:date>
<dc:creator>hkom</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://hkom.blog1.fc2.com/blog-entry-752.html">
<link>http://hkom.blog1.fc2.com/blog-entry-752.html</link>
<title>jquery.js (1.4)  による要素位置の測定と適正な配置 (4)  コード解読 (3)</title>
<description> jQuery.offset……適正な配置 (2) コード解読 (1) で解読済み
jQuery().offset……適正な配置 (2) コード解読 (1) で解読済み
jQuery().position……適正な配置  (3) コード解読 (2) で解読済み
jQuery().offsetParent……適正な配置 (3) コード解読 (2) で解読済み
jQuery().scrollLeft……このエントリイで解読します
jQuery().scrollTop……このエントリイで解読します
jQuery().innerHeight
jQuery().innerWidth
jQuery().outerHei
 </description>
<content:encoded>
<![CDATA[ <div class="point ml_2 mr_3 lh_11"><ol class="ml_0 pl_3 mt_0 mb_0">
<li>jQuery.offset……<a href="http://hkom.blog1.fc2.com/blog-entry-750.html" target="_blank">適正な配置 (2) コード解読 (1) で解読済み</a></li>
<li>jQuery().offset……<a href="http://hkom.blog1.fc2.com/blog-entry-750.html" target="_blank">適正な配置 (2) コード解読 (1) で解読済み</a></li>
<li>jQuery().position……<a href="http://hkom.blog1.fc2.com/blog-entry-751.html" target="_blank">適正な配置  (3) コード解読 (2) で解読済み</a></li>
<li>jQuery().offsetParent……<a href="http://hkom.blog1.fc2.com/blog-entry-751.html" target="_blank">適正な配置 (3) コード解読 (2) で解読済み</a></li>
<li><span class="pink">jQuery().scrollLeft</span>……このエントリイで解読します</li>
<li><span class="pink">jQuery().scrollTop</span>……このエントリイで解読します</li>
<li>jQuery().innerHeight</li>
<li>jQuery().innerWidth</li>
<li>jQuery().outerHeight</li>
<li>jQuery().outerWidth</li>
<li>jQuery().height</li>
<li>jQuery().width</li>
</ol></div>
<h4 class="addBgImg">jQuery().scrollLeft(val)/.scrollTop(val) インスタンスメソッドの解読</h4>
<p>これらのメソッドは引数を 1 つ取ることが出来、引数 val がある場合には指定した値だけ、window または対象要素を横または縦にスクロールさせます。</p><p>引数がなければ window または対象要素の、横または縦のスクロール量（ピクセル値、単位はなし）を取得します。</p><p>返値は val がある場合には jQuery インスタンスオブジェクトであり、val がない場合には発生しているスクロールのピクセル数です。</p>
<p>ここに window または対象要素にスクロールバーがない場合、引数 val にゼロでない値を指定しても当然対象要素にスクロールは発生せず、インスタンスオブジェクトが返されます。一方、引数 val がない場合にはゼロが返されます。</p>
<p class="mt_1">なお、このメソッド定義では jQuery.each クラスメソッド内に、jQuery(xxx).each インスタンスメソッドが入れ子になっており、かつ this が多用されています。その意味では、いかにも jquery.js ならではの、興味深いコードとなっています。</p>
<pre class="point ml_1 lh_11 ov_a h_500">■jQuery().scrollTop()/scrollLeft() メソッドの解読
5901:// Create scrollLeft and scrollTop methods
　　 <span class="aquamarine">// 'Left' と 'Top' を対象として巡回走査</span>
5902:jQuery.each( ['Left', 'Top'], function(i, name) {
5903:　var method = 'scroll' + name; <span class="aquamarine">// 変数 method に 'scrollTop'、'scrollLeft'を順に代入</span>
5904:　<span class="aquamarine">// jQuery.prototype オブジェクトに scrollTop と scrollLeft メソッドを追加する</span>
5905:　jQuery.fn[ method ] = function(val) {
5906:　　var elem = this[0], win; <span class="aquamarine">// ローカル変数定義</span>
5907:　　<span class="aquamarine">// jQuery インスタンスに登録された HTML 要素がなければ何もしないで終わる</span>
5908:　　if ( !elem ) {
5909:	 　return null;
5910:　　}
5911:
5912:　　if ( val !== undefined ) { <span class="aquamarine">// ＜ケース1＞ 何らかの val が与えられている場合</span>
5913:　　　// Set the scroll offset <span class="aquamarine">スクロール値をセットする
　　　　　 // 'scrollTop' と 'scrollLeft'を巡回処理する。なお、この行の this は
　　　　　 // elem をプロパティとして持つ jQuery インスタンスを参照する。</span>
5914:　　　return this.each(function() {
5915:　　　　win = getWindow( this ); <span class="aquamarine">// 関数起動</span>
5916:
　　　　　　 <span class="aquamarine">// ＜ケース1-1＞ 登録要素が window ならば</span>
5917:　　　　if ( win ) {
5918:　　　　　win.scrollTo( <span class="aquamarine">// window.scrollTo メソッドを起動する</span>
　　　　　　　 　<span class="aquamarine">/*  win.scrollTo(val,jQuery(win).scrollTop())、
　　　　　　　 　 * 又は win.scrollTo(jQuery(win).scrollLeft(),val)
　　　　　　　 　 * を実行する。
　　　　　　　 　 */</span>
5919:　　　　　　!i ? val : jQuery(win).scrollLeft(),
5920:　　　　　　 i ? val : jQuery(win).scrollTop()
5921:　　　　　}):
5922:
5923:　　　　} else { <span class="aquamarine">// 登録要素が登録要素が window ではない場合</span>
5924:　　　　　this[mehod] = val; <span class="aquamarine">// 対象要素内でスクロールする。</span>
5925:　　　　}
5926:　　　});
5927:　　} else { <span class="aquamarine">// ＜ケース2＞ val が未定義の場合</span>
5928:　　　win = getWindow( elem );
5929:
5930:　　　// Return the scroll offset
　　　　　 <span class="aquamarine">/* ＜ケース2-1＞ 登録要素が window の場合
　　　　　  * win に pageXOffset プロパティが存在する場合には、
　　　　　  * i が 1 ならば win.pageYoffset を、i が 0 ならば win.pageXoffset を返す。
　　　　　  */</span>
5931:　　　return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
　　　　　　 　<span class="aquamarine">// jQuery.boxModel が true ならば document.documentElement[ method ] </span>
　　　　　　 　<span class="aquamarine">// プロパティ値を取得する。（これは IE の標準モードの場合に該当する）</span>
5932:　　　　　jQuery.boxModel && document.documentElement[ method ] ||
　　　　　　 　<span class="aquamarine">// さもなければ document.body[ method ] プロパティ値を取得する。
　　　　　　 　//（これは IE の互換モードの場合に該当する）</span>
5933:　　　　　win.document.body[ method ] :
　　　　　 　<span class="aquamarine">// ＜ケース2-2＞ 登録要素が window でないならば、</span>
　　　　　 　<span class="aquamarine">// 登録要素のスクロール値を取得して返す。</span>
5934:　　　　elem[ method ];
5835:　　}
5836:　};
5837:});
5938:
5939:function getWindow( elem ) { <span class="aquamarine">// 関数定義</span>
　　　　 <span class="aquamarine">// elem に scrooTo メソッドが適用でき、かつ elem に document がある場合</span>
　　　　 <span class="aquamarine">// つまり、elem が window の場合</span>
5940:　　return ("scrollTo" in elem && elem.document) ?
5941:　　　　elem : <span class="aquamarine">// elem を返す。</span>
5942:　　　　elem.nodeType === 9 ? <span class="aquamarine">// そうでない場合には elem が html 要素ならば
　　　　　　　　 // elem の defaulView プロパティ値、又は elemの parentWindow プロパティ値を返す。</span>
5943:　　　　　　elem.defaultView || elem.parentWindow :
5944:　　　　　　false; <span class="aquamarine">// elem が html要素でなければ false を返す。</span>
5945:}</pre> ]]>
</content:encoded>
<dc:subject>Javascript</dc:subject>
<dc:date>2010-01-24T19:06:07+09:00</dc:date>
<dc:creator>hkom</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://hkom.blog1.fc2.com/blog-entry-751.html">
<link>http://hkom.blog1.fc2.com/blog-entry-751.html</link>
<title>jquery.js (1.4)  による要素位置の測定と適正な配置 (3)  コード解読 (2) </title>
<description> jQuery.offset……適正な配置 (2) コード解読 (1) で解読済み
jQuery().offset……適正な配置 (2) コード解読 (1) で解読済み
jQuery().position……このエントリイで解読します
jQuery().offsetParent……このエントリイで解読します
jQuery().scrollLeft
jQuery().scrollTop
jQuery().innerHeight
jQuery().innerWidth
jQuery().outerHeight
jQuery().outerWidth
jQuery().height
jQuery().width

jQuery().position() イン
 </description>
<content:encoded>
<![CDATA[ <div class="point ml_2 mr_3 lh_11"><ol class="ml_0 pl_3 mt_0 mb_0">
<li>jQuery.offset……<a href="http://hkom.blog1.fc2.com/blog-entry-750.html" target="_blank">適正な配置 (2) コード解読 (1) で解読済み</a></li>
<li>jQuery().offset……<a href="http://hkom.blog1.fc2.com/blog-entry-750.html" target="_blank">適正な配置 (2) コード解読 (1) で解読済み</a></li>
<li><span class="pink">jQuery().position</span>……このエントリイで解読します</li>
<li><span class="pink">jQuery().offsetParent</span>……このエントリイで解読します</li>
<li>jQuery().scrollLeft</li>
<li>jQuery().scrollTop</li>
<li>jQuery().innerHeight</li>
<li>jQuery().innerWidth</li>
<li>jQuery().outerHeight</li>
<li>jQuery().outerWidth</li>
<li>jQuery().height</li>
<li>jQuery().width</li>
</ol></div>
<h4 class="addBgImg">jQuery().position() インスタンスメソッドの解読</h4>
<h5 class="palegreen borderLeft10 lh_11">offset メソッド と position メソッドの比較</h5>
<div class="ta_c"><img src="http://blog-imgs-30.fc2.com/h/k/o/hkom/jQuery()-offsetAndposition.gif" alt="各メソッドのサイズ測定箇所図" border="0" width="620" height="563" /></div>
<p>これら 2 つの jQuery インスタンスメソッドは、共に読み取り専用で、返値は共に座標オブジェクトですが、座標系と計測箇所が異なります。</p>
<p>offset メソッドがドキュメント座標における対象要素のボーダー辺の座標値を取得するのに対して、position メソッドは、対象要素の margin 辺の、基準要素（ offsetParent ）内における座標値を取得します。つま、offset メソッドによる座標値は対象要素の margin 値を含むのに対して、position メソッドによる座標値は margin 値を含みません。</p>
<p class="mt_1">しかし、position メソッドは offset メソッドを利用して基準要素から margin 辺までの offset 座標値を算出します。</p>

<h5 class="palegreen borderLeft10 lh_11">jQuery().position() コード解読</h5>
<pre class="point ml_1 lh_11 ov_a h_500">
5857:jQuery.fn.extend({ <span class="aquamarine">// jQuery protptype オブジェクトに position メソッドを</span>
5858:　position: function() { <span class="aquamarine">// インスタンスメソッドとして登録する</span>
5859:　　if ( !this[0] ) {<span class="aquamarine">// インスタンスに要素ノードが 1 つも登録されていなければ</span>
5860:　　　return null;
5861:　　} 
5862;
5863:　　　var elem = this[0]; // <span class="aquamarine">ローカル変数定義開始</span>
5864:
5865:　　　// Get *real* offsetParent
　　　　　 <span class="aquamarine">// 独自メソッドを使って真の offsetParent 要素を取得して、
　　　　　 // offsetParent 変数に代入する</span>
5866:　　　var offsetParent = this.offsetParent(),
5867:
5868:　　　// Get correct offsets
　　　　　 <span class="aquamarine">// offset ローカル変数に計測対象要素の offset メソッドの返値を代入</span>
5869:　　　offset = this.offset(),
　　　　　 <span class="aquamarine">/* offsetParent が body または html ならば、ローカル変数 parentOffset に
　　　　　  * { top: 0, left: 0 }オブジェクトへの参照を代入し、offsetParent が別の要素
　　　　　  * ならば offsetParent.offset() の返値オブジェクトへの参照を代入する。
　　　　　  */</span>
5870:　　　parentOffset = /^body|html$/i.test(offsetParent[0].tagName) 
　　　　　　 ? { top: 0, left: 0 } : offsetParent.offset();
5871:
5872:　　　// Subtract element margins <span class="aquamarine">マージン値を減算する</span>
5873:　　　// note: when an element has margin: auto the offsetLeft and marginLeft
5874:　　　// are the same in Safari causing offset.left to incorrectly be 0
　　　　　 <span class="aquamarine">// 注記：「要素に margin : auto が設定されている場合、
　　　　　 // safari では、offset.left が不正にゼロとなってしまうために、
　　　　　 // offsetLeft 値 と marginLeft 値が同一になってしまう。」
 /* num メソッドは jquery.js の無名関数のトップレベルで定義されている関数
　* （#1266～1268）。第 1 引数で指定した HTML 要素の、第 2 引数で指定した算出 CSS
　* スタイル値（単位は含まない）を取得するもの。
　* 描画された状態から marginTop/Left 値を取得して、これを offset.top/left 値から
　* 減算する。offset() メソッドは border 辺までの値を保持しているので、この減算に
　* よって offset.top/left は margin 辺までの値となる。
　*/</span>
5875:　　　offset.top  -= num( this, 'marginTop'  );
5876:　　　offset.left -= num( this, 'marginLeft' );
5877:
5878:　　　// Add offsetParent borders
　　　　　 <span class="aquamarine">// 上のコメントの通り、offsetParent の座標値に border 幅を加算する。</span>
5879:　　　parentOffset.top  += parseFloat( jQuery.curCSS(offsetParent[0], "borderTopWidth",  true) ) || 0;
5880:　　　parentOffset.left += parseFloat( jQuery.curCSS(offsetParent[0], "borderLeftWidth", true) ) || 0;
5881:
5882:　　　// Subtract the two offsets
　　　　　 <span class="aquamarine">// 2 つの offset 値を減算して、基準要素( offsetParent ) のパディング辺から
　　　　　 // 対象要素の margin 辺までの距離を算出する。</span>
5883:　　　return {
5884:　　　　top:  offset.top  - parentOffset.top,
5885:　　　　left: offset.left - parentOffset.left
5886:　　　};
5887:　　},</pre>
<p class="ta_c"><img src="http://blog-imgs-30.fc2.com/h/k/o/hkom/jQuery()-position()MethodDescription.gif" alt="jQuery().position() メソッド解説図" border="0" width="474" height="395" /></p>

<h4 class="addBgImg">jQuery().offsetParent() メソッドの解読</h4>
<p>#5865 にあるとおり、このメソッドは「Get *real* offsetParent」のために作成されました。</p>
<pre class="point ml_1 lh_11 ov_a">■jQuery().offsetParent() メソッド解読
5889:　offsetParent: function() {
　　　　 <span class="aquamarine">// map メソッドの返値を返す。</span>
5890:　　return this.map(function() {
5891:　　　var offsetParent = this.offsetParent || document.body;
　　　　 　<span class="aquamarine">// offsetParent が存在して、タグ名が body でも html でもなく、
　　　　 　// position 値が static である限り繰り返す。</span>
5892:　　　while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && jQuery.css(offsetParent, 'position') == 'static') ){
　　　　　 　<span class="aquamarine">// 1 つ上位の offsetParent への参照を変数 offsetParent に代入する。</span>
5893:　　　　offsetParent = offsetParent.offsetParent;
5894:　　　}
5895:　　　return offsetParent; <span class="aquamarine">// offsetParent 要素への参照を返す。</span>
5896:　　});
4296:　}
4297:});</pre> ]]>
</content:encoded>
<dc:subject>Javascript</dc:subject>
<dc:date>2010-01-24T16:52:35+09:00</dc:date>
<dc:creator>hkom</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://hkom.blog1.fc2.com/blog-entry-750.html">
<link>http://hkom.blog1.fc2.com/blog-entry-750.html</link>
<title>jquery.js (1.4) による要素位置の測定と適正な配置 (2)  コード解読(1)</title>
<description> jquery.js ( ver1.4 ) における要素の位置指定等に関わるコード解読
解読対象コードは以下のメソッド等とし、この順に解読を行います。なお対象とする jquery.js はバージョンアップされたばかりの ver 1.4 とします。

jQuery.offset……このエントリイで解読します
jQuery().offset……このエントリイで解読します
jQuery().position
jQuery().offsetParent
jQuery().scrollLeft
jQuery().scrollTop
jQuery().innerHeight

 </description>
<content:encoded>
<![CDATA[ <h4 class="addBgImg">jquery.js ( ver1.4 ) における要素の位置指定等に関わるコード解読</h4>
<p>解読対象コードは以下のメソッド等とし、この順に解読を行います。なお対象とする jquery.js はバージョンアップされたばかりの ver 1.4 とします。</p>
<div class="point ml_2 mr_3 lh_11"><ol class="ml_0 pl_3 mt_0 mb_0">
<li><span class="pink">jQuery.offset</span>……このエントリイで解読します</li>
<li><span class="pink">jQuery().offset</span>……このエントリイで解読します</li>
<li>jQuery().position</li>
<li>jQuery().offsetParent</li>
<li>jQuery().scrollLeft</li>
<li>jQuery().scrollTop</li>
<li>jQuery().innerHeight</li>
<li>jQuery().innerWidth</li>
<li>jQuery().outerHeight</li>
<li>jQuery().outerWidth</li>
<li>jQuery().height</li>
<li>jQuery().width</li>
</ol></div>

<h5 class="palegreen borderLeft10 lh_11">jQuery.offset オブジェクト（5785～5854行）の概要</h5>
<p>このオブジェクトには 3 つのメソッドが定義されます。</p>
<p><span class="pink">initialize </span>は、ブラウザ特性を把握するために幾つかのプロパティを設定するメソッドです。</p>
<p>この「幾つかのプロパティ」とは次に列挙した 5 つで、これらは、jQuery().offset() メソッド解読において後述するように、要素の正確な位置算出を行うために使われ、それは同時に、各ブラウザの CSS に関する特性を捉えることになります。</p>
<ol class="ml_0 pl_1">
<li>jQuery.offset.doesNotAddBorder ： 或るボックスの offsetTop を算出する際に、直上の親ボックスのボーダー値を加算しないか（true）、加算するか（false）</li>
<li>jQuery.offset.doesAddBorderForTableAndCells ： table 内の或るセルの offsetTop 値を算出する際に、table ボックスのボーダー値を加算するか（true）、否か（false）</li>
<li>jQuery.offset.supportsFixedPosition ：或る要素を強制的に top：20px の位置に fixed 配置して、その offsetTop 値が 20px か 15px ならば true、その場の場合には false。
これは safari が offsetTop をマイナス 5 してしまうバグ対応のようだ。（ 5px は offsetParent の top ボーダー幅である。）</li>
<li>jQuery.offset.subtractsBorderForOverflowNotVisible ： 或るボックス要素 A の offsetParent 要素の overflow 値を hidden にし、その position をrelative に指定した際に、A.offsetTop 値を A.offsetParent のボーダー高さだけマイナスするか（true）、しないか（false）</li>
<li>jQuery.offset.doesNotIncludeMarginInBodyOffset ： document.body に marginTop 値を設定した時に、body.offsetTop 値にその marginTop 値を加算しないか（true）、加算するか（false）</li>
</ol>
<p>上の 5 つのプロパティは、ブラウザのそれぞれの仕様を個別具体的に把握するために用意されたもので、jQuery.offset オブジェクトの 1 つの目的は、この 5 プロパティチェックにあると言えるでしょう。これらのプロパティによってブラウザ毎のバグや仕様の差異がチェックされ、位置算出で補正が必要かどうか判断されるのです。</p>
<p class="mt_1">jQuery.offset オブジェクト内で定義される <span class="pink">2 つめのメソッド jQuery.offset.bodyOffset</span> は、document.body の margin 値を top/left 値に追加し、その値をオブジェクトとして返します。返値の top/left 値は document.body のボーダー辺のドキュメント座標値を示すはずです。しかし、Firefox では body 部に border がある場合に、奇妙な offsetTop/Left 値を返すので、正確な座標値にならない場合があります。（このことの詳細は後述します。）</p>
<p class="mt_1">jQuery.offset オブジェクト内で定義される <span class="pink">3 つめのメソッド jQuery.offset.setOffset</span> は、jquery.js ver1.4 で新設されたものです。</p>
<p>これまでの jQuery(elems).offset インスタンスメソッドは読み取り専用でしたが、<span class="tdul">ver 1.4 では、elems HTML要素（静的配置の場合も含む）を、配置換えする引数を取る</span>ことができるようになりました。この引数は配置換え先となる top、left プロパティを持つオブジェクト（仮に obj と呼ぶ）か、elems のインデックス番号 i と、i 毎の obj の 2 つの引数をもつ関数か、そのいずれかとなります。</p>

<h5 class="palegreen borderLeft10 lh_11">jQuery.offset オブジェクトの 5 つのプロパティについて</h5>
<p class="mt_1">前のエントリイで触れた W3C Working Draft 04 August 2009 - CSSOM View Module における offsetTop/Left プロパティ定義案を標準と考えた場合、jQuery.offset オブジェクトの 5 つのプロパティが、ブラウザ（全て windows 版）毎にどのようになるのかを一覧にしてみました。</p>
<p>ここに、doesNotSubtractBorderInBodyOffset は私が独自に作成したプロパティです。document.body にゼロではない border 幅が設定されている場合に、document.body.offsetTop  値から、このボーダー値が減じられてしまうかどうかを調べるために設けたものです。</p>
<div class="ta_c"><img src="http://blog-imgs-30.fc2.com/h/k/o/hkom/jQuery-offset-props.gif" alt="" border="0" width="680" height="547" /></div>

<h5 class="palegreen borderLeft10 lh_11">上の表の説明</h5>
<ol class="ml_0 pl_2">
<li><p>W3C の列は W3C Working Draft 04 August 2009 - CSSOM View Module での提唱案に従った場合の各プロパティ値です。これを標準と考えて各ブラウザを比較してみます。</p></li>
<li><p>すると、標準モードで border なしの場合、Opera と IE8 では doesNotAddBorder が false となることにおいて、Chrome では doesAddBorderForTableAndCells が false となることにおいて、最後に Firefox では doesNotSubtractBorderInBodyOffset が false となることにおいて、それぞれ標準とは異なっています。<br />つまり、W3C 草案に全て一致するブラウザは現在存在しません。</p></li>
<li><p>supportsFixedPosition は、position:fixed をサポートしない IE 及び Opera の後方互換モードでは false となります。</p></li>
<li><p><a id="750firefoxBug"></a>Firefox では document.body に ゼロ幅ではない border がある時とない場合とで、offsetTop/Left が異なる値を示します。border があると offsetTop/Left 値は「マイナスボーダー幅」となるのです。標準でも互換でもいずれのモードでも同様です。</p><p>そこで、doesNotIncludeMarginInBodyOffset プロパティを作って調査しました。</p><p>こうして、Firefox だけが border 有無によって offsetTop に異なった値を返すことが判明しましたが、これは明らかにバグというべきでしょう。</p></li>
<li><p>IE8 の場合、doesNotAddBorder は標準モードと互換モードで異なる値になります。これは IE 互換モードの content.width/height が W3C 標準と異なって border 辺までの値として定義されていることに関連していると推測されます。</p></li></ol>

<h5 class="palegreen borderLeft10 lh_11">subtractsBorderForOverflowNotVisible プロパティの目的</h5>
<p class="mt_1">W3C CSS2.1 の仕様として、position : absolute と position : relative では配置原点が異なります。前者は offsetParent のパディング辺が基準となり、後者は offsetParent の内容辺が基準になります。そして内包されるボックスの margin 辺がそれぞれの配置原点に配置されます。（下図参照）</p>
<div class="ta_c"><img src="http://blog-imgs-37.fc2.com/h/k/o/hkom/posAbsRel.gif" alt="" border="0" width="350" height="371" /></div>
<p>subtractsBorderForOverflowNotVisible プロパティは、或る要素 B の absolute 属性を一時的に relative に変更すると共に、B の overflow 属性を hidden にして、包含要素 C の padding 値だけ当該要素を右下に移動させた時に、当該要素内に静的に配置された子要素 A も B  と一緒に動くかどうかを調べています。</p>
<p>上述の「 jQuery.offset オブジェクトの 5 つのプロパティ 」 に掲載した表にあるように、Windows 系の主要ブラウザにおいては、標準モードであれ互換モードであれ、subtractsBorderForOverflowNotVisible プロパティは全て false となります。ですから、どんなブラウザで、このプロパティ値が true となるのか分かりません。つまりこのプロパティの必要性が判然としません。</p>
<p>因みに、その他の jQuery.offset オブジェクトのプロパティでは、私が独自に設定した doesNotSubtractBorderInBodyOffset も含めて、いずれかのブラウザの、いずれかのモードにおいて、他と異なる値となるので、これらのプロパティはブラウザ特性を把握するために必要であることが分かるのですが、subtractsBorderForOverflowNotVisible プロパティだけは、必要性が分かりません。</p>
<p>このプロパティは、Mac 系のブラウザや Windows 系の他のブラウザにおいて、必要なのかもしれませんが、チェックし得ないため不明です。</p>

<h4 class="addBgImg">jQuery.offset オブジェクトコード解読</h4>
<pre class="point ml_1 lh_11 ov_a h_500">■jQuery.offset オブジェクト
　　 <span class="aquamarine">// jQuery.offset オブジェクトの定義を開始する</span>
5785:jQuery.offset = {
　　　 <span class="aquamarine">// initialize メソッド定義を開始する。引数はない。</span>
5786:　initialize: function() {
　　　　 <span class="aquamarine">// ローカル変数定義
　　　　 /* 変数 html にはブラウザ特性をチェックするための 2 つの要素をセットしている。
　　　　  * 1 つは 4 辺共黒で塗りつぶした 5 px 幅のボーダーを持ち、コンテンツ幅も
　　　　  * 高さも 1 px の div タグ内に設けるチェック対象の空の div タグ。
　　　　  * そして 4 辺共黒で塗りつぶした 5 px 幅のボーダーを持ち、幅と高さを 1 px、
　　　　  * セル余白もセル間隔もゼロの table タグ内に配置するチェック対象の空 td タグ。
　　　　  * これらの 2 つの要素を document.body の左上隅にそれぞれ絶対配置して、
　　　　  * offsetTop プロパティを使ってブラウザ特性を測定する。
　　　　  */</span>
5787:　　var body = document.body, container = document.createElement('div'), innerDiv,
　　　　　 checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.curCSS(body, "marginTop", true) ) || 0,
5788:　　　html = '<div style="position:absolute;top:0;left:0;margin:0;
　　　　　 border:5px solid #000;padding:0;width:1px;height:1px;"><div></div>
　　　　　 </div><table style="position:absolute;top:0;left:0;margin:0;
　　　　　 border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" 
　　　　　 cellspacing="0"><tr><td></td></tr></table>';
5789:
　　　　 <span class="aquamarine">// ローカル変数 container のインラインスタイルを設定する。</span>
5790:　　jQuery.extend( container.style, { position: "absolute", top: 0, left: 0,
　　　　　 margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
5791:
5792:　　container.innerHTML = html; <span class="aquamarine">// container 要素内に html 要素を挿入する</span>
　　　　 <span class="aquamarine">// その container を body 要素最前部に配置する</span>
5793:　　body.insertBefore(container, body.firstChild);
　　　　 <span class="aquamarine">// ローカル変数への代入。innerDiv は checkDiv 要素の parentNode となる。</span>
5794:　　innerDiv = container.firstChild;
5795:　　checkDiv = innerDiv.firstChild;
5796:　　td = innerDiv.nextSibling.firstChild.firstChild;
5797:　　<span class="aquamarine">// ブラウザ特性判定プロパティその 1── doesNotAddBorder を定義</span>
5798:　　this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
　　　　 <span class="aquamarine">// ブラウザ特性判定プロパティその 2── doesAddBorderForTableAndCells を定義</span>
5799:　　this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
　　　　 <span class="aquamarine">// #5800 ～ 5804 は ver 1.4 で追加された。</span>
5800:　　<span class="aquamarine">// checkDiv の位置指定を fixed とし、top 値を 20px とする。</span>
5801:　　checkDiv.style.position = "fixed", checkDiv.style.top = "20px";
5802:　　// safari subtracts parent border width here which is 5px
　　　　 <span class="aquamarine">// safari では親要素のボーダー幅 5px を減算する。
　　　　 // ブラウザ特性判定プロパティその 3──  checkDiv.offsetTop が 20 あるいは
　　　　 // 15 の時には true を supportsFixedPosition プロパティに代入し、
　　　　 // そうでない場合には false を代入する。</span>
5803:　　this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
　　　　 <span class="aquamarine">// チェックを終えたので、chechDiv 要素の position と top プロパティの
　　　　 // インラインスタイル指定を取り消す。</span>
5804:　　checkDiv.style.position = checkDiv.style.top = "";
5805:　　<span class="aquamarine">// checkDiv 要素の parentNode （これは offsetParent でもある）の
　　　　 // overflow 属性を hidden とし、position 属性を相対配置とした上で</span>
5806:　　innerDiv.style.overflow = 'hidden', innerDiv.style.position = 'relative';
　　　　 <span class="aquamarine">// ブラウザ特性判定プロパティその 4── subtractsBorderForOverflowNotVisible  を定義</span>
5807:　　this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
5808:　　
　　　　 <span class="aquamarine">// ブラウザ特性判定プロパティその 5── doesNotIncludeMarginInBodyOffset を定義</span>
5809:　　this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginToo);
5810:　　<span class="aquamarine">// ブラウザ特性判定プロパティの設定を終えたので、container 毎 DOM Tree から削除する</span>
5811:　　body.removeChild(container);
5812:　　this.initialized = true; <span class="aquamarine">// jQuery.offset.initialized プロパティを true に設定</span>
5814:　},
5815:
5816:　bodyOffset: function(body) { <span class="aquamarine">// bodyOffset メソッドの定義開始</span>
　　　　 <span class="aquamarine">// document.body 要素の offsetTop/Left 値をローカル変数に代入</span>
5817:　　var top = body.offsetTop, left = body.offsetLeft;
5818:　　<span class="aquamarine">// jQuery.offset.initialize メソッドを起動する。</span>
5819:　　jQuery.offset.initialize();
5820:　　<span class="aquamarine">// doesNotIncludeMarginInBodyOffset が true ならば</span>
5821:　　if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
　　　　　 <span class="aquamarine">// body の marginTop/Left の算出スタイル値を加算する。
　　　　　 なお、加算しないことは正しい offsetTop/Left の仕様です。
　　　　　 従ってここで margin 値を加算するのは、jQuery.offset.top/left プロパティ
　　　　　 によって、body 要素のボーダー辺の位置を得るために他なりません。</span>
5822:　　　top  += parseInt( jQuery.curCSS(body, 'marginTop',  true), 10 ) || 0,
5823:　　　left += parseInt( jQuery.curCSS(body, 'marginLeft', true), 10 ) || 0;
5824:　　}
5825:
5826:　　return { top: top, left: left };
5827:　},
5828:　<span class="aquamarine">// ver 1.4 で新設されたメソッドで、offset 値を設定するメソッドである。</span>
5829:　setOffset: function( elem, options, i ) {
5830:　　// set position first, in-case top/left are set even on static elem
　　　　 <span class="aquamarine">// 設定対象とする elem 要素の position 算出スタイル値が static ならば</span>
5831:　　if ( /static/.test( jQuery.curCSS( elem, "position" ) ) ) {
5832:　　　elem.style.position = "relative"; <span class="aquamarine">// relative に変更する。</span>
5833:　　}
　　　　 <span class="aquamarine">// elem の jQuery インスタンス jQuery(elem) への参照を変数 curElem に代入</span>
5834:　　var curElem   = jQuery( elem ),
　　　　　 <span class="aquamarine">// curOffset に curElem の offset メソッド適用結果を代入</span>
5835:　　　curOffset = curElem.offset(),
　　　　　 <span class="aquamarine">// elem 要素の top 算出スタイル値を curTop 変数に代入する。</span>
5836:　　　curTop    = parseInt( jQuery.curCSS( elem, "top",  true ), 10 ) || 0,
　　　　　 <span class="aquamarine">// elem 要素の left 算出スタイル値を curLeft 変数に代入する。</span>
5837:　　　curLeft   = parseInt( jQuery.curCSS( elem, "left", true ), 10 ) || 0;
5838:　　<span class="aquamarine">// 引数 options が関数ならば</span>
5839:　　if ( jQuery.isFunction( options ) ) {
　　　　　 <span class="aquamarine">// i と curOffset を引数として options 関数を起動し、その返値を options に代入する。</span>
5840:　　　options = options.call( elem, i, curOffset );
5841:　　}
5842:
　　　　 <span class="aquamarine">// offset.top/left の設定値から offset.top/left の現在値を減算し、
　　　　 // それに top/left の現在値を加算する。要するに、差分を現在値に加算する。</span>
5843:　　var props = {
5844:　　　top:  (options.top  - curOffset.top)  + curTop,
5845:　　　left: (options.left - curOffset.left) + curLeft
5846:　　};
5847:　　
5848:　　if ( "using" in options ) { <span class="aquamarine">// options に using プロパティ（値は関数）があれば</span>
5849:　　　options.using.call( elem, props ); <span class="aquamarine">// props を引数として using 関数を起動</span>
5850:　　} else { <span class="aquamarine">// using がなければ</span>
5851:　　　curElem.css( props ); <span class="aquamarine">// 対象要素を props に従って配置する。</span>
5852:　　}
5853:　}
5854:};</pre>
<p class="mt_1">続いて、2 つめのコード解読を行います。</p>

<h4 class="addBgImg">jQuery().offset() メソッドの概要</h4>
<p>このメソッドの目的は、知りたい HTML 要素の<span class="td_ul"> border 辺のドキュメント座標値 top 及びleft </span>を知ることです。そのために上述のように、jQuery.offset.bodyOffset オブジェクトの top/left プロパティに、body 部の margin 値を加算して border 辺迄の座標を得ています。（#4248～4255）</p>
<p>この結果、body 要素自体に border（幅 W ）がある場合には、body.offsetTop = 0 （但し、firefox のみ、body.offsetTop = - W となってしまう）ですが、$("document.body").offset().top = marginTop 値 となります（ここでも firefox の場合のみ、marginTop - W となってしまいます）。</p>
<div class="ta_c"><img src="http://blog-imgs-30.fc2.com/h/k/o/hkom/jQuery()-offsetAndposition.gif" alt="各メソッドのサイズ測定箇所図" border="0" width="620" height="563" /></div>

<p class="mt_1">このメソッドでは CSSOM で定義されようとしており、現時点では何ら標準化されていない 1 つのメソッド（ <span class="pink">getBoundingClientRect</span> ）を使って、あるいは同様に標準化されていない 3 つのプロパティ（ <span class="pink">offsetParent、offsetTop 及び offsetLeft</span> ）を使って、要素のドキュメント座標を算出します。</p>
<p class="mt_1">A.getBoundingClientRect メソッドをサポートしているブラウザにおいては、要素 A のクライアント座標値が取得でき、その値はブラウザ間で差異がないので、容易にドキュメント座標値が取得できます。A.getBoundingClientRect メソッドで取得したクライアント座標値に window スクロール値を加算し、clientTop/Left値を減算すれば、要素 A の正確なドキュメント座標値が取得できます。</p>
<p class="mt_1">一方、ブラウザが getBoundingClientRect メソッドをサポートしていない場合には、offsetParent、offsetTop 及び offsetLeft を利用してドキュメント座標を取得するのですが、これらのプロパティはブラウザ毎に解釈が異なっていたり、バグがあったりするので、そのままでは正しい位置が取得出来ません。そこで、上で解読した jQuery.offset オブジェクトの 5 つのプロパティを駆使して、ブラウザ毎・標準互換別の offsetTop プロパティ算出値の差異を補正し、jQuery.offsetParent メソッドによって、ブラウザ間で定義が異なる offsetParent の一意的な確定を行います。</p>
<p>こうして要素のドキュメント座標値（ border 辺迄の値 ）をブラウザに依存せずに正確に算出する訳です。</p>
<h5 class="palegreen borderLeft10 lh_11"><a id="750firefoxBug2"></a>jQuery().offset() メソッドの欠点</h5>
<p>jQuery().offset() メソッドには欠点があります。body 部に border がある場合、Firefox だけ正しい要素位置が算出できないのです。この場合に jquery.js コードの jQuery().offset() で取得される top と left 値は、共に border 幅の値だけ過小になってしまいます。</p>
<p>そこで、エントリイを改めてその補正を行うコードを jquery プラグインとして作成して掲載する予定です。</p>

<h5 class="palegreen borderLeft10 lh_11">jQuery().offset() メソッドの詳細解読</h5>
<pre class="point ml_1 lh_11 ov_a h_500">■jQuery().offset() メソッドコード
　　 <span class="aquamarine">// html要素オブジェクトに getBoundingClientRect が定義されていれば、</span>
　　 <span class="aquamarine">// つまりブラウザが getBoundingClientRect メソッドに対応していれば、</span>
5690:if ( document.documentElement["getBoundingClientRect"] )
　　　 <span class="aquamarine">// jQuery().offset() メソッドを prototype オブジェクトに組み込む</span>
5691:　jQuery.fn.offset = function( options ) {
　　　　 <span class="aquamarine">// インスタンスに登録されている最初の要素への参照を elem に登録する。</span>
5692:　　var elem = this[0];
5693:　　<span class="aquamarine">// elem がないか、document がないならば</span>
5694:　　if ( !elem || !elem.ownerDocument ){
5695:　　　　　 　return null; <span class="aquamarine">// null を返す。</span>
5696:　　}
5697:
5698:　　if ( options ) { <span class="aquamarine">// 引数 options があれば</span>
5699:　　　return this.each(function( i ) { <span class="aquamarine">// 対象要素を巡回処理</span>
　　　　　　　 <span class="aquamarine">// setOffset クラスメソッドを呼び出す。</span>
5700:　　　　　jQuery.offset.setOffset( this, options, i );
5701:　　　});
5702:　　}
5703:　　<span class="aquamarine">// 対象要素が body の場合</span>
5704:　　if ( elem === elem.ownerDocument.body ) {
　　　　　 <span class="aquamarine">// body を引数に bodyOffset クラスメソッドを 起動する</span>
5705:　　　return jQuery.offset.bodyOffset( elem );
5706:　　}
5707:　　<span class="aquamarine">// インスタンスに格納されている最初の要素が document.body ならば</span>
　　　　 <span class="aquamarine">// jQuery.offset.bodyOffset(document.body) の返値を返す。</span>
　　　　 <span class="aquamarine">// ローカル変数定義。
　　　　 /* インスタンスに格納されている最初の要素の getBoundingClientRect()
　　　　  * オブジェクトへの参照を box に 、 document への参照を doc に、
　　　　  * document.body への参照を body に 、html 要素への参照を docElem に、
　　　　  * html.clientTop 又は document.body.clientTop 又はゼロを clientTop に 
　　　　  * html.clientLeft 又は document.body.clientLeft 又はゼロを clientLeft に、
　　　　  * それぞれ代入する。
　　　　  */</span>
5708:　　var box  = elem.getBoundingClientRect(), doc = elem.ownerDocument,
　　　　　 body = doc.body, docElem = doc.documentElement,
5709:　　　clientTop = docElem.clientTop || body.clientTop || 0, 
　　　　　 clientLeft = docElem.clientLeft || body.clientLeft || 0,
　　　　　 <span class="aquamarine">// ローカル変数定義の続き
　　　　　 /* top として、計測対象要素の top 値 ＋ スクロール値 － clientTop を
　　　　　  * left として、計測対象要素の left 値 ＋ スクロール値 － clientLeft を
　　　　　  * 代入する。
　　　　　  */</span>
5710:　　　top  = box.top  + (self.pageYOffset || jQuery.boxModel && docElem.scrollTop  || body.scrollTop ) - clientTop,
5711:　　　left = box.left + (self.pageXOffset || jQuery.boxModel && docElem.scrollLeft || body.scrollLeft) - clientLeft;
　　　　 　<span class="aquamarine">// 返値定義</span>
5712:
5713:　　　return { top: top, left: left };
5714:　};
5715:<span class="aquamarine">// ブラウザが getBoundingClientRect に対応していない場合</span>
5716:} else {
　　　 <span class="aquamarine">// #5717～5783 は #5691～5714 に同じである。</span>
5717:　jQuery.fn.offset = function() {
5718:　　var elem = this[0];
5719:
5720:　　if ( !elem || !elem.ownerDocument ){
5721:　　　return null;
5722:　　}
5723:
5724:　　if ( options ) {
5725:　　　return this.each(function( i ) {
5726:　　　　　jQuery.offset.setOffset( this, options, i );
5727:　　　});
5728:　　}
5729:
5730:　　if ( elem === elem.ownerDocument.body ) {
5731:　　　return jQuery.offset.bodyOffset( elem );
5732:　　}
5733:　　jQuery.offset.initialize();
5734:　　<span class="aquamarine">// ローカル変数定義
　　　　 /* elem に インスタンスに登録されている最初の要素（対象要素）への参照を、
　　　　  * offsetParent に elem の offsetParent への参照を、
　　　　  * prevOffsetParent に elem への参照を、doc に document への参照を、
　　　　  * docElem に html 要素への参照を、body に document.body への参照を、
　　　　  * defaultView に document.defaultView への参照を、prevComputedStyle に
　　　　  * document.defaultView.getComputedStyle(elem, null) オブジェクトへの参照を、
　　　　  * top に対象要素の offsetTop 値を、left に対象要素の offsetLeft 値を
　　　　  * それぞれ代入する。
　　　　  */</span>
5735:
5736:　　var offsetParent = elem.offsetParent, prevOffsetParent = elem,
5737:　　　doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement,
5738:　　　body = doc.body, defaultView = doc.defaultView,
5739:　　　prevComputedStyle = defaultView ? defaultView.getComputedStyle(elem, null) 
　　　　　　: elem.currentStyle
5740:　　　top = elem.offsetTop, left = elem.offsetLeft;
5741:
　　　　 <span class="aquamarine">// 対象要素の親要素を elem に代入し、elem が body で html でもない限り</span>
　　　　 <span class="aquamarine">// 巡回走査する。</span>
5742:　　while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
5743:　　　if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
5744:　　　　break;
5745:　　　}
5746:
　　　　　 <span class="aquamarine">// computedStyle 変数に対象要素の算出スタイルオブジェクトへの参照を代入する。</span>
5747:　　　computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
　　　　　 <span class="aquamarine">// スクロール値が重複加算されるのでその都度減算する。</span>
5748:　　　top -= elem.scrollTop;
5749:　　　left -= elem.scrollLeft;
5750:
　　　　　 <span class="aquamarine">// 親要素が offsetParent ならば</span>
5751:　　　if ( elem === offsetParent ) {
　　　　　 　<span class="aquamarine">// 対象要素の親要素の offsetTop 値と offsetLeft 値を加算する。</span>
5752:　　　　top += elem.offsetTop;
5753:　　　　left += elem.offsetLeft;
5754:
　　　　　　 <span class="aquamarine">/* 対象要素が 対象要素が table でも td でも th でもなく、かつ
　　　　　　  * doesNotAddBorder が true の場合、または、対象要素が table か
　　　　　　  * td か th で、かつ doesAddBorderForTableAndCells が true ではない場合
　　　　　　  */</span>
5755:　　　　if ( jQuery.offset.doesNotAddBorder && 
　　　　　　 !(jQuery.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test(elem.tagName)) ){
　　　　　　　 <span class="aquamarine">// 対象要素の親要素の border 幅値を top と left にそれぞれ加算する。</span>
5756:　　　　　top  += parseInt( computedStyle.borderTopWidth,  10) || 0;
5757:　　　　　left += parseInt( computedStyle.borderLeftWidth, 10) || 0;
5758:　　　　}
5759:
　　　　　　 <span class="aquamarine">// 対象要素の offsetParent の offsetParent を 変数 offsetParent に代入</span>
5760:　　　　prevOffsetParent = offsetParent, offsetParent = elem.offsetParent;
5761:　　　}
5762:
　　　　　 <span class="aquamarine">// subtractsBorderForOverflowNotVisible が true で、overflow 属性値が</span>
　　　　　 <span class="aquamarine">// visible ではない場合には</span>
5763:　　　if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ){
　　　　　　 <span class="aquamarine">// 対象要素の親要素の border 幅値を top と left にそれぞれ加算する。</span>
5764:　　　　top  += parseInt( computedStyle.borderTopWidth,  10) || 0;
5765:　　　　left += parseInt( computedStyle.borderLeftWidth, 10) || 0;
5766:　　　}
5767:　　　<span class="aquamarine">// 対象要素の親要素の算出スタイルオブジェクトを prevComputedStyle 変数に</span>
　　　　　 <span class="aquamarine">// バックアップしておく。</span>
5768:　　　prevComputedStyle = computedStyle;
5769:　　}
5770:　　<span class="aquamarine">// 対象要素の親要素の position 属性値が relative または static ならば、</span>
5771:　　if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ){
　　　　　 <span class="aquamarine">// 最上位の offsetParent である document.body の offsetTop/Left 値を加算する。</span>
5772:　　　top  += body.offsetTop;
5773:　　　left += body.offsetLeft;
5774:　　}
5775:
　　 　　<span class="aquamarine">// ブラウザが position : fixed に対応しており、
　　　　 // かつ、対象要素の親要素の position 属性値が fixed ならば</span>
5776:　　if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ){
　　　　　 <span class="aquamarine">// html.scroll 値か body.scroll 値の大きい方を top/left 値に加算する。</span>
5777:　　　top  += Math.max(docElem.scrollTop, body.scrollTop);
5778:　　　left += Math.max(docElem.scrollLeft, body.scrollLeft);
5779:　　}
5780:
5781:　　return { top: top, left: left };
5782:　};
5783:}</pre> ]]>
</content:encoded>
<dc:subject>Javascript</dc:subject>
<dc:date>2010-01-24T14:13:27+09:00</dc:date>
<dc:creator>hkom</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://hkom.blog1.fc2.com/blog-entry-749.html">
<link>http://hkom.blog1.fc2.com/blog-entry-749.html</link>
<title> jquery.js による要素位置の測定と適正な配置 (1) はじめに</title>
<description> jQuery インスタンスメソッドである jQuery().offset や jQuery().position の解読を行おうと思い立って、jquery.js コードを睨み続けた結果、改めて offsetTop、offsetLeft について検討を加える必要があると思われました。
偶々、W3C による CSSOM View Module Working Draft が 2009年8月4日に公表されていたこともそうする必要性を高めました。 （ CSSOM View Module 作業草案 ）、たとえ「作業草案」とはいえ、拠って立つこ
 </description>
<content:encoded>
<![CDATA[ <p>jQuery インスタンスメソッドである jQuery().offset や jQuery().position の解読を行おうと思い立って、jquery.js コードを睨み続けた結果、改めて offsetTop、offsetLeft について検討を加える必要があると思われました。</p>
<p>偶々、W3C による CSSOM View Module Working Draft が 2009年8月4日に公表されていたこともそうする必要性を高めました。 （ <a href="http://www.w3.org/TR/cssom-view/#the-getclientrects-and-getboundingclient" target="_blank">CSSOM View Module 作業草案</a> ）、</p><p>たとえ「作業草案」とはいえ、<span class="td_ul">拠って立つことのできる offsetTop/Left プロパティの定義として受け止めることの出来る内容</span>となっています。こうして、この定義によって各ブラウザの差異を検証出来ることも、offsetTop/Left について再考するきっかけとなりました。</p>

<h4 class="addBgImg">CSSOM View Module 作業草案 2009/8/4（以下「CSSOM VM草案」） における offsetParent、offsetTop/Left の定義</h4>
<p>※ 以下は意訳であり、レイアウトボックスに関する名称は下図に拠り一部日本語化しました。</p>
<p class="ta_c"><img src="http://blog-imgs-31.fc2.com/h/k/o/hkom/boxdimentions.png" width=350 height=313></p>
<dl class="point">
<dt><em>A.offsetParent の返値</em></dt>
<dd class="ml_1">1. 次の場合には null を返す。
	<ul class="ml_2"><li>A の中に CSS layout box が全くない場合</li>
	<li>A がルート要素（HTMLタグ）の場合</li>
	<li>A が body 要素の場合</li>
	<li>A の position 算出CSSスタイル値が fixed の場合</li></ul>
</dd>
<dd class="ml_1">2. A が map 要素内の area 要素の場合には、直近の祖先 map 要素を返す。</dd>
<dd class="ml_1">3. 次の場合には A の直近祖先要素を返す。
	<ul class="ml_2"><li>直近祖先要素の position 属性が static ではない時</li>
	<li>直近祖先要素が body 要素の時</li>
	<li>A の position 算出CSSスタイル値が static で、かつ祖先要素が td, th または table の時</li></ul>
</dd>
<dt><em>A.offsetTop の返値</em></dt>
	<dd><ol class="ml_1_5 pl_15">
		<li>A が body 要素の場合か、A に CSS layout box がない場合には、ゼロ</li>
		<li>A の offsetParent が null か body の場合には A の top border 辺の y 座標値</li>
		<li>初期包含ブロックの原点を基準（つまり document 座標）として、A の border 辺の y 座標値から、offsetParent の padding 辺の y 座標値を減じた値</li></ol>
	</dd>
<dt><em>A.offsetLeft の返値</em></dt>
	<dd><ol class="ml_1_5 pl_15">
		<li>A が body 要素の場合か CSS layout box がない場合には、ゼロ</li>
		<li>A の offsetParent が null か body の場合には A の left border 辺の x 座標値</li>
		<li>初期包含ブロックの原点を基準（つまり document 座標）として、A の border 辺の x 座標値から、offsetParent の padding 辺の x 座標値を減じた値</li></ol>
	</dd>
</dl>

<h4 class="addBgImg">CSSOM VM草案 における offsetTop/Left 定義の要点</h4>
<p class="mt_1">上の CSSOM VM 草案の定義で押さえておかねばならないことは、第一に document.body.offsetTop/Left の返値を常にゼロと定義したことです。つまり、body 要素に margin、padding あるいは border があろうがなかろうが、それらとは無関係にゼロとしたことが重要な点です。</p>
<p>別のエントリイ（<a href="http://hkom.blog1.fc2.com/blog-entry-503.html" target="_blank">offsetLeft,offsetTop,offsetWidth そして offsetHeight──静的配置要素の絶対位置を確実に取得する方法について</a>）で詳細に述べたように、FireFoxは、その最新版（Ver 3.5.7）においても body 要素に border が存在する場合には、document.body.offsetTop/Left は何とボーダー幅のマイナス値を返してしまいます。これは CSSOM VM 草案を待たずとも、奇妙な仕様と言わざるを得ません。</p>
<p>因みに、Windows 系の他のブラウザ（IE8、Opera10.10、Chrome 3.0.195.38、safari4.0.4）の標準モード及び後方互換モードでは、Firefox のような奇妙な演算は起こらず、たとえ body 部に border が設定されていたとしても、document.body.offsetTop/Left は全てゼロを返します。Firefox だけが「マイナス border-width」 という奇妙な値を返します。</p>
<p class="mt_1">第二に、確認を含めて押さえておくべきことは、分かりやすく記述すれば A.offsetTop/Left の値は、A.offsetParent 要素のパディング辺と A.offsetTop/Left が起動された A 要素の border 辺との間のピクセル数になる、と定義されていることです。</p>
<p>この点では msdn の <a href="http://msdn.microsoft.com/ja-jp/library/cc392317.aspx" target="_blank">エレメントの大きさと位置を測定する</a> に掲載されている図は、明らかに間違っています。（その図では、A.offsetParent のパディング辺から A のパディング辺までの距離を A.offsetTop/Left としています。これは 10 年以上前から掲載されている図ですが、当時の IE 5 あたりの、今日呼ぶところの互換モード仕様に基づくものと解釈することも出来ない、誤った図になっています。）</p>
<p class="mt_1">以上の 2 点は、offsetTop/Left を理解し、使いこなす上で極めて重要な基礎的なことであり、コード作成上 offsetTop/Left を使用して要素位置を知り、その結果を踏まえて何らかの要素を配置する場合には、ブラウザ固有の「偏差」（バイオス）によってずれが生じないように留意する必要があります。（ここでは敢えて「バグ」と言う表現は使わないことにします。何故ならば、CSSOM View Module はまだ作業草案段階であって、勧告に至っていないからです。）</p>

<h4 class="addBgImg">HTML文書内の要素位置取得方法の要点</h4>
<h5 class="palegreen borderLeft10 lh_11">はじめに</h5>
<p>要素の正確な位置を知りたい場合（ 絶対配置、相対配置又は静的配置のいずれの場合においても ）、あるいはそれを踏まえて適正な位置に任意の要素を配置しようとする場合、ブラウザ毎に個別に対応するのは大変な手間となります。そこで様々な W3C 勧告が作られ、それを基準としてブラウザが作られてきました。しかし、未だに各ブラウザごとに固有のバグがあるため（特に IE では多数のバグがある）、バグ対策が不可欠となります。</p>
<p class="mt_1">また、IE で初めて採用され、その後各ブラウザが採用した、offsetParent や offsetTop/Left プロパティは、要素の位置を知るために非常に有効な読み取り専用プロパティですが、現時点では標準的仕様さえ存在しないため、利用に当たっては適正な個別対策が必要となります。</p>
<h5 class="palegreen borderLeft10 lh_11">jquery.js における要素位置の把握方法の概要</h5>
<p>jquery.js では、要素のドキュメント上の絶対座標を取得するメソッドとして <span class="pink">jQuery().offset()</span> を、また基準要素（ つまり offsetParent 要素 ）からの相対座標を取得するメソッドとして <span class="pink">jQuery().position()</span> を、それぞれ用意しています。また、これらのメソッド内で <span class="pink">jQuery.offset</span> オブジェクトの各プロパティが利用されます。（jquery.js ver 1.3.2 #4172～4197）
<p class="mt_1">以下にこれらのコード解読を行いますが、その前に、jquery.js の位置算出方法の特徴に触れておきたいと思います。注目すべきことは 2 つあります。</p>
<p>第一に、getBoundingClientRect() メソッドという、余り見かけないメソッドを使うことによって、位置取得コードを非常に簡単にしていることです。このメソッドは（おそらく）全てのブラウザで同一の値が得られるので、クロスブラウザ対策が不要なのだと思います。</p>
<p class="mt_1">第二に、getBoundingClientRect() メソッドに対応していないブラウザへの対策として、良く行われているようなブラウザ判別法を採用していないことです。</p><p>よく見かけるコードでは、ブラウザ毎や描画モード毎に条件分岐させて、それ毎のプロパティ値を取得します。しかし、jquery.js はそのような伝統的手法を採用しません。</p>
<p>まず、位置算出対象とする HTML 文内に、Javascript コードによって visibility:hidden; position:absolute 状態の複数の要素（ 要素 A 及びその offsetParent となる B 要素など ）を挿入します。これによって、ブラウザ毎に位置算出値が異なる可能性を持った要素を作ります。</p>
<p>次に、A や B の offsetTop や offsetLeft 値を取得し、それが正しい値とならない場合にのみ、ブラウザによって描画され適用されたスタイル値（ 算出スタイル値 ）を取得して、正しい値を求めるのです。</p>
<p>このように CSS 算出スタイル値、つまり実際に描画された状態における CSS 値を利用することで、ブラウザのバグや固有のプロパティ仕様を「あるがままに受け入れ」、結果としての要素位置を算出している訳です。</p>
<p class="mt_1">なお、Windows 系の主要ブラウザ（ IE、Firefox、Opera、safari、Chrome ）では、標準モードでも互換モードでも、全て getBoundingClientRect() メソッドをサポートしているので、offsetParent/Top/Left プロパティを利用する位置算出コードは利用されないことになります。</p>

<p class="mt_1">もう一つ、コード解読を行う前に、 IE の名誉のために是非とも触れておかねばならないことがあります。</p><p>上に述べた jquery.js で定義された メソッドやオブジェクトにおいて、要素位置取得用に利用されるメソッドとプロパティ ── <span class="pink">getBoundingClientRect()、offsetParent、offsetTop、offsetLeft</span> ── は、全て IE が最初に実装し、他のブラウザも追随して採用した、という事実です。</p>
<p>Netscape Navigater が初めて採用し、しかし他のどのブラウザも採用しなかった layer オブジェクトとは対照的に、当時の IE4 や IE5 が意欲的に定義し、採用した所謂 DHTML モデルが、今日主流となっている W3C 勧告の DOM や CSS に至る起爆剤となったことは、過去において、IE が勝手な仕様を作り続けてきたことが混乱を招来してきたとしても、記憶に留めておくべき重要な事実でしょう。</p> ]]>
</content:encoded>
<dc:subject>Javascript</dc:subject>
<dc:date>2010-01-13T00:01:51+09:00</dc:date>
<dc:creator>hkom</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://hkom.blog1.fc2.com/blog-entry-748.html">
<link>http://hkom.blog1.fc2.com/blog-entry-748.html</link>
<title>Windows 7 / Vista に GodMode なる特殊フォルダ機能が！</title>
<description> なるほど、あらゆる管理機能にアクセスすることの出来るフォルダが作成できる！
新規フォルダを作りその名前を GodMode.{ED7BA470-8E54-465E-825C-99712043E01C} とするだけの簡単な操作で、コントロールパネルに似た特殊フォルダが作成され、その中には膨大な数の Windows 管理機能のショートカットリストが格納されるのだ。
名称がいかにも誇大妄想的とはいえ、これはなかなか使えるかもしれない。
詳細はこちらの記事 「Wind
 </description>
<content:encoded>
<![CDATA[ <p>なるほど、あらゆる管理機能にアクセスすることの出来るフォルダが作成できる！</p>
<p>新規フォルダを作りその名前を GodMode.{ED7BA470-8E54-465E-825C-99712043E01C} とするだけの簡単な操作で、コントロールパネルに似た特殊フォルダが作成され、その中には膨大な数の Windows 管理機能のショートカットリストが格納されるのだ。</p>
<p>名称がいかにも誇大妄想的とはいえ、これはなかなか使えるかもしれない。</p>
<p class="mt_1">詳細はこちらの記事 <a href="http://japan.zdnet.com/news/os/story/0,2000056192,20406124,00.htm?tag=zdnw" target="_blank">「Windows 7」の管理機能を集約--「GodMode」の存在が明らかに - OS／プラットフォーム - ZDNet Japan</a> に掲載されている。</p>
 ]]>
</content:encoded>
<dc:subject>Operating System</dc:subject>
<dc:date>2010-01-06T07:43:53+09:00</dc:date>
<dc:creator>hkom</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://hkom.blog1.fc2.com/blog-entry-747.html">
<link>http://hkom.blog1.fc2.com/blog-entry-747.html</link>
<title>今年のIT技術で注目すべきことは？</title>
<description> PC Online 記事に見る今年の動向予測から抜粋すると・・・
Microsoft と Google の２強と iPhone 一人勝ちの2009年で更に勢いを得た Apple。これらの３社がそれぞれに OS、クラウド、スマートホンにおいて仕掛ける様々な展開がまず注目される。
Windows 7 は一気に普及し、定着していくだろうし、Chrome OS が無料で登場すれば確実に台風の目になるだろう。iPhone は強固な牙城を築いた日本の「ケータイ」の有り様を変えつつある
 </description>
<content:encoded>
<![CDATA[ <h4 class="addBgImg">PC Online 記事に見る今年の動向予測から抜粋すると・・・</h4>
<p>Microsoft と Google の２強と iPhone 一人勝ちの2009年で更に勢いを得た Apple。これらの３社がそれぞれに OS、クラウド、スマートホンにおいて仕掛ける様々な展開がまず注目される。</p>
<p>Windows 7 は一気に普及し、定着していくだろうし、Chrome OS が無料で登場すれば確実に台風の目になるだろう。iPhone は強固な牙城を築いた日本の「ケータイ」の有り様を変えつつあるが、Apple 社は次の一手（ディスプレイの更なる大型化やiPhone 技術を活かしたタブレットPCの投入など）を打ってくるかもしれない。</p>
<p>クラウドコンピューティングもますます進行し、もはやクラウドを使っていることさえ意識しないようになるかもしれない。</p>
<p class="mt_1">ハードにおいては、何と言っても USB 3.0 の普及が注目される。今年の年末商戦段階では、パソコンの標準インターフェースとなっているだろうし、ハードディスクや DVD プレーヤ、そしてその頃には標準装備となっているであろう Bluray ディスクドライブも USB 3.0 接続が当たり前になるだろう。</p>
<p>SSD (フラッシュメモリドライブ) の低廉化も注目に値する。裏返せば価格低下が進まなければ、ブレイクスルーしないだろう。</p>

<h4 class="addBgImg">そんなこんなの 2010 年に期待するものは？</h4>
<h5 class="palegreen borderLeft10 lh_11">クラウドコンピューティングに関する危惧</h5>
<p>クラウドコンピューティングは、安心して使えるとはどうしても思えない。民間企業に全てを委ねてしまうクラウドには、どうしても合点がいかないのだ。</p><p>「データをクラウドに蓄積することは銀行にお金を預けることと同様に安心して良いのだ」との意見もある。確かに「信用」の問題なのだが、一企業の都合でどうにでもなってしまうかもしれないクラウドには、どうしても不安を拭いきれない。</p>
<p>そんなことを言っても、そもそも 1 つのクラウドサービスである無料 Fc2 ブログを 5 年以上使い続けて、その恩恵にどっぷりと浴しているのに「自己矛盾も甚だしい」と切り替えされるとにべもないのだが・・・</p>
<p class="mt_1">個人ユースで代表的はクラウドサービスは、Web メール・ブログ・掲示版・SNS などだろう。</p><p>特に Gmail サービスは無料で 7 GB ものにディスクスペースが使えることから、全てのメールを Gmailに統合して一元管理する方法があちこちで紹介されている。しかし私はその方法を選択することには二の足を踏み続けている。</p>
<p>例えば、5年以上使い続けてきたある掲示版が昨年末に閉鎖された（ kidd.jp ）。そしてその閉鎖を知ったのは、迷惑記事投稿が度重なるので、記事削除を行うために偶々 kidd.jp/bbs にアクセスした際であった。管理のためにアクセスして初めて 2009 年で閉鎖されることを「知った」のだ。</p><p>閉鎖に際してメールによる閉鎖通知が来るでもなく、掲示版データのバックアップなどに関する案内がユーザーに送られるでもなく、「会社の都合」により一方的に閉鎖されたのである。</p>
<p class="mt_1">こうした事例1つをとっても、クラウドは根本的に信頼できないと思うのだ。</p>
<p class="mt_1 ta_c">つづく</p> ]]>
</content:encoded>
<dc:subject>IT</dc:subject>
<dc:date>2010-01-04T11:59:24+09:00</dc:date>
<dc:creator>hkom</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://hkom.blog1.fc2.com/blog-entry-746.html">
<link>http://hkom.blog1.fc2.com/blog-entry-746.html</link>
<title>GyaoReader とソフトバンク</title>
<description> GyaO の売却 Yahoo への吸収
たしかそれは 2009 年 9 月か 10 月だったと思う。GyaO が softbank 傘下に吸収されたのは。
しかし、それ以降でも、それ以前と変わらずに配信される動画を GyaoReader を使って特に支障なく Windows Media Player11 で鑑賞出来ていた。ところが、最近（12月初旬）になって、配信動画を Windows Media Player11 で鑑賞することが出来なくなった。「関連付けられた再生リストに項目が含まれていないか
 </description>
<content:encoded>
<![CDATA[ <h4 class="addBgImg">GyaO の売却 Yahoo への吸収</h4>
<p>たしかそれは 2009 年 9 月か 10 月だったと思う。GyaO が softbank 傘下に吸収されたのは。</p>
<p>しかし、それ以降でも、それ以前と変わらずに配信される動画を GyaoReader を使って特に支障なく Windows Media Player11 で鑑賞出来ていた。</p><p>ところが、最近（12月初旬）になって、配信動画を Windows Media Player11 で鑑賞することが出来なくなった。「関連付けられた再生リストに項目が含まれていないか、再生リストが無効なので、ファイルを再生できません。」と警告表示が出て先に進めず、全く鑑賞できないのである。</p>
<p>グーグって見ると、<a href="http://pcbase.web.infoseek.co.jp/cgi-bin/patio_k/read.cgi?no=5054" target="_blank">「ギャオで見れない」</a> 等が見つかり、GyaO の仕様変更が原因でそのような現象が生じること、その変更に対応した GyaoReader 新バージョン 0.34.3 が登場していること───が分かった。</p>
<p class="mt_1">そこで早速、GyaoReader Website：<a href="http://pcbase.web.infoseek.co.jp/" target="_blank">「しみず工房」</a>内から、その新バージョンのダウンロード試みた。これまでと同様に「しみず工房」サイトの下の方にある Vector サイトへのリンクをクリックして、そこから DL しようとしたのである。</p>
<p>ところが、今度は当該ダウンロード先のベクターサイトからのダウンロードが巧くいかない。</p>
<p>何度も試してみたが、その都度エラーとなってしまう。それにも拘わらず、しみず工房サイト内にあるダウンロード先が vector であることを示した文字列は数週間有効なままとなっていた。</p>
<p>当該リンクに横線が引かれ、Vector からのダウンロードが出来ないことが明示されたのは、やっと数日前のことである。</p>

<h4 class="addBgImg">softbank 社が GyaoReader 排除に乗り出したか？</h4>
<p>12月になってからのこうした二重の「障害」は、softbank による GyaoReader 排除対策ではないか、と推測せざるを得ない。</p><p>実際、株式会社ベクターが 1999 年に ヤフー株式会社から出資を受けたことを皮切りに、現 softbank BB 社との連携を強め、今日に至っていることを踏まえると、この推測はあながち根拠がない訳ではない。</p>
<div class="point ml_2"><p>そして、1999年ヤフー株式会社からの出資をきっかけにソフトバンクグループ入りをします。翌2000年に、ソフトバンクグループでもダウンロード事業を開始したことをきっかけに、ソフトバンク・コマース株式会社（現・ソフトバンクBB株式会社）とパソコン用ソフトのダウンロード販売分野で業務提携。さらに資本面での関係も強化し、ソフトバンクグループとの関係を、より強固なものとしていきます。「ソフトバンク・コマースは最大のパソコンソフト流通会社です。提携することによって、より多くのソフトを扱うことが可能となり、今日に至っています。</p><p>出典：<a href="http://www.softbank.co.jp/ja/news/sbnews/group/2009/20091211_01/index.html" target="_blank">株式会社ベクター | ソフトバンク株式会社</a></p></div>
<p class="mt_1">softbank 社は、利便性を排除するのではなく、ユーザーサイドに立った普及をこそ、心がける立場にあるはずだ！</p><p>このまま推移すると、折角の GyaO サービスも次第に衰退していくと思われる。</p> ]]>
</content:encoded>
<dc:subject>IT</dc:subject>
<dc:date>2009-12-30T12:24:25+09:00</dc:date>
<dc:creator>hkom</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://hkom.blog1.fc2.com/blog-entry-745.html">
<link>http://hkom.blog1.fc2.com/blog-entry-745.html</link>
<title>また Christmasシーズン が到来しクリスマスソングに溺れる日々</title>
<description> 2 年前に「 Xmas Songs について 」 書いた。
そして同じ季節が巡ってくると、その時と同じ気分がふつふつと湧いてくる。
キリスト教は勿論一切の宗教に何の興味もない私だが、クリスマスソングが醸し出すその固有の世界に共鳴する。
純粋、無垢、清廉、神聖、清粋、清冽、廉潔、純真・・・。クリスマスソングが醸成する世界には、こうした言葉が静かに漂い、広がり、澄み切った空気を満たしている。
その空気がたまらなく好き
 </description>
<content:encoded>
<![CDATA[ <p>2 年前に「 <a href="http://hkom.blog1.fc2.com/blog-entry-602.html" target="_blank">Xmas Songs について 」</a> 書いた。</p>
<p>そして同じ季節が巡ってくると、その時と同じ気分がふつふつと湧いてくる。</p>
<p class="mt_1">キリスト教は勿論一切の宗教に何の興味もない私だが、クリスマスソングが醸し出すその固有の世界に共鳴する。</p>
<p>純粋、無垢、清廉、神聖、清粋、清冽、廉潔、純真・・・。クリスマスソングが醸成する世界には、こうした言葉が静かに漂い、広がり、澄み切った空気を満たしている。</p>
<p>その空気がたまらなく好きなのだ。</p>
<p>だから、クリスマスソングだけを流しているインターネットラジオ局を、通勤途上や昼休みに iPhone で聞き続けている。</p>
 ]]>
</content:encoded>
<dc:subject>Blog</dc:subject>
<dc:date>2009-12-23T12:38:06+09:00</dc:date>
<dc:creator>hkom</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://hkom.blog1.fc2.com/blog-entry-744.html">
<link>http://hkom.blog1.fc2.com/blog-entry-744.html</link>
<title>原因不明であるが、自宅のランがインターネットから受信はできるが送信できなくなった。</title>
<description> 原因は全く不明であるが数日前から、メールが送れなくなった。宅ファイル便などへのファイルのアップロードも出来ない。
ダウンロードは出来るし、ネットサーフィンも出来る。メールの受信も出来るのに発信が出来ないのである。
有線リソースからでも、無線リソースからでも同様であった。
このようなことは1994年にインターネットを始めて以来、初めて遭遇した奇怪な事件だ。
つづく
 </description>
<content:encoded>
<![CDATA[ <h4 class="addBgImg"></h4>
<p>原因は全く不明であるが数日前から、メールが送れなくなった。宅ファイル便などへのファイルのアップロードも出来ない。</p>
<p>ダウンロードは出来るし、ネットサーフィンも出来る。メールの受信も出来るのに発信が出来ないのである。</p>
<p class="mt_1">有線リソースからでも、無線リソースからでも同様であった。</p>
<p>このようなことは1994年にインターネットを始めて以来、初めて遭遇した奇怪な事件だ。</p>
<p>つづく</p>
 ]]>
</content:encoded>
<dc:subject>IT</dc:subject>
<dc:date>2009-12-16T08:01:47+09:00</dc:date>
<dc:creator>hkom</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://hkom.blog1.fc2.com/blog-entry-743.html">
<link>http://hkom.blog1.fc2.com/blog-entry-743.html</link>
<title>iPhone はもう飽きた。jQueryに戻りたい</title>
<description> ということで卒業しようと思う。電話とメールといくつかのアプリを使って、せいぜいPDAとして使える範囲で適当に使っていこうと思う。それは余り追求し甲斐はなかった。
 </description>
<content:encoded>
<![CDATA[ ということで卒業しようと思う。<br /><br />電話とメールといくつかのアプリを使って、せいぜいPDAとして使える範囲で適当に使っていこうと思う。<br /><br />それは余り追求し甲斐はなかった。 ]]>
</content:encoded>
<dc:subject>モバイル</dc:subject>
<dc:date>2009-12-09T00:51:14+09:00</dc:date>
<dc:creator>hkom</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://hkom.blog1.fc2.com/blog-entry-742.html">
<link>http://hkom.blog1.fc2.com/blog-entry-742.html</link>
<title>iPhone の不便さ(3)───それは携帯 PC たり得ない</title>
<description> 画面の小ささは如何ともし難い
言うまでもなく iPhone の本質は、パソコン機能がある携帯電話にあるのではない。
それは電話も出来る携帯パソコンであり、懐かしい言葉で言えば PDA（Personal Data Assistance）である。
その観点から見た場合、本当にパソコンたり得るだろうか？
あの小さい画面で（といっても携帯電話の中では大きな方だが）、好んで Web サーフィンを行うだろうか？
あの画面で業務に使用する文書を作成す
 </description>
<content:encoded>
<![CDATA[ <h4 class="addBgImg">画面の小ささは如何ともし難い</h4>
<p>言うまでもなく iPhone の本質は、パソコン機能がある携帯電話にあるのではない。</p>
<p>それは電話も出来る携帯パソコンであり、懐かしい言葉で言えば PDA（Personal Data Assistance）である。</p>
<p class="mt_1">その観点から見た場合、本当にパソコンたり得るだろうか？</p>
<p>あの小さい画面で（といっても携帯電話の中では大きな方だが）、好んで Web サーフィンを行うだろうか？</p>
<p>あの画面で業務に使用する文書を作成するだろうか？</p>
<p>仮に作成できるとして、エクセルやPDFファイルを作成し、編集するだろうか？</p>
<p>SMS 的なメールではない、連絡だけではない業務メールを作成するだろうか？</p>
<p class="mt_1">全て、否！ である。</p>
<p class="ml_2 mt_1">iPhone を取り扱っているソフトバンク社の孫社長は、「PCを使う頻度が10分の1に減った。ネット利用の95%をiPhone経由で行っている。」と宣わったが、我田引水であることを差し引いても、文書は皆部下に作成させ、それを校閲するだけであろう社長ならではの、雲の上の世界の戯言に過ぎない。</p>
<p class="mt_1">あんな小さな画面で業務文書を作成するなど、およそ非現実的と言わざるを得ないのである。</p>

<h4 class="addBgImg">つまり携帯 PC たり得ない</h4>
<p>携帯できるパソコンであるはずなのに、iPhone は実際にはそのような使い方は出来ない。</p>
<p>一般的な使い方としては、簡単な連絡メールを送受信し、エクセルやアクロバットファイルを閲覧し（これもパソコンのように気軽に素早く閲覧できるわけではない）、スケジュール管理を行い（入力は面倒だけど）、簡単なメモを取り、時には天気を Web サイトで調べたり、飲み会の候補店をサイト検索する程度のことしか、行わないであろう。あるいは、道に迷った時に地図を立ち上げてナビゲートすることもあるだろう。</p>
<p>アプリケーション iTunes や iPod を使って音楽や動画を楽しむこともあるだろうが、あの小さな画面で動画を見るのは、決して快適で楽しいものではない。</p>
<p>更に「そういえば」電話をすることもある。ゲームもするだろう。しかしそれはパソコンの本来の業務用ユースではない。</p>

<h4 class="addBgImg">B4 または A5 サイズの携帯 PC が好ましいのかもしれない</h4>
<p>電話は電話専用の携帯電話に譲り、メモやスケジュール管理や簡単な Web 検索をおこなうための携帯パソコンのあるべき姿は、結局のところ流行の「ネットパソコン」なのかもしれない。</p>
<p>それは決して iPhone サイズの miniPDA ではないだろう───これが結論である。</p>
 ]]>
</content:encoded>
<dc:subject>モバイル</dc:subject>
<dc:date>2009-12-05T02:31:59+09:00</dc:date>
<dc:creator>hkom</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://hkom.blog1.fc2.com/blog-entry-741.html">
<link>http://hkom.blog1.fc2.com/blog-entry-741.html</link>
<title>iPhone の不便さ(2)───クリップボード履歴さえ簡単に取得できない</title>
<description> 「脱獄」しない限りクリップボードの履歴を自動取得できない。
ケータイでは当たり前のクリップボード履歴機能だが、iPhone にはそれがない。履歴を取得するための、App Store で提供されている審査済みアプリは以下のようにいくつかあるが、それらは唯一の例外を除いて皆、必ずそのソフトを起動しなければ履歴を記録してくれない。
現在作業中のソフトを一旦中断してから、履歴ソフトを起動しなければならず、しかも起動後に或
 </description>
<content:encoded>
<![CDATA[ <h4 class="addBgImg">「脱獄」しない限りクリップボードの履歴を自動取得できない。</h4>
<p>ケータイでは当たり前のクリップボード履歴機能だが、iPhone にはそれがない。履歴を取得するための、App Store で提供されている審査済みアプリは以下のようにいくつかあるが、それらは唯一の例外を除いて皆、必ずそのソフトを起動しなければ履歴を記録してくれない。</p>
<p>現在作業中のソフトを一旦中断してから、履歴ソフトを起動しなければならず、しかも起動後に或る操作をしなければならないソフトさえ或る。つまり一手間も二手間も多いのである。</p><p>或る作業をしている時の clipboard 履歴情報は、背景で「自動的に」記録してくれなければ余りに使いにくいのだ。</p>
<div class="ml_2 mr_4 point">
<p>clipboard 履歴の取れる Apple 社審査済みアプリ</p>
<ul class="ml_2">
<li>iDO Clipboard</li>
<li>clipboard Manager and History</li>
<li>Scraps</li>
<li>clipboard Pro</li>
</ul></div>
<p class="mt_1">clipboard Pro だけはクリップボードの内容を自動的に取得するものの、日本語が悉く文字化けしてしまうため、テキスト履歴は全く使い物にならない。</p>
<p>仮に文字化け問題を不問に付すとしても、clipboard Pro に蓄えられた履歴を使用するには、使用しているアプリを中断・終了して、clipboard Pro を起動しなければならないことも欠点である。</p>
<p>使用中の任意のアプリはそのままに、その画面の中から clipboard Pro に蓄えられた履歴が使用できなければ不便である。</p>
<h4 class="addBgImg">脱獄すれば・・・</h4>
<p>しかし、脱獄して、PasteboardStacker と言うソフトをインストールすれば、自動的に 20 件迄のクリップボード履歴がとれるし、かつ或るアプリを使用しているその中で履歴情報を表示させ paste することが出来る。</p>
<p>「クリップボード履歴の自動取得と任意のアプリ内での paste 可」───これこそが履歴アプリが備えるべき必要にして十分な性能である。</p>
<p class="mt_1">敢えて脱獄する程マニアックでも暇でもないので、基本的には気が進まないが、余りの不便さに迷い始めている───脱獄しようか、と。</p>
<p>端的に言って、日本のケータイのように使える iPhone のような製品が、日本のキャリアから発売されることが最も望ましいことだ。しかしそれは叶わぬ夢だろう。</p><p>となれば、Apple 社の制約の多さと哲学の頑固さに辟易としながら使い続けるか、脱獄するか、あるいは第三の道である Android 携帯に乗り換えるか、それが問われている。</p>
 ]]>
</content:encoded>
<dc:subject>モバイル</dc:subject>
<dc:date>2009-12-01T00:40:09+09:00</dc:date>
<dc:creator>hkom</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://hkom.blog1.fc2.com/blog-entry-740.html">
<link>http://hkom.blog1.fc2.com/blog-entry-740.html</link>
<title>iPhone の不便さ(1)───連絡帳にグループを設定するのにソフトが必要</title>
<description> 連絡先のグループ化はどうしても必要なことだ
日本の携帯電話ならば当たり前に装備されており、日常的な利用において不可欠であることが、デフォルト状態のiPhone には備わっていないことが沢山ある。
その 1 つが連絡先のグループ化であり、グループをメールの宛先とする機能である。
これはメールを使用する上で、余りに当然の基本的な装備であるが、初期状態の iPhone ではこんなことさえ出来ないのだ。
今までの携帯電話に
 </description>
<content:encoded>
<![CDATA[ <h4 class="addBgImg">連絡先のグループ化はどうしても必要なことだ</h4>
<p>日本の携帯電話ならば当たり前に装備されており、日常的な利用において不可欠であることが、デフォルト状態のiPhone には備わっていないことが沢山ある。</p>
<p>その 1 つが連絡先のグループ化であり、グループをメールの宛先とする機能である。</p>
<p class="mt_1">これはメールを使用する上で、余りに当然の基本的な装備であるが、初期状態の iPhone ではこんなことさえ出来ないのだ。</p>
<p>今までの携帯電話にはない、素晴らしい機能を満載していることは間違いないし、そもそも iPhone はケータイではない。それは携帯性に優れた、電話機能も付いた情報端末パソコンである。そんなことは分かりきっている。</p>
<p>しかし、同時に iPhone が phone と名付けられたことに象徴されるように、それはケータイでもあって、かつそうであることを真正面から主張すらしているのである。</p>
<p>にもかかわらず、ケータイとしての基礎的な装備がないのはいただけない！ 欠陥とまでは言わないが、少なくとも日本の携帯キャリアが驚異に感じない程度の製品に止まっていると言わざるを得まい。</p>
<p>つまり、携帯市場を席巻するような爆発的でエポックメーキングな売れ行きは決して起こらないであろうと思われる。</p>
<p class="ta_r"><a title="ページトップへ" class="Back2Top">▲ToTop</a></p>

<h4 class="addBgImg">批評はさておき、アドレス帳のグループ化である</h4>
<p>これもまた、残念ながらアプリで対応せざるを得ない</p>
<p>アプリを使わない方法もあるが、一々面倒でとても一般的にその方法を採用する気にはなれない。</p>
<p class="mt_1">そこでサイト検索を掛けた結果、それなりに使える有料アプリに辿り着いた。</p>
<p>それは、GRContact（350円 <a href="http://sanzoproduct.web.fc2.com/grcontact/" target="_blank">GRContact</a>）である。</p>
<p>115円の同種のアプリがいくつかあるが、日本語環境との親和性や機能の豊富さからこのアプリが最適解であると思われる。</p>
<p>それは日本限定商品であり、今年の7月16日に発売された、比較的新しい製品である。</p>
<p>電話の発信方法まで設定 (通常発信・186発信・184発信)出来るし、何よりもグループ内のアドレスがひらがな順にソートされるのが嬉しい。前方一致だけではなく部分一致でもアドレス検索が出来るし、もちろんグループに属するアドレス宛に一括送信することも出来る。</p>
<p class="ta_r"><a title="ページトップへ" class="Back2Top">▲ToTop</a></p>
 ]]>
</content:encoded>
<dc:subject>モバイル</dc:subject>
<dc:date>2009-11-30T01:34:44+09:00</dc:date>
<dc:creator>hkom</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
</rdf:RDF>
