<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-37493881</id><updated>2011-04-22T04:33:02.094+09:00</updated><title type='text'>yamachan Ajax/.NET/C#  メモ</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://yamachan-cs.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37493881/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://yamachan-cs.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>yamachan</name><uri>http://www.blogger.com/profile/04446691959536738480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://yamachan.sakura.ne.jp/sblo_files/hannover/image/yamachan1.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>14</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-37493881.post-8109339859669222699</id><published>2007-05-03T23:00:00.000+09:00</published><updated>2007-05-06T10:38:46.923+09:00</updated><title type='text'>[C#] synergy 補助ツール mac2ip v1.00</title><content type='html'>最近、&lt;a href="http://synergy2.sourceforge.net/"&gt;Synergy&lt;/a&gt; というフリーの キーボード/マウス の共有ツールを愛用しています。 非常に便利です。 ツールの概要は &lt;a href="http://journal.mycom.co.jp/column/yetanother/091/"&gt;Yet Another 仕事のツール&lt;/a&gt; あたりを参照してください。 日本語版の入手は &lt;a href="http://wiki.nothing.sh/page/memo/Synergy"&gt;このへん&lt;/a&gt; とか。&lt;br /&gt;&lt;br /&gt;さて、ウチはマンション備え付けのインターネット接続を利用していて、ルーターの設定が変更できません。 サーバーとなるマシンの IP Address を固定できず、再起動のたびに調べ、クライアント側に設定する必要があります。 なかなか面倒です。&lt;br /&gt;&lt;br /&gt;マシンの MACアドレスは固定ですから、そこから IPアドレス を得られれば自動化ができそうな気がします。 そこで Windows用の rarp 的なツールを探してみたのですが、うまく見つかりませんでした。 &lt;br /&gt;&lt;br /&gt;探すのが面倒になりまして、勉強中の C# で簡単なツールを作成してみました。 実行には .Net Framework 2.0 が必要です。&lt;br /&gt;&lt;br /&gt;mac2ip v1.00: &lt;a href="http://rinco.jp/soft/mac2ip_v100.zip"&gt;mac2ip_v100.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;使い方は簡単で、マシンの MAC Address (例:00-11-22-33-44-55) を指定すると、対応する IP Address (例:192.168.20.18) を探して表示してくれます。&lt;br /&gt;&lt;br /&gt;&lt;img src="http://rinco.jp/blog/cs/20070502_mac2ip.gif" width="282" height="58" alt="mac2ip v1.00 実行例" /&gt;&lt;br /&gt;引数を2つ指定した場合には、環境変数の設定用の出力になります。 バッククォーテーション(`)で実行結果と置換できない Windows でのバッチ処理に組み込むための、簡易的な実装です。&lt;br /&gt;&lt;br /&gt;IP Address の検索は、arp テーブルを参照することで実現しています。 見つからない場合はブロードキャスト(例の場合は 192.168.20.255) への ping を実行し、arp テーブルを再チェックします。&lt;br /&gt;&lt;br /&gt;それでも見つからない場合には、自分に近いアドレスから順に ping して探していきます。 調査対象の IP Address が、調査元のものより離れている場合には、少し時間がかかります。&lt;br /&gt;&lt;br /&gt;さて、僕は以下のようなバッチファイルを作成し、synergy ディレクトリに mac2ip.exe と一緒に置いています。&lt;br /&gt;&lt;br /&gt;&lt;pre class="yamachan-js"&gt;mac2ip.exe SVR_ADDR 00-11-22-33-44-55 &gt; mac2ip-tmp.cmd&lt;br /&gt;echo start /b synergyc %%SVR_ADDR%% &gt;&gt; mac2ip-tmp.cmd&lt;br /&gt;mac2ip-tmp.cmd&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;サーバーの IP Address を自動的に検索し、synergy クライアントを起動するバッチです。 "00-11-22-33-44-55" の部分は、synergy サーバーの実際の MAC Address に書き換えてください。&lt;br /&gt;&lt;br /&gt;このバッチをスタートアップに登録しておくのも良いでしょう。&lt;br /&gt;&lt;br /&gt;【2007/05/06 追記】&lt;br /&gt;&lt;br /&gt;synergy は多重起動するとエラーになるみたいですね。 クライアント再起動のために改良したバッチは以下になります。&lt;br /&gt;&lt;br /&gt;&lt;pre class="yamachan-js"&gt;echo taskkill /F /IM synergyc.exe &gt; mac2ip-tmp.cmd&lt;br /&gt;mac2ip.exe SVR_ADDR 00-11-22-33-44-55 &gt;&gt; mac2ip-tmp.cmd&lt;br /&gt;echo start /b synergyc %%SVR_ADDR%% &gt;&gt; mac2ip-tmp.cmd&lt;br /&gt;mac2ip-tmp.cmd&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;taskkill コマンドは Windows XP Home には無いようです。 この場合 &lt;a href="http://www.microsoft.com/technet/sysinternals/utilities/pskill.mspx"&gt;pskill&lt;/a&gt; コマンドを導入して代用するとよいでしょう。&lt;br /&gt;&lt;br /&gt;&lt;pre class="yamachan-js"&gt;echo pskill -t synergyc.exe &gt; mac2ip-tmp.cmd&lt;br /&gt;mac2ip.exe SVR_ADDR 00-11-22-33-44-55 &gt;&gt; mac2ip-tmp.cmd&lt;br /&gt;echo start /b synergyc %%SVR_ADDR%% &gt;&gt; mac2ip-tmp.cmd&lt;br /&gt;mac2ip-tmp.cmd&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37493881-8109339859669222699?l=yamachan-cs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yamachan-cs.blogspot.com/feeds/8109339859669222699/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=37493881&amp;postID=8109339859669222699&amp;isPopup=true' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37493881/posts/default/8109339859669222699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37493881/posts/default/8109339859669222699'/><link rel='alternate' type='text/html' href='http://yamachan-cs.blogspot.com/2007/05/c-synergy-mac2ip-v100.html' title='[C#] synergy 補助ツール mac2ip v1.00'/><author><name>yamachan</name><uri>http://www.blogger.com/profile/04446691959536738480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://yamachan.sakura.ne.jp/sblo_files/hannover/image/yamachan1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37493881.post-6467583799482288526</id><published>2007-03-01T23:00:00.001+09:00</published><updated>2008-05-14T22:28:01.409+09:00</updated><title type='text'>[JS] 画像に簡単に効果をつけるクラス</title><content type='html'>画像にちょっとした効果をつけたいという要望はけっこうあります。 良く使う効果を簡単に記述できるようなコード、&lt;strong&gt;ImgTool&lt;/strong&gt; を作成してみました。&lt;br /&gt;&lt;br /&gt;まずは、マウスを重ねると画像が変わるという効果です。 ボタンなんかで、よく使用しますね。&lt;br /&gt;&lt;br /&gt;&lt;img src="http://rinco.jp/blog/img/search_48x24_glass.gif" onload="new jp.rinco.ImgTool(this, 'http://rinco.jp/blog/search_48x24_glass_orange.gif');" /&gt;&lt;br /&gt;&lt;pre class="yamachan-js"&gt;&amp;lt;img src="search_glass.gif"&lt;br /&gt; onload="new jp.rinco.ImgTool(this,'search_orange.gif');"&lt;br /&gt;/&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;onload の部分が、今回作成した ImgTool を使用している部分です。 最初の引数は this、二番目の引数にはマウスを重ねている間に表示する画像を指定します。 簡単でしょ？&lt;br /&gt;&lt;br /&gt;次は、マウスを重ねているあいだだけ、画像を拡大表示する効果です。&lt;br /&gt;&lt;br /&gt;&lt;img src="http://yamachan.sakura.ne.jp/sblo_files/hannover/image/yamachan1.jpg" width="43" height="62" onload="new jp.rinco.ImgTool(this, 5);" /&gt;&lt;br /&gt;&lt;pre class="yamachan-js"&gt;&amp;lt;img src="yamachan1.jpg" width="43" height="55"&lt;br /&gt;  onload="new jp.rinco.ImgTool(this, 5);"&lt;br /&gt;/&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;さきほどの画像のかわりに、5 という数値を指定しています。 これは拡大する倍数で、この例ではマウスを重ねると5倍の大きさになります。&lt;br /&gt;&lt;br /&gt;次は同じような例ですが、倍数ではなく、拡大したときの横幅、縦幅をドットで指定します。&lt;br /&gt;&lt;br /&gt;&lt;img src="http://yamachan.sakura.ne.jp/sblo_files/hannover/image/yamachan1.jpg" width="43" height="62" onload="new jp.rinco.ImgTool(this, 215, 62);" /&gt;&lt;br /&gt;&lt;pre class="yamachan-js"&gt;&amp;lt;img src="yamachan1.jpg" width="43" height="55"&lt;br /&gt;  onload="new jp.rinco.ImgTool(this, 215, 62);"&lt;br /&gt;/&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;どうでしょう、マウスを重ねると画像が横に伸びたでしょうか？&lt;br /&gt;&lt;br /&gt;さて、これまでの例は onload にコードを記載していましたが、画像の id を指定して、後から効果を加えることもできます。&lt;br /&gt;&lt;br /&gt;&lt;img src="http://rinco.jp/blog/img/search_48x24_glass.gif" onload="var it = new jp.rinco.ImgTool(this, 'http://rinco.jp/blog/search_48x24_glass_orange.gif');it.overBorder = 'solid 2px red';it.downWidth = it.width * 3;it.downHeight = it.height * 3;"/&gt;&lt;br /&gt;&lt;pre class="yamachan-js"&gt;&amp;lt;img src="yamachan1.jpg" id="ImgTool-sample" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;script&amp;gt;&lt;br /&gt;var it = new jp.rinco.ImgTool('ImgTool-sample');&lt;br /&gt;it.overSrc = "search_orange.gif";&lt;br /&gt;it.overBorder = "solid 2px red";&lt;br /&gt;it.downWidth = it.width * 3;&lt;br /&gt;it.downHeight = it.height * 3;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;今回はマウスを重ねると画像が変わり、赤い枠がつきます。 また画像をクリックしている間、三倍に拡大表示します。&lt;br /&gt;&lt;br /&gt;現在の ImgTool では、以下のパラメーターを設定することができます。&lt;br /&gt;&lt;br /&gt;&lt;pre class="yamachan-doc"&gt;* 画像の初期設定値 (参照のみ)&lt;br /&gt; &lt;br /&gt;width, height, src, border, color, bgcolor&lt;br /&gt; &lt;br /&gt;* マウスオーバー時の設定&lt;br /&gt; &lt;br /&gt;overWidth, overHeight, overSrc&lt;br /&gt;overBorder, overColor, overBackgroundColor&lt;br /&gt; &lt;br /&gt;* マウスクリック時の設定&lt;br /&gt; &lt;br /&gt;downWidth, downHeight, downSrc&lt;br /&gt;downBorder, downColor, downBackgroundColor&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;実際のコードは以下になります。 長いので、効果の数は減らしてあります。 完全なコードに興味のある方は、&lt;a href="http://rinco.jp/blog/yamachan_common.js"&gt;yamachan_common.js&lt;/a&gt; ファイルを参照してください。&lt;br /&gt;&lt;br /&gt;まずは最初の初期化部分です。 画像の最初の状態を保存しておき、また初期化の際の引数を処理しています。&lt;br /&gt;&lt;br /&gt;&lt;pre class="yamachan-js"&gt;jp.rinco.ImgTool = function(t, p1, p2) {&lt;br /&gt; if (typeof(t) == 'string')&lt;br /&gt;   this.target = document.getElementById(t);&lt;br /&gt; else &lt;br /&gt;   this.target = t;&lt;br /&gt; this.src = this.target.src;&lt;br /&gt; if (this.target.style.width == "")&lt;br /&gt;   this.width = this.target.width;&lt;br /&gt; else&lt;br /&gt;   this.width = this.target.style.width;&lt;br /&gt; if (this.target.style.height == "")&lt;br /&gt;   this.height = this.target.height;&lt;br /&gt; else&lt;br /&gt;   this.height = this.target.style.height;&lt;br /&gt; this.overWidth = "";&lt;br /&gt; this.overHeight = "";&lt;br /&gt; this.overSrc = "";&lt;br /&gt; &lt;br /&gt; if (p1 != undefined) {&lt;br /&gt;   if (typeof(p1) == 'string')&lt;br /&gt;     this.overSrc = p1;&lt;br /&gt;   else {&lt;br /&gt;     if (p2 == undefined) {   &lt;br /&gt;       this.overWidth = this.FxMulti(this.width, p1);  &lt;br /&gt;       this.overHeight = this.FxMulti(this.height,p1);&lt;br /&gt;     } else {&lt;br /&gt;       this.overWidth = p1;  &lt;br /&gt;       this.overHeight = p2;    &lt;br /&gt;     }  &lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;引き続き、クラス初期化の後半です。 イベント処理をおこなう関数を定義しています。&lt;br /&gt;&lt;br /&gt;スタイルの変更は最初、foo.style.setAttribute(t,v); のように実行していましたが、Firefox では動作しないようです。 悩んだ結果、対象のイメージ内で eval() を実行するという荒業で実装してみました。 (^-^;&lt;br /&gt;&lt;br /&gt;&lt;pre class="yamachan-js"&gt; this.target.evalAttribute = function(t, v, d) {&lt;br /&gt;   if (v != "") {&lt;br /&gt;     if (d == undefined) {&lt;br /&gt;       eval("this." + t + "='" + v + "'");   &lt;br /&gt;     } else {&lt;br /&gt;       eval("this." + t + "='" + d + "'");   &lt;br /&gt;     }&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt; this.target.evalAttribute("style.width",&lt;br /&gt;       this.Fx(this.width));&lt;br /&gt; this.target.evalAttribute("style.height",&lt;br /&gt;       this.Fx(this.height));&lt;br /&gt;  &lt;br /&gt; this.onmouseover = function() {&lt;br /&gt;   this.target.evalAttribute("style.width",&lt;br /&gt;       this.Fx(this.overWidth));&lt;br /&gt;   this.target.evalAttribute("style.height",&lt;br /&gt;       this.Fx(this.overHeight));&lt;br /&gt;   this.target.evalAttribute("src", this.overSrc);&lt;br /&gt; }&lt;br /&gt; this.onmouseout = function() {&lt;br /&gt;   this.target.evalAttribute("style.width",&lt;br /&gt;       this.overWidth, this.Fx(this.width));&lt;br /&gt;   this.target.evalAttribute("style.height",&lt;br /&gt;       this.overHeight, this.Fx(this.height));&lt;br /&gt;   this.target.evalAttribute("src",&lt;br /&gt;       this.overSrc, this.src);&lt;br /&gt; }&lt;br /&gt;  &lt;br /&gt; this.target.aImgTool = this;&lt;br /&gt; this.target.onmouseover = function() {&lt;br /&gt;   this.aImgTool.onmouseover();&lt;br /&gt; }&lt;br /&gt; this.target.onmouseout = function() {&lt;br /&gt;   this.aImgTool.onmouseout();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;最後にご紹介するのは、prototype で定義した補助関数です。&lt;br /&gt;&lt;br /&gt;今回、いったん作成したコードを、Firefox で動作させるのに苦労しました。 特に「FireFoxの標準モードでは、style.width,heightに数値での設定ができない」という制限に気がつくまでが長かった...。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Fx()&lt;/strong&gt; は上記の制限に対応するための quick hack で、数値を渡すと px 表記に変換して返すだけの補助関数です。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;FxMulti()&lt;/strong&gt; も似たようなもので、px などの余分な文字が指定されていた場合でも、正常に掛け算を実行するだけの補助関数です。 引数に倍率を指定した場合に使用しています。&lt;br /&gt;&lt;br /&gt;&lt;pre class="yamachan-js"&gt;jp.rinco.ImgTool.prototype.Fx = function(v) {&lt;br /&gt; if (typeof(v) == "number")&lt;br /&gt;   return v + "px";&lt;br /&gt; else&lt;br /&gt;   return v;&lt;br /&gt;}&lt;br /&gt; &lt;br /&gt;jp.rinco.ImgTool.prototype.FxMulti = function(v, m) {&lt;br /&gt; if (typeof(v) == "number")&lt;br /&gt;   return eval(v + "*" + m);&lt;br /&gt; var myReg = new RegExp("[0-9]+", "i");&lt;br /&gt; if (!myReg.test(v))&lt;br /&gt;   return "error";&lt;br /&gt; &lt;br /&gt; var ret = eval(myReg.exec(v) + "*" + m);&lt;br /&gt; return RegExp.leftContext + ret + RegExp.rightContext; &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;ちなみに今回のオブジェクトは、画像が主なターゲットと想定して作成したため、&lt;strong&gt;ImgTool&lt;/strong&gt; という名前になっています。 が、画像以外に使用してもかまいません。&lt;br /&gt;&lt;br /&gt;&lt;div id="ImgTool-sample" style="width:180px; height:50px; border:solid 4px red; background-color:green; color:white" &gt;DIV タグに使用した例&lt;br/&gt;&amp;nbsp;マウスを上に&lt;br/&gt;&amp;nbsp;マウスをクリック&lt;/div&gt;&lt;br /&gt;&lt;img src="http://rinco.jp/blog/img/search_48x24_glass.gif" width="0" height="0" onload="var it2 = new jp.rinco.ImgTool('ImgTool-sample');it2.overWidth=250;it2.overHeight=100;it2.overBorder = 'solid 6px blue';it2.downColor = 'red';it2.downBackgroundColor = 'pink';" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37493881-6467583799482288526?l=yamachan-cs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yamachan-cs.blogspot.com/feeds/6467583799482288526/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=37493881&amp;postID=6467583799482288526&amp;isPopup=true' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37493881/posts/default/6467583799482288526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37493881/posts/default/6467583799482288526'/><link rel='alternate' type='text/html' href='http://yamachan-cs.blogspot.com/2007/03/js.html' title='[JS] 画像に簡単に効果をつけるクラス'/><author><name>yamachan</name><uri>http://www.blogger.com/profile/04446691959536738480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://yamachan.sakura.ne.jp/sblo_files/hannover/image/yamachan1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37493881.post-7214538464942451472</id><published>2007-02-27T23:00:00.000+09:00</published><updated>2007-03-01T21:37:18.681+09:00</updated><title type='text'>[Ajax] 入力フィールドにSuggest機能をつけてみる (2)</title><content type='html'>週末に時間がとれましたので、&lt;a href="/2007/02/ajax-suggest-1.html"&gt;前回&lt;/a&gt; の Suggest機能を書き直してみました。 今回はわりと JavaScript っぽくなってきている、気がする。&lt;br /&gt;&lt;br /&gt;本サイト右上の検索バーには反映されています。 今のところ、見た目の違いは選択キーワードの背景がグレーになったぐらいですかね。&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;img src="http://rinco.jp/blog/cs/20070227_search2.gif" width="217" height="77" alt="Suggest付の検索ボックスの例" /&gt;&lt;/center&gt;&lt;br /&gt;まずは検索バーの html なんですが、よりシンプルになっています。&lt;br /&gt;&lt;br /&gt;&lt;pre class="yamachan-js"&gt;&amp;lt;form action="http://www.google.co.jp/search"&amp;gt;&lt;br /&gt;&amp;lt;input name="q" size="20" id="my-field" /&amp;gt;&lt;br /&gt;&amp;lt;input name="q" type="hidden"&lt;br /&gt; value=" site:http://yamachan-cs.blogspot.com/"/&amp;gt;&lt;br /&gt;&amp;lt;img src="search_glass.gif" alt="Search"&lt;br /&gt; width="48" height="24" align="bottom"&lt;br /&gt; onclick="document.getElementById('my-field')&lt;br /&gt;   .form.submit();"&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt; &lt;br /&gt;&amp;lt;div id="my-help"&lt;br /&gt; style="visibility:hidden;display:none;color:blue"&amp;gt;&lt;br /&gt;&amp;lt;/div&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;この部分にはJavaScriptが使用されていない、のが今回のポイントです。 普通の検索バーと違うのは、div要素 "my-help" がひそかに追加されていることぐらいですね。&lt;br /&gt;&lt;br /&gt;引き続きましては、Suggest機能を追加する JavaScript 部分です。 辞書の定義部分をのぞけば、記述は1行とシンプルになっていますね。 これで動作します。&lt;br /&gt;&lt;br /&gt;&lt;pre class="yamachan-js"&gt;&amp;lt;script&amp;gt;&lt;br /&gt;var dic = [&lt;br /&gt;  "Ajax",&lt;br /&gt;  "aptana",&lt;br /&gt;  ...途中省略&lt;br /&gt;  "unescapeHTML"&lt;br /&gt;];&lt;br /&gt; &lt;br /&gt;var ys=new jp.rinco.Suggest('my-field','my-help',dic);&lt;br /&gt;&amp;lt;/script&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;ただ、このままでは地味ですので、少し拡張してみましょう。 Suggestされたキーワードにマウスがくると、文字は赤色に、背景は灰色になるようにロジックを追加します。&lt;br /&gt;&lt;br /&gt;作成したSuggestオブジェクトの onmouseover, onmouseout 関数を、オーバーライドすればOKです。 記述する処理は、ごく普通ですね～ &lt;br /&gt;&lt;br /&gt;&lt;pre class="yamachan-js"&gt;&amp;lt;script&amp;gt;&lt;br /&gt;ys.onmouseover = function() {&lt;br /&gt;  this.style.color = 'red';&lt;br /&gt;  this.style.backgroundColor = '#ddd';&lt;br /&gt;}&lt;br /&gt;ys.onmouseout = function() {&lt;br /&gt;  this.style.color = 'blue';&lt;br /&gt;  this.style.backgroundColor = 'white';&lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;これで jp.rinco.Suggest オブジェクトの使い方の説明は終わりです。 前回からの改良点としては、利用方法・拡張方法がシンプルになったこと、そして1ページに複数利用することが可能になったことでしょうか。&lt;br /&gt;&lt;br /&gt;実際のコードを簡単にご紹介します。 まずはオブジェクトの生成の部分です。&lt;br /&gt;&lt;br /&gt;&lt;pre class="yamachan-js"&gt;jp.rinco.Suggest = function(t, h, d) {&lt;br /&gt; if (typeof(t) == 'string')&lt;br /&gt;   this.target = document.getElementById(t);&lt;br /&gt; else&lt;br /&gt;   this.target = t;&lt;br /&gt; if (typeof(h) == 'string')&lt;br /&gt;   this.help = document.getElementById(h);&lt;br /&gt; else&lt;br /&gt;   this.help = h;&lt;br /&gt; this.dic = d;&lt;br /&gt;&lt;br /&gt; this.target.aYamachanSuggest = this;&lt;br /&gt; this.target.onkeyup = function() {&lt;br /&gt;   this.aYamachanSuggest.updateHelp();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;対象のフィールドやヘルプ領域は、id で指定しても、オブジェクトを直接指定してもOKです。 対象フィールドのオブジェクトに &lt;strong&gt;aYamachanSuggest&lt;/strong&gt; なんて名前で、勝手に自分自身を登録しちゃってるのがトリッキーかもしれません。&lt;br /&gt;&lt;br /&gt;引き続き、Java でいうところのインスタンス・メソッドの定義部分をご紹介します。 実際には、上記の生成部分に含まれて記述しています。&lt;br /&gt;&lt;br /&gt;まずはSuggestキーワードをヘルプ領域に追加するための、&lt;strong&gt;keyElement()&lt;/strong&gt; 補助関数です。&lt;br /&gt;&lt;br /&gt;&lt;pre class="yamachan-js"&gt;this.keyElement = function(k) {&lt;br /&gt; var ke = document.createElement('div')&lt;br /&gt; ke.innerHTML = k;&lt;br /&gt; ke.aYamachanSuggest = this;&lt;br /&gt; ke.onclick = function(){&lt;br /&gt;   this.aYamachanSuggest.click(this);&lt;br /&gt; }&lt;br /&gt; if (ke.aYamachanSuggest.onmouseover)&lt;br /&gt;   ke.onmouseover = ke.aYamachanSuggest.onmouseover;&lt;br /&gt; if (ke.aYamachanSuggest.onmouseout)&lt;br /&gt;   ke.onmouseout = ke.aYamachanSuggest.onmouseout;&lt;br /&gt; return ke;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;で、実際にヘルプ領域を更新して表示/非表示する &lt;strong&gt;updateHelp()&lt;/strong&gt; 関数です。&lt;br /&gt;&lt;br /&gt;&lt;pre class="yamachan-js"&gt;this.updateHelp = function() {&lt;br /&gt; var k = jp.rinco.lastWord(this.target.value);&lt;br /&gt; if (k == "") {&lt;br /&gt;   this.help.style.visibility = 'hidden';&lt;br /&gt;   this.help.style.display = 'none';&lt;br /&gt;   return;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; var lk = k.toLowerCase();&lt;br /&gt; var counter = 0;&lt;br /&gt; this.help.innerHTML = "";&lt;br /&gt;&lt;br /&gt; for (loop = 0; loop &lt; this.dic.length; loop++) {&lt;br /&gt;   var dk = this.dic[loop];&lt;br /&gt;   if (dk.toLowerCase().indexOf(lk) == 0) {&lt;br /&gt;     this.help.appendChild(this.keyElement(dk));&lt;br /&gt;     counter++;&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; if (counter &gt; 0) {&lt;br /&gt;   this.help.style.visibility = 'visible';&lt;br /&gt;   this.help.style.display = 'block';&lt;br /&gt; } else {&lt;br /&gt;   this.help.style.visibility = 'hidden';&lt;br /&gt;   this.help.style.display = 'none';&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;最後は Java でいうクラス・メソッドのご紹介です。 ついに登場した prototype って感じですね。これは生成部分の外で記述されています。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;click()&lt;/strong&gt; は、Suggestキーワードがクリックされたときに呼び出される関数です。&lt;br /&gt;&lt;br /&gt;&lt;pre class="yamachan-js"&gt;jp.rinco.Suggest.prototype.click = function(ke) {&lt;br /&gt; var te = ke.aYamachanSuggest.target;&lt;br /&gt; var k = jp.rinco.lastWord(te.value);&lt;br /&gt; if (k == "") return;&lt;br /&gt;&lt;br /&gt; te.value=te.value.substring(0,te.value.length-k.length)&lt;br /&gt;    + ke.innerHTML;&lt;br /&gt; ke.aYamachanSuggest.updateHelp();&lt;br /&gt; te.focus();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;以上、まだ不安な部分は残しているものの、まぁ JavaScript で書いたプログラムだと言えるレベルになってきたのではないかと...。 そして僕も「趣味のJSプログラマーです」と言っても怒られないかも、というレベルに？&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37493881-7214538464942451472?l=yamachan-cs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yamachan-cs.blogspot.com/feeds/7214538464942451472/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=37493881&amp;postID=7214538464942451472&amp;isPopup=true' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37493881/posts/default/7214538464942451472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37493881/posts/default/7214538464942451472'/><link rel='alternate' type='text/html' href='http://yamachan-cs.blogspot.com/2007/02/ajax-suggest-2.html' title='[Ajax] 入力フィールドにSuggest機能をつけてみる (2)'/><author><name>yamachan</name><uri>http://www.blogger.com/profile/04446691959536738480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://yamachan.sakura.ne.jp/sblo_files/hannover/image/yamachan1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37493881.post-3991303249427370393</id><published>2007-02-26T23:00:00.000+09:00</published><updated>2007-02-27T23:49:18.044+09:00</updated><title type='text'>[JS] ネームスペース jp.rinco</title><content type='html'>JavaScriptにはJavaのようなネームスペース(名前空間)が無いので不便だな、とか考えていた自分は甘かったです。 先人たちは適切なグローバルオブジェクトを作成し、代用している様子。&lt;br /&gt;&lt;br /&gt;そこで僕もJava風に自分のドメインの逆順 &lt;strong&gt;jp.rinco&lt;/strong&gt; というオブジェクトを作成し、関数などを保持するようにしました。 jsファイルの先頭に、以下のような定義文を追加します。&lt;br /&gt;&lt;br /&gt;&lt;pre class="yamachan-js"&gt;if (typeof jp == "undefined") {&lt;br /&gt;  var jp = {};&lt;br /&gt;}&lt;br /&gt;if (typeof jp.rinco == "undefined") {&lt;br /&gt;  jp.rinco = {};&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;以前は以下のように関数を定義していました。&lt;br /&gt;&lt;br /&gt;&lt;pre class="yamachan-js"&gt;function yamachan_display(id) {&lt;br /&gt;  ...&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;今後は、以下のように関数を定義するようにします。&lt;br /&gt;&lt;br /&gt;&lt;pre class="yamachan-js"&gt;jp.rinco.display = function(id) {&lt;br /&gt;  ...&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;過去のコードや記事も順次、修正していきたいと考えています。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37493881-3991303249427370393?l=yamachan-cs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yamachan-cs.blogspot.com/feeds/3991303249427370393/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=37493881&amp;postID=3991303249427370393&amp;isPopup=true' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37493881/posts/default/3991303249427370393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37493881/posts/default/3991303249427370393'/><link rel='alternate' type='text/html' href='http://yamachan-cs.blogspot.com/2007/02/talk-js_26.html' title='[JS] ネームスペース jp.rinco'/><author><name>yamachan</name><uri>http://www.blogger.com/profile/04446691959536738480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://yamachan.sakura.ne.jp/sblo_files/hannover/image/yamachan1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37493881.post-4745296645589245631</id><published>2007-02-24T23:00:00.000+09:00</published><updated>2007-03-01T21:45:09.221+09:00</updated><title type='text'>[Ajax] 入力フィールドにSuggest機能をつけてみる (1)</title><content type='html'>少し前から、本blogの右上に&lt;strong&gt;検索ボックス&lt;/strong&gt;が表示されているのにお気づきでしょうか？ この検索ボックスですが、ちょっと仕掛がしてあります。&lt;br /&gt;&lt;br /&gt;キーワードを入れると、↓のように候補が下に表示されるようになっています。 キーワードをクリックすると、自動入力されます。 a,r,y とか入力してみてください。&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;img src="http://rinco.jp/blog/cs/20070224_search.gif" width="202" height="64" alt="Suggest付の検索ボックスの例" /&gt;&lt;/center&gt;&lt;br /&gt;IE などのブラウザにも似た機能がありますが、こちらはAjaxで実装されています。 初めて使用する時も有効なこと、表示されるキーワードはサイト管理者が設定したものであること、あたりがメリットでしょうか。&lt;br /&gt;&lt;br /&gt;正直、中身はあまりJavaScriptっぽくないコードで、書き直している最中なのですが、、、とりあえず動いているバージョンを、バックアップも兼ねて貼っておきます。&lt;br /&gt;&lt;br /&gt;2007/2/27 追記: &lt;a href="/2007/02/ajax-suggest-2.html"&gt;書き直した版&lt;/a&gt; を公開しました&lt;br /&gt;&lt;br /&gt;実際の検索ボックスですが、まずは以下のようなscriptが貼ってあります。&lt;br /&gt;&lt;br /&gt;&lt;pre class="yamachan-js"&gt;&amp;lt;script&amp;gt;&lt;br /&gt;function my_submit() {&lt;br /&gt; var k = y_suggest_target.value;&lt;br /&gt; location.href = 'http://www.google.co.jp/search?&lt;br /&gt;   q=site:http://yamachan-cs.blogspot.com/ ' +&lt;br /&gt;   encodeURIComponent(k);&lt;br /&gt;}&lt;br /&gt; &lt;br /&gt;function my_search_helpLine(key) {&lt;br /&gt; return "&amp;lt;span&lt;br /&gt;  onclick=\"yamachan_suggest_click('"+key+"');\"&lt;br /&gt;  onmouseover=\"this.style.color='red';\"&lt;br /&gt;  onmouseout=\"this.style.color='blue';\"&gt;"&lt;br /&gt;  + key + "&amp;lt;/span&gt;&amp;lt;br /&gt;";&lt;br /&gt;}&lt;br /&gt; &lt;br /&gt;var my_dic = [&lt;br /&gt;  "Ajax",&lt;br /&gt;  "aptana",&lt;br /&gt;  ...途中省略&lt;br /&gt;  "unescapeHTML"&lt;br /&gt;];&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;strong&gt;my_submit()&lt;/strong&gt; はSuggest機能とは関係なく、単に検索実行用の関数です。 Google をSite:オプションをつけてキーワード検索する単純なものです。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;my_search_helpLine()&lt;/strong&gt; は表示用の補助関数です。 必須ではありません。　Suggestされるキーワードの上にマウスがある場合、キーワードを赤色にするためのhtml出力を定義しています。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;my_dic&lt;/strong&gt; がSuggestされるキーワード文字列の配列になります。 これらの事前定義に続き、以下のhtmlが貼られています。&lt;br /&gt;&lt;br /&gt;&lt;pre class="yamachan-js"&gt;&amp;lt;form style="margin:0"&amp;gt;&lt;br /&gt;&amp;lt;input size="20" id="my-search-field"&lt;br /&gt;  onkeyup="yamachan_suggest(&lt;br /&gt;      'my-search-field','my-search-help',&lt;br /&gt;      my_dic, my_search_helpLine);"&lt;br /&gt;/&amp;gt;&lt;br /&gt;&amp;lt;img src="search.gif"&lt;br /&gt;  width="48" height="24" alt="Search"&lt;br /&gt;  onclick="my_submit();"&lt;br /&gt;/&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt; &lt;br /&gt;&amp;lt;div id="my-search-help"&lt;br /&gt; style="visibility:hidden;display:none;color:blue"&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;実際の入力欄に onkeyup が指定されていること、ヘルプ表示用のdivエリアが非表示で用意されていること、の二点がポイントでしょうか。&lt;br /&gt;&lt;br /&gt;さて利用されている関数ですが、メイン部分は以下のようになっています。 最初のvarがとても恥ずかしいデスネ。&lt;br /&gt;&lt;br /&gt;&lt;pre class="yamachan-js"&gt;var yamachan_suggest_target;&lt;br /&gt;var y_suggest_help;&lt;br /&gt;var y_suggest_dic;&lt;br /&gt;var y_suggest_func;&lt;br /&gt; &lt;br /&gt;function yamachan_suggest(f, h, dic, func) {&lt;br /&gt; y_suggest_target=document.getElementById(f);&lt;br /&gt; y_suggest_help=document.getElementById(h);&lt;br /&gt; y_suggest_dic = dic;&lt;br /&gt; y_suggest_func = func;&lt;br /&gt; var skey=yamachan_lastWord(y_suggest_target.value);&lt;br /&gt; y_suggest_help.innerHTML=y_suggest_helpHTML(skey); &lt;br /&gt; if (y_suggest_help.innerHTML == "") {&lt;br /&gt;   y_suggest_help.style.visibility = 'hidden';&lt;br /&gt;   y_suggest_help.style.display = 'none';&lt;br /&gt; } else {&lt;br /&gt;   y_suggest_help.style.visibility = 'visible';&lt;br /&gt;   y_suggest_help.style.display = 'block';  &lt;br /&gt; } &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;yamachan_lastWord() は以前に&lt;a href="http://yamachan-cs.blogspot.com/2007/02/js-word.html"&gt;ご紹介した&lt;/a&gt;もので、文字列の最後の1単語を得る関数です。 また以下の補助的な関数を使用します。&lt;br /&gt;&lt;br /&gt;&lt;pre class="yamachan-js"&gt;function yamachan_suggest_helpHTML(skey){&lt;br /&gt; if (skey == "") return "";&lt;br /&gt; var sk = skey.toLowerCase();&lt;br /&gt; var val = "";&lt;br /&gt; for(loop=0;loop&amp;lt;y_suggest_dic.length;loop++){&lt;br /&gt;  var k = y_suggest_dic[loop];&lt;br /&gt;  if (k.toLowerCase().indexOf(sk) == 0) {&lt;br /&gt;    if (y_suggest_func ==null||y_suggest_func=='')&lt;br /&gt;      val = val +&lt;br /&gt;        "&amp;lt;span onclick=\"yamachan_suggest_click('"&lt;br /&gt;        + k + "');\"&gt;" + k + "&amp;lt;/span&gt;&amp;lt;br /&gt;";&lt;br /&gt;    else&lt;br /&gt;      val = val + y_suggest_func(k);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; return val;&lt;br /&gt;}&lt;br /&gt; &lt;br /&gt;function yamachan_suggest_click(k) {&lt;br /&gt; var skey=yamachan_lastWord(y_suggest_target.value);&lt;br /&gt; if (skey != "") {&lt;br /&gt;  y_suggest_target.value =&lt;br /&gt;    y_suggest_target.value.substring(0,&lt;br /&gt;    y_suggest_target.value.length-skey.length) + k; &lt;br /&gt;  y_suggest_help.innerHTML =&lt;br /&gt;      yamachan_suggest_helpHTML(k);&lt;br /&gt;  y_suggest_target.focus();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;strong&gt;yamachan_suggest_helpHTML()&lt;/strong&gt; はキーワードリストのhtmlを作成する関数です。 &lt;strong&gt;yamachan_suggest_click()&lt;/strong&gt; はその生成されたhtmlに埋め込まれ、キーワードをクリックしたときに呼び出されます。&lt;br /&gt;&lt;br /&gt;今回はベタに検索ボックスに使用してみましたが、いろいろ活用方法はあるとおもいます。 例えば製品名を入力する欄で、代表的な製品をSuggestしてみるとか。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37493881-4745296645589245631?l=yamachan-cs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yamachan-cs.blogspot.com/feeds/4745296645589245631/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=37493881&amp;postID=4745296645589245631&amp;isPopup=true' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37493881/posts/default/4745296645589245631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37493881/posts/default/4745296645589245631'/><link rel='alternate' type='text/html' href='http://yamachan-cs.blogspot.com/2007/02/ajax-suggest-1.html' title='[Ajax] 入力フィールドにSuggest機能をつけてみる (1)'/><author><name>yamachan</name><uri>http://www.blogger.com/profile/04446691959536738480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://yamachan.sakura.ne.jp/sblo_files/hannover/image/yamachan1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37493881.post-2384119522015269427</id><published>2007-02-19T01:00:00.000+09:00</published><updated>2007-02-28T00:07:52.693+09:00</updated><title type='text'>[JS] 最後のwordを得る関数</title><content type='html'>もうひとつ、紹介し忘れていた関数がありました。 文字列を単語(word)単位で分割し、その最後のwordを返す関数です。&lt;br /&gt;&lt;br /&gt;&lt;pre class="yamachan-js"&gt;jp.rinco.lastWord = function(str) {&lt;br /&gt; if (str == "") return "";&lt;br /&gt; var s=str.replace(/(\s|\u3000)+/g,' ').split(' ');&lt;br /&gt; return s[s.length - 1];&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;replace() に指定している "/(\s|\u3000)+/g" という正規表現(RegExp)が少し複雑かもしれません。 split()の事前処理として、タブや改行や全角スペースも半角スペースに変換しています。&lt;br /&gt;&lt;br /&gt;正規表現について簡単に説明します。 もっとも単純な変換だと str.replace(/\s/, ' '); という感じになるでしょうか。&lt;br /&gt;&lt;br /&gt;ただ"\s" だけでは全角スペースに対応できない様子なので、全角スペースのUnicode表記 "\u3000" と組み合わせて "\s|\u3000" という表記にします。&lt;br /&gt;&lt;br /&gt;複数連続したスペースが含まれる場合があります。 そこでそれらをまとめ、1つの対象として処理するために、1回以上の繰り返し "+" を使用して "(\s|\u3000)+" という表記にします。&lt;br /&gt;&lt;br /&gt;最後に追加される "/g" はよく使いますね。 一致する対象を全て処理するオプション、グローバルマッチングです。&lt;br /&gt;&lt;br /&gt;文字列操作において、正規表現は非常に便利ですので、ぜひ活用してみてください。&lt;br /&gt;&lt;br /&gt;2007/2/27 追記: &lt;a href="/2007/02/talk-js_26.html"&gt;jp.rincoオブジェクト&lt;/a&gt; へ移動&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37493881-2384119522015269427?l=yamachan-cs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yamachan-cs.blogspot.com/feeds/2384119522015269427/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=37493881&amp;postID=2384119522015269427&amp;isPopup=true' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37493881/posts/default/2384119522015269427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37493881/posts/default/2384119522015269427'/><link rel='alternate' type='text/html' href='http://yamachan-cs.blogspot.com/2007/02/js-word.html' title='[JS] 最後のwordを得る関数'/><author><name>yamachan</name><uri>http://www.blogger.com/profile/04446691959536738480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://yamachan.sakura.ne.jp/sblo_files/hannover/image/yamachan1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37493881.post-4046577407380929097</id><published>2007-02-18T13:00:00.000+09:00</published><updated>2007-02-28T00:11:08.409+09:00</updated><title type='text'>[JS] タグを処理する関数</title><content type='html'>Ajaxっぽいサンプルをいろいろ作成していますが、もう少し時間がかかりそうです。 今回は、その過程で作成した関数をご紹介します。&lt;br /&gt;&lt;br /&gt;まずは単に &amp;amp; &amp;lt; &amp;gt; 文字を、&amp;amp;amp; &amp;amp;lt; &amp;amp;gt; に HTMLエスケープする &lt;strong&gt;escapeHTML()&lt;/strong&gt; 関数。 そして戻す &lt;strong&gt;unescapeHTML()&lt;/strong&gt; 関数です。&lt;br /&gt;&lt;br /&gt;&lt;pre class="yamachan-js"&gt;jp.rinco.escapeHTML = function(str) {&lt;br /&gt;  return str.replace(/&amp;amp;/g, "&amp;amp;amp;")&lt;br /&gt;      .replace(/&amp;lt;/g, "&amp;amp;lt;")&lt;br /&gt;      .replace(/&amp;gt;/g, "&amp;amp;gt;");&lt;br /&gt;}&lt;br /&gt;jp.rinco.unescapeHTML = function(str) {&lt;br /&gt;  return str.replace(/&amp;amp;gt;/g, "&amp;gt;")&lt;br /&gt;      .replace(/&amp;amp;lt;/g, "&amp;lt;")&lt;br /&gt;      .replace(/&amp;amp;amp;/g, "&amp;amp;");&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;そして文字列から指定したタグの中身を取り出す、&lt;strong&gt;tagText()&lt;/strong&gt; 関数です。&lt;br /&gt;&lt;br /&gt;例えば str に "&amp;lt;title&amp;gt;aaa&amp;lt;/title&amp;gt;"、tag_s に "&amp;lt;title&amp;gt;"、tag_e に "&amp;lt;/title&amp;gt;" を指定し、その間に指定されたタグの中身 "aaa" を取り出します。&lt;br /&gt;&lt;br /&gt;最後の引数は通常は false、str に指定した文字列が HTMLエスケープ されている場合に true を指定します。 例えば処理する文字列が "&amp;amp;lt;title&amp;amp;gt;aaa&amp;amp;lt;/title&amp;amp;gt;" のような場合に true にします。&lt;br /&gt;&lt;br /&gt;※ これはレアケースのようですが、Domino サイトが対象の場合には有効です&lt;br /&gt;&lt;br /&gt;&lt;pre class="yamachan-js"&gt;jp.rinco.tagText = function(str,tag_s,tag_e,cflag){&lt;br /&gt; if (tag_s == "" || tag_e == "")&lt;br /&gt;  return "";&lt;br /&gt;  &lt;br /&gt; var key_s=cflag?jp.rinco.escapeHTML(tag_s):tag_s;&lt;br /&gt; var key_e=cflag?jp.rinco.escapeHTML(tag_e):tag_e; &lt;br /&gt; var pos_s = str.indexOf(key_s);&lt;br /&gt; var pos_e = str.indexOf(key_e);&lt;br /&gt; if (pos_s &lt; 0 || pos_e &lt; 0)&lt;br /&gt;   return "";&lt;br /&gt; else&lt;br /&gt;  return str.substring(pos_s+key_s.length, pos_e);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;以上、ホントは &lt;strong&gt;String&lt;/strong&gt; に prototype で組み込むのが JavaScript っぽいのですが。 単に関数にしちゃってる、弱気な僕なのでありました。&lt;br /&gt;&lt;br /&gt;2007/2/27 追記: &lt;a href="/2007/02/talk-js_26.html"&gt;jp.rincoオブジェクト&lt;/a&gt; へ移動&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37493881-4046577407380929097?l=yamachan-cs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yamachan-cs.blogspot.com/feeds/4046577407380929097/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=37493881&amp;postID=4046577407380929097&amp;isPopup=true' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37493881/posts/default/4046577407380929097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37493881/posts/default/4046577407380929097'/><link rel='alternate' type='text/html' href='http://yamachan-cs.blogspot.com/2007/02/js_18.html' title='[JS] タグを処理する関数'/><author><name>yamachan</name><uri>http://www.blogger.com/profile/04446691959536738480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://yamachan.sakura.ne.jp/sblo_files/hannover/image/yamachan1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37493881.post-1968567786796047761</id><published>2007-02-17T22:00:00.000+09:00</published><updated>2007-02-28T08:54:30.548+09:00</updated><title type='text'>[TALK] JS関数の簡単な管理/デバッグ法</title><content type='html'>Java 等の開発では &lt;a href="http://www.junit.org/"&gt;JUnit&lt;/a&gt; のお世話になっている僕なので、JavaScript でも似たようなことをやっています。 参考になるか不明ですが、ご紹介してみましょう。&lt;br /&gt;&lt;br /&gt;まずは &lt;a href="http://www.aptana.com/"&gt;aptana&lt;/a&gt; で関数用に適当なhtmlファイルを作成し、以下のようにシンプルなテスト用の関数を定義しておきます。&lt;br /&gt;&lt;br /&gt;渡す引数はラベル、評価する値1、評価する値2 となります。 値が違った場合に限り、ラベルを使用してエラーメッセージを表示する仕組みです。&lt;br /&gt;&lt;br /&gt;&lt;pre class="yamachan-js"&gt;&amp;lt;script&amp;gt;&lt;br /&gt;function jsUnit(l, v1, v2) {&lt;br /&gt;  if (v1 != v2)&lt;br /&gt;    document.writeln(l+": "+v1+" != "+v2); &lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;このhtmlの中に、以下のように関数をいろいろ定義していきます。&lt;br /&gt;&lt;br /&gt;&lt;pre class="yamachan-js"&gt;&amp;lt;h2&amp;gt;jp.rinco.parseURL(url, name, value)&amp;lt;/h2&amp;gt;&lt;br /&gt;ここに関数の説明&lt;br /&gt;&amp;lt;script&amp;gt;&lt;br /&gt;jp.rinco.parseURL = function(url, name, value) {&lt;br /&gt;  ...実際の関数のロジック&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;jsUnit("1",jp.rinco.parseURL("","a","d"),"d");&lt;br /&gt;jsUnit("2",jp.rinco.parseURL("a=b","a","d"),"b");&lt;br /&gt;...&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;で、実際のテストは、このhtmlをプレビューしてみるだけです。 全部の関数がチェックされ、問題のある関数のセクションにはエラーメッセージが表示されるハズです。&lt;br /&gt;&lt;br /&gt;jsUnit はできるだけ多くのパターンを登録しておきます。 関数のロジックはhtmlに直接記載せず、実際の js ファイルを読み込むようにしても良いでしょう。&lt;br /&gt;&lt;br /&gt;ちょっとした工夫ですが、関数の管理が楽になり、かつクオリティを保つことができます。 コメントを書いておけば、そのままマニュアルがわりにもなります。 お手軽な開発には、わりとお勧めな方法です。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37493881-1968567786796047761?l=yamachan-cs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yamachan-cs.blogspot.com/feeds/1968567786796047761/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=37493881&amp;postID=1968567786796047761&amp;isPopup=true' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37493881/posts/default/1968567786796047761'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37493881/posts/default/1968567786796047761'/><link rel='alternate' type='text/html' href='http://yamachan-cs.blogspot.com/2007/02/talk-js.html' title='[TALK] JS関数の簡単な管理/デバッグ法'/><author><name>yamachan</name><uri>http://www.blogger.com/profile/04446691959536738480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://yamachan.sakura.ne.jp/sblo_files/hannover/image/yamachan1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37493881.post-7504028501240744953</id><published>2007-02-04T23:55:00.000+09:00</published><updated>2007-03-13T21:40:42.789+09:00</updated><title type='text'>[JS] クリックで表示/非表示する関数</title><content type='html'>&lt;a href="http://yamachan-game.blogspot.com/"&gt;yamachan GAMEメモ&lt;/a&gt; の投稿には、ネタバレを含むものがあります。 例えば &lt;a href="http://yamachan-game.blogspot.com/2007/01/msx-shooting.html"&gt;[MSX] Shooting: 魔城伝説&lt;/a&gt; の後半面＆エンディングの情報とか。&lt;br /&gt;&lt;br /&gt;ネタバレ部分を最初は隠しておいて、クリックすると表示/非表示を切り替える。 まぁ、JavaScript の初歩って感じですね。 実用になる最小のサンプルといいますか...。&lt;br /&gt;&lt;br /&gt;よく使うので、メモとして貼っておきます。&lt;br /&gt;&lt;br /&gt;&lt;pre class="yamachan-js"&gt;jp.rinco.display = function(id) {&lt;br /&gt;  var target = document.getElementById(id);&lt;br /&gt;  if (target.style.visibility == 'hidden') {&lt;br /&gt;    target.style.visibility = 'visible';&lt;br /&gt;    target.style.display = 'block';&lt;br /&gt;  } else {&lt;br /&gt;    target.style.visibility='hidden';&lt;br /&gt;    target.style.display = 'none';&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;以下が使用例です。 クリックしてみてください。&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color:black; color:white; padding:4px" onclick="jp.rinco.display('div_netabare1');"&gt;エンディングについて (ネタバレのためクリックで表示)&lt;/div&gt;&lt;div id="div_netabare1" style="visibility:hidden; display:none; border:solid 2px black; padding:4px"&gt;ここにネタバレの内容！&lt;br /&gt;ここにネタバレの内容！&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;以下のような html で実現しています。 複数使用するときには 'div_netabare1' を適当に変更してください。&lt;br /&gt;&lt;br /&gt;&lt;pre class="yamachan-js"&gt;&amp;lt;div&lt;br /&gt;  style="background-color:black;&lt;br /&gt;  color:white; padding:4px"&lt;br /&gt;  onclick="jp.rinco.display('div_netabare1');"&amp;gt;&lt;br /&gt;エンディングについて (ネタバレのためクリックで表示)&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div id="div_netabare1"&lt;br /&gt; style="visibility:hidden; display:none;&lt;br /&gt; border:solid 2px black; padding:4px"&amp;gt;&lt;br /&gt;ここにネタバレの内容！&amp;lt;br /&amp;gt;&lt;br /&gt;ここにネタバレの内容！&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;2007/2/27 追記: &lt;a href="/2007/02/talk-js_26.html"&gt;jp.rincoオブジェクト&lt;/a&gt; へ移動&lt;br /&gt;2007/3/13 追記:&lt;br /&gt;&lt;br /&gt;いろいろ多用していますので、ちょっと改良してみました&lt;br /&gt;&lt;br /&gt;まず、対象の指定に element だけでなく、id値も指定できるように拡張してみました。 必要もないのに getDocumentById() するのも面倒ですしね。&lt;br /&gt;&lt;br /&gt;また強制的に表示/非表示を指定できるようにしてみました。 第2引数に true を指定すると強制表示、false を指定すると強制非表示です。 むろん、指定しなければ従来どおりのトグル動作です。&lt;br /&gt;&lt;br /&gt;&lt;pre class="yamachan-js"&gt;jp.rinco.display = function(id, v) {&lt;br /&gt;  var target;&lt;br /&gt;  if (typeof(id) == 'string')&lt;br /&gt;    target = document.getElementById(id);&lt;br /&gt;  else &lt;br /&gt;    target = id;&lt;br /&gt; &lt;br /&gt;  var vflag;&lt;br /&gt;  if (v == undefined) {&lt;br /&gt;    if (target.style.visibility == 'hidden')&lt;br /&gt;       vflag = true;&lt;br /&gt;   else&lt;br /&gt;       vflag = false;   &lt;br /&gt;  } else&lt;br /&gt;   vflag = v;&lt;br /&gt; &lt;br /&gt;  if (vflag) {&lt;br /&gt;    target.style.visibility = 'visible';&lt;br /&gt;    target.style.display = 'block';&lt;br /&gt;  } else {&lt;br /&gt;    target.style.visibility='hidden';&lt;br /&gt;    target.style.display = 'none';&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37493881-7504028501240744953?l=yamachan-cs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yamachan-cs.blogspot.com/feeds/7504028501240744953/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=37493881&amp;postID=7504028501240744953&amp;isPopup=true' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37493881/posts/default/7504028501240744953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37493881/posts/default/7504028501240744953'/><link rel='alternate' type='text/html' href='http://yamachan-cs.blogspot.com/2007/02/js.html' title='[JS] クリックで表示/非表示する関数'/><author><name>yamachan</name><uri>http://www.blogger.com/profile/04446691959536738480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://yamachan.sakura.ne.jp/sblo_files/hannover/image/yamachan1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37493881.post-116986377149453387</id><published>2007-01-27T11:03:00.000+09:00</published><updated>2007-03-13T21:04:18.578+09:00</updated><title type='text'>[Ajax] Google MAPS を使用してみる</title><content type='html'>&lt;strong&gt;Ajax&lt;/strong&gt; や &lt;strong&gt;Web2.0&lt;/strong&gt; がここまで盛り上がったのは、&lt;a href="http://www.google.co.jp/maps"&gt;Googleマップ&lt;/a&gt; の存在が大きいのではないでしょうか。&lt;br /&gt;&lt;br /&gt;プラグイン無しで実現された、ドラッグでスクロールする地図の存在は衝撃的でした。 新しい技術のメリットを判りやすく実現した、理想的なキラーアプリだと考えています。 さらにAPIが公開され、自サイトに組み込める点はもう素晴らしすぎて涙が出そうです。&lt;br /&gt;&lt;br /&gt;というわけで、↓利用してみました。&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://rinco.jp/blog/yamachan_gmap.html?zoom=15&amp;ll=35.711308,139.775582&amp;w=400&amp;h=300" width="400" height="300" scrolling="NO" frameborder="0" marginwidth="0" marginheight="0"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;Googleマップを利用する場合、ページに直接埋め込む方法と、別に用意したhtmlファイルをiframeで組み込む方法があります。&lt;br /&gt;&lt;br /&gt;ページに直接埋め込む方法だと、利用する場所に全てのコードがあるので準備が簡単です。 ただ文字コードの問題が発生することがあるとか。 具体的には、そのページが UTF-8 で保存されているのが望ましいみたい。&lt;br /&gt;&lt;br /&gt;またサイトごとに &lt;a href="http://www.google.com/apis/maps/"&gt;Google MAPS APIサイト&lt;/a&gt; から、APIキーを取得する必要があります。 Bloggerだと各blogのサイトは異なるので、それぞれに APIキーを取得して管理する必要がありそう。 僕のようにblog間の記事移動が多い(下書きblogから移動したりとか)場合は、これはちょっと面倒です。&lt;br /&gt;&lt;br /&gt;そこで自身のドメイン &lt;a href="http://rinco.jp/"&gt;rinco.jp&lt;/a&gt; でAPIキーを作成し、ここにマップ用のhtmlファイルを置くことにしました。 以下のようにiframeでページに組み込みます。&lt;br /&gt;&lt;br /&gt;&lt;pre class="yamachan-js"&gt;&amp;lt;iframe&lt;br /&gt; src="http://rinco.jp/blog/yamachan_gmap.html&lt;br /&gt;  ?zoom=15&amp;ll=35.711308,139.775582&amp;w=400&amp;h=300"&lt;br /&gt; width="400" height="300"&lt;br /&gt; scrolling="NO" frameborder="0"&lt;br /&gt; marginwidth="0" marginheight="0"&lt;br /&gt;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;マップ用のhtmlは個別に用意するのも面倒です。 そこで Google MAPS サイトにあるサンプルをベースに、URLパラメータを参照するようにload()関数を拡張してみました。 使用している jp.rinco.url.parse() 関数は &lt;a href="/2007/01/js-url.html"&gt;コチラ&lt;/a&gt; を参照。&lt;br /&gt;&lt;br /&gt;&lt;pre class="yamachan-js"&gt;function load() {&lt;br /&gt;if (GBrowserIsCompatible()) {&lt;br /&gt;  var mArea = document.getElementById('maparea');&lt;br /&gt;  mArea.style.width=jp.rinco.url.parse("w","400px");&lt;br /&gt;  mArea.style.height=jp.rinco.url.parse("h","300px");&lt;br /&gt;  var zoom=jp.rinco.url.parse("zoom", "16");&lt;br /&gt; &lt;br /&gt;  var ll = jp.rinco.url.parse("ll", "35.68,139.76");&lt;br /&gt;  ll = ll.split(',');&lt;br /&gt;  var point = new GLatLng(ll[0],ll[1]);&lt;br /&gt; &lt;br /&gt;  var map = new GMap2(mArea);&lt;br /&gt;  map.addControl(new GSmallMapControl());&lt;br /&gt;  map.setCenter(point, +zoom);&lt;br /&gt; &lt;br /&gt;  var marker = new GMarker(point);&lt;br /&gt;  map.addOverlay(marker);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;ただこのマップ用のhtmlファイル、利用制限をかけていないので、現時点ではどんなサイトからでも利用できてしまいます。 上記コードを利用するのは無論かまいませんが、マップ用htmlを直接利用するのは避けてくださいね。 APIキーをきちんと取得し、自分のサイトにマップ用htmlを設置してください。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37493881-116986377149453387?l=yamachan-cs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yamachan-cs.blogspot.com/feeds/116986377149453387/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=37493881&amp;postID=116986377149453387&amp;isPopup=true' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37493881/posts/default/116986377149453387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37493881/posts/default/116986377149453387'/><link rel='alternate' type='text/html' href='http://yamachan-cs.blogspot.com/2007/01/ajax-google-maps.html' title='[Ajax] Google MAPS を使用してみる'/><author><name>yamachan</name><uri>http://www.blogger.com/profile/04446691959536738480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://yamachan.sakura.ne.jp/sblo_files/hannover/image/yamachan1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37493881.post-116956426948458848</id><published>2007-01-22T23:55:00.000+09:00</published><updated>2007-03-15T16:14:24.186+09:00</updated><title type='text'>[JS] URLパラメータを得る関数</title><content type='html'>久しぶりに JavaScript を書いていて、URL パラメーターの値を入手する関数が必要になりました。 例えば、&lt;div style="text-align: center; font-size: small; padding: 10px; color: green"&gt;http://yamachan-memo.blogspot.com/index.html?foo=12&amp;bar=13&lt;/div&gt;というURLだと、fooで12、barで13という値を得る方法。 &lt;a href="http://hannover.sblo.jp/"&gt;Domino&lt;/a&gt; だと @UrlQueryString("foo") とかで一発なんだけど。&lt;br /&gt;&lt;br /&gt;どっかにありそうと思って探したんだけど、うまく見つからなかった。 ざっと書いたものだけど、メモとして貼っておきます。&lt;div style="text-align: center; font-size: small; padding: 10px; color: green"&gt;var foo = jp.rinco.parseURL(location.search, "foo", "haha");&lt;br /&gt;var bar = jp.rinco.parseURL(location.search, "bar", "hehe");&lt;/div&gt;とか使います。&lt;br /&gt;&lt;br /&gt;ちなみに最後の引数は、該当するパラメータが見つからない場合のデフォルト値です。 必要がない場合には "" を指定してください。&lt;br /&gt;&lt;br /&gt;&lt;pre class="yamachan-js"&gt;jp.rinco.parseURL = function(url, name, value){&lt;br /&gt;  var pos_s = url.indexOf(name + "=");&lt;br /&gt;  if(pos_s &amp;lt; 0)&lt;br /&gt;    return  value; &lt;br /&gt;  var url = url.substring(pos_s+name.length+1);&lt;br /&gt;  var pos_e = url.indexOf('&amp;'); &lt;br /&gt;  if (pos_e &amp;lt; 0)&lt;br /&gt;    return decodeURIComponent(url);&lt;br /&gt;  return decodeURIComponent(&lt;br /&gt;                  url.substring(0, pos_e));&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;2007/1/29 追記: 戻り値を decodeURIComponent() するように修正&lt;br /&gt;2007/2/27 追記: &lt;a href="/2007/02/talk-js_26.html"&gt;jp.rincoオブジェクト&lt;/a&gt; へ移動&lt;br /&gt;2007/3/13 追記:&lt;br /&gt;&lt;br /&gt;jp.rinco.url 内に移動＆バグ修正&lt;br /&gt;&lt;br /&gt;以下は jp.rinco.url 内に移動したロジックです。 jp.rinco.url は単なるインスタンスで、その実装は jp.rinco.urlTool となっています。 parse() 関数部分のみ貼っておきます。&lt;br /&gt;&lt;br /&gt;&lt;pre class="yamachan-js"&gt;this.parse = function(v1, v2, v3) {&lt;br /&gt; var u; var n; var d;  &lt;br /&gt; if (v2 == undefined) {&lt;br /&gt;   u = this.param; n = v1; d = "";&lt;br /&gt; } else if (v3 == undefined) {&lt;br /&gt;   u = this.param; n = v1; d = v2;&lt;br /&gt; } else {&lt;br /&gt;   u = v1; n = v2; d = v3;   &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; var pos = u.indexOf("?" + n + "=");&lt;br /&gt; if(pos &lt; 0)  &lt;br /&gt;   pos = u.indexOf("&amp;" + n + "=");&lt;br /&gt; if(pos &lt; 0)&lt;br /&gt;   return  d;&lt;br /&gt; &lt;br /&gt; var r = u.substring(pos + n.length + 2);&lt;br /&gt; pos = r.indexOf('&amp;'); &lt;br /&gt; if (pos &lt; 0)&lt;br /&gt;   return decodeURIComponent(r);&lt;br /&gt; return decodeURIComponent(r.substring(0, pos)); &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;引数が3つの場合は従来の parseURL と同じ動作をします。 最初の url 引数は省略でき、その場合は現在の URL に対する動作になります。 最後のデフォルト値も省略できます。&lt;div style="text-align: center; font-size: small; padding: 10px; color: green"&gt;var foo = jp.rinco.url.parse("foo.htm&amp;a=1","foo", "haha");&lt;br /&gt;var bar = jp.rinco.url.parse("bar", "hehe");&lt;br /&gt;var puu = jp.rinco.url.parse("puu");&lt;/div&gt;とか使います。&lt;br /&gt;&lt;br /&gt;また "a=1" が "aa=1" にマッチしてしまう不具合がありましたので、修正してあります。&lt;br /&gt;&lt;br /&gt;なお jp.rinco.url には現在のファイル名(例: このページだと"js-url.html")を得る file 属性など、url 処理に関する便利な機能を実装しています。 気が向いたら参考にしてみてください。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37493881-116956426948458848?l=yamachan-cs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yamachan-cs.blogspot.com/feeds/116956426948458848/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=37493881&amp;postID=116956426948458848&amp;isPopup=true' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37493881/posts/default/116956426948458848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37493881/posts/default/116956426948458848'/><link rel='alternate' type='text/html' href='http://yamachan-cs.blogspot.com/2007/01/js-url.html' title='[JS] URLパラメータを得る関数'/><author><name>yamachan</name><uri>http://www.blogger.com/profile/04446691959536738480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://yamachan.sakura.ne.jp/sblo_files/hannover/image/yamachan1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37493881.post-116938148749685966</id><published>2007-01-21T21:07:00.000+09:00</published><updated>2007-01-21T22:50:46.123+09:00</updated><title type='text'>[TALK] Ajax も対象にしてみました</title><content type='html'>えー、あいかわらず浮気者の僕でして。 Ajax も blog の対象に加えてみました。&lt;br /&gt;&lt;br /&gt;数年前に使ってたときは DHTML って呼んでたと記憶してるんですが、とにかく Netscape 4.x と IE 4.x あたりで正常に動作するよう、非常に苦労した覚えがあります。 でも最近は JavaScript も DOM も非常に整理されている様子。&lt;br /&gt;&lt;br /&gt;で、具体的なきっかけがありまして。 &lt;a href="http://www.imgsrc.co.jp/~kuriyama/prototype/prototype.js.html"&gt;prototype.js の開発者向けメモ&lt;/a&gt; 読んで感動したこと。 JavaScript って変な言語だなとは思ってましたが、js ファイル1つでここまで変わるとは...。 一気に好きになっちゃいました。&lt;br /&gt;&lt;br /&gt;あと試しに使ってみた Eclipse RCP ベースの開発環境 &lt;a href="http://www.aptana.com/"&gt;Aptana&lt;/a&gt; が便利だったこと。 いろいろ試して、数年間のギャップを埋めていきたいと考えています。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37493881-116938148749685966?l=yamachan-cs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yamachan-cs.blogspot.com/feeds/116938148749685966/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=37493881&amp;postID=116938148749685966&amp;isPopup=true' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37493881/posts/default/116938148749685966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37493881/posts/default/116938148749685966'/><link rel='alternate' type='text/html' href='http://yamachan-cs.blogspot.com/2007/01/talk-ajax.html' title='[TALK] Ajax も対象にしてみました'/><author><name>yamachan</name><uri>http://www.blogger.com/profile/04446691959536738480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://yamachan.sakura.ne.jp/sblo_files/hannover/image/yamachan1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37493881.post-116662012702572169</id><published>2006-12-20T21:54:00.000+09:00</published><updated>2007-01-21T20:12:15.783+09:00</updated><title type='text'>[NEWS] XNA Game Studio Express</title><content type='html'>&lt;a href="http://www.watch.impress.co.jp/game/docs/20061213/xna.htm"&gt;マイクロソフト、WindowsとXbox 360で同一のゲーム開発環境を可能にする「XNA Game Studio Express」最終版を提供開始&lt;/a&gt; だそうですね。 同サイトの &lt;a href="http://www.watch.impress.co.jp/game/docs/20061219/3dxna.htm"&gt;西川善司さんの記事&lt;/a&gt; を読むとわくわくしますねぇ。&lt;br /&gt;&lt;br /&gt;僕の愛用マシン(使用5年目！)ではスペック不足だし、XBOX360買わなきゃいけないし、実行するためだけにライセンス料が必要なのはまだ敷居が高いけれど。しかし確かに画期的な出来事ではあります。&lt;br /&gt;&lt;br /&gt;10年以上前から、僕が作りたいゲームがあります。恥ずかしいからまだ概要は書かないけど、今回の発表で、使用言語は C# に絞られたカンジ。 この年末、精進しなくては！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37493881-116662012702572169?l=yamachan-cs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yamachan-cs.blogspot.com/feeds/116662012702572169/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=37493881&amp;postID=116662012702572169&amp;isPopup=true' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37493881/posts/default/116662012702572169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37493881/posts/default/116662012702572169'/><link rel='alternate' type='text/html' href='http://yamachan-cs.blogspot.com/2006/12/news-xna-game-studio-express.html' title='[NEWS] XNA Game Studio Express'/><author><name>yamachan</name><uri>http://www.blogger.com/profile/04446691959536738480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://yamachan.sakura.ne.jp/sblo_files/hannover/image/yamachan1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37493881.post-116322225084476174</id><published>2006-11-11T14:08:00.000+09:00</published><updated>2007-01-21T20:11:46.063+09:00</updated><title type='text'>[TALK] blog 追加してみました</title><content type='html'>&lt;a href="http://www.blogger.com/"&gt;Blogger&lt;/a&gt; って、投稿をカテゴリ分けする仕組みが無いみたいですね。 目的別の blog を複数立ち上げてくれ、というスタンスのようです。&lt;br /&gt;&lt;br /&gt;僕は Java/Lotus Notes あたりがメインなんですが、最近は趣味として、.NET Framework と C# を少しずつ勉強しています。&lt;br /&gt;&lt;br /&gt;「標準C#入門」という本で文法等を学び、「Visual C# .NET 逆引き大全 500」という本で利用パターンを学び、「C# ゲームプログラミング」という本で簡単な利用イメージが浮かんできた、とまぁ、入り口付近でのんびりやっている状況です。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/japan/msdn/vstudio/express/vcsharp/"&gt;Visual C# 2005 Express Edition 日本語版&lt;/a&gt; を導入してみました。 あと、Java 経験者としては、&lt;a href="http://www.atmarkit.co.jp/fdotnet/special/java2cs/java2cs_01.html"&gt;私がJavaからC#に乗り換えた10の理由&lt;/a&gt; という記事が参考になりました。&lt;br /&gt;&lt;br /&gt;で、途中経過を忘れないよう、学習結果を記録する blog を作成してみました。 あと、モチベーション維持のため？&lt;br /&gt;&lt;br /&gt;ただ Blogger って blog を消すのも簡単なシステムなので、あまり自分への縛りにはならない気もするんですけどね。 (^-^;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37493881-116322225084476174?l=yamachan-cs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yamachan-cs.blogspot.com/feeds/116322225084476174/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=37493881&amp;postID=116322225084476174&amp;isPopup=true' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37493881/posts/default/116322225084476174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37493881/posts/default/116322225084476174'/><link rel='alternate' type='text/html' href='http://yamachan-cs.blogspot.com/2006/11/talk-blog.html' title='[TALK] blog 追加してみました'/><author><name>yamachan</name><uri>http://www.blogger.com/profile/04446691959536738480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://yamachan.sakura.ne.jp/sblo_files/hannover/image/yamachan1.jpg'/></author><thr:total>0</thr:total></entry></feed>
