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

<channel>
	<title>BPS株式会社 開発ブログ Beyond Perspective Solutions LTD. &#187; javascript</title>
	<atom:link href="http://www.bpsinc.jp/blog/archives/category/programming-language/javascript/feed" rel="self" type="application/rss+xml" />
	<link>http://www.bpsinc.jp/blog</link>
	<description>BPS株式会社（Beyond Perspective Solutions）のプログラマによる技術・開発などに関してのブログです</description>
	<lastBuildDate>Thu, 02 Sep 2010 08:49:08 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>JQuery UI Tabsでタブ表示</title>
		<link>http://www.bpsinc.jp/blog/archives/2289</link>
		<comments>http://www.bpsinc.jp/blog/archives/2289#comments</comments>
		<pubDate>Fri, 27 Aug 2010 09:34:48 +0000</pubDate>
		<dc:creator>shibachan</dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Tabs]]></category>
		<category><![CDATA[UI]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=2289</guid>
		<description><![CDATA[こんにちわ芝原です。
始めてのJavascript関連の投稿です。
お手柔らかにどうぞ。
たくさんのコンテンツをすっきり表示させるための方法として、タブという手法がよくつかわれると思います。
今回は、この便利なタブ表示を [...]]]></description>
			<content:encoded><![CDATA[<p>こんにちわ芝原です。</p>
<p>始めてのJavascript関連の投稿です。<br />
お手柔らかにどうぞ。</p>
<p>たくさんのコンテンツをすっきり表示させるための方法として、タブという手法がよくつかわれると思います。<br />
今回は、この便利なタブ表示をJQueryを使って実現する方法を解説します。<br />
動作はこんな感じになります。<br />
<a href="http://jqueryui.com/demos/tabs/default.html">http://jqueryui.com/demos/tabs/default.html</a></p>
<h3>必要なファイルのダウンロード</h3>
<p>jquery本体とui.core.js、ui.tabs.jsが必要です。</p>
<p><a href="http://jqueryui.com/download/jquery-ui-1.8.4.custom.zip">こちら</a>から簡単にダウンロードできますが余計なファイルも多分に入っているので、<a href="http://jqueryui.com/download">こちら</a>からファイルを選択してダウンロードしてもいいと思います。</p>
<h3>スクリプトの読み込み</h3>
<p>必要なファイルを読み込みます。<br />
head内に記述するのが一般的です。</p>
<pre class="brush:html">&#60;script type="text/javascript" src="/path/to/jquery.js"&#62;&#60;/script&#62;
&#60;script type="text/javascript" src="/path/to/ui.core.js"&#62;&#60;/script&#62;
&#60;script type="text/javascript" src="/path/to/ui.tabs.js"&#62;&#60;/script&#62;</pre>
<h3>HTMLの構造</h3>
<pre class="brush:html">&#60;div id="tabs"&#62;
    &#60;ul&#62;
        &#60;li&#62;&#60;a href="#tab1"&#62;タブに表示する文字&#60;/a&#62;&#60;/li&#62;
        &#60;li&#62;&#60;a href="#tab1"&#62;タブに表示する文字&#60;/a&#62;&#60;/li&#62;
        &#60;li&#62;&#60;a href="#tab3"&#62;タブに表示する文字&#60;/a&#62;&#60;/li&#62;
    &#60;/ul&#62;
    &#60;div id="tab1"&#62;
        タブの中身
    &#60;/div&#62;
    &#60;div id="tab2"&#62;
        タブの中身
    &#60;/div&#62;
    &#60;div id="tab3"&#62;
        タブの中身
    &#60;/div&#62;
&#60;/div&#62;</pre>
<h3>タブの設定</h3>
<pre class="brush:html">&#60;script type="text/javascript"&#62;
    var $tabs = $('#tabs').tabs();
    $tabs.tabs('select' 1); // 2番目のタブを選択状態にする
                            // デフォルトでは1番目のタブ
&#60;/script&#62;</pre>
<p>たったこれだけでタブが実装できました。</p>
<p>さらに詳しい情報を知りたい方は、<a href="http://jqueryui.com/demos/tabs/">公式ドキュメント</a>をご覧ください。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/2289/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IEでJavaScriptからButtonのtypeを変更できない</title>
		<link>http://www.bpsinc.jp/blog/archives/2147</link>
		<comments>http://www.bpsinc.jp/blog/archives/2147#comments</comments>
		<pubDate>Tue, 20 Jul 2010 10:47:07 +0000</pubDate>
		<dc:creator>baba</dc:creator>
				<category><![CDATA[Windows]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[馬場]]></category>
		<category><![CDATA[IE]]></category>
		<category><![CDATA[jQuery.HTML]]></category>
		<category><![CDATA[バグ]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=2147</guid>
		<description><![CDATA[JavaScriptで動的にエレメントを作成するときは、

var div = document.createElement('div');

のようにやります。
たとえば、ボタンを作ってそのボタンにクリックイベントを追 [...]]]></description>
			<content:encoded><![CDATA[<p>JavaScriptで動的にエレメントを作成するときは、</p>
<pre class="brush:javascript">
var div = document.createElement('div');
</pre>
<p>のようにやります。</p>
<p>たとえば、ボタンを作ってそのボタンにクリックイベントを追加、などの良くある処理は、jQueryを使って、</p>
<pre class="brush:javascript">
var button = $(document.createElement('button'))
.attr('type', 'button').text('ぼたん');
button.click(function() {
    alert('hello');
});
$('#hoge').next(button);
</pre>
<p>のようにやると思います。typeを設定しているのは、デフォルトだとsubmit扱いになってしまうからです。</p>
<p>しかしこれ、IEだとエラーになります。</p>
<blockquote><p>
type property can&#8217;t be changed
</p></blockquote>
<p>buttonのtypeはなぜか読み取り専用プロパティらしい・・・</p>
<p>ということで、ちょっとダサイですが、以下のようにやって解決。</p>
<pre class="brush:javascript">
var button = $('&#60;button type="button"&#62;ぼたん&#60;/button&#62;');
</pre>
<p>以上、ちょっとした注意点でした。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/2147/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>nyroModalの使い方</title>
		<link>http://www.bpsinc.jp/blog/archives/1870</link>
		<comments>http://www.bpsinc.jp/blog/archives/1870#comments</comments>
		<pubDate>Mon, 21 Jun 2010 00:50:59 +0000</pubDate>
		<dc:creator>baba</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[馬場]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Lightbox]]></category>
		<category><![CDATA[画像]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=1870</guid>
		<description><![CDATA[JavaScriptを使ったライトボックスはたくさんありますが、単に表示させるだけでなく、開いたボックス内で簡単な操作をしたいこともありますよね。
そんなときは、jQueryプラグインのnyroModalが高機能で便利で [...]]]></description>
			<content:encoded><![CDATA[<p>JavaScriptを使ったライトボックスはたくさんありますが、単に表示させるだけでなく、開いたボックス内で簡単な操作をしたいこともありますよね。</p>
<p>そんなときは、jQueryプラグインのnyroModalが高機能で便利です。</p>
<p><a href="http://nyromodal.nyrodev.com/">http://nyromodal.nyrodev.com/</a></p>
<p>使い方は簡単。ダウンロードしたJSとCSSを適切に読み込んだら、以下のように書くだけです。</p>
<pre class="brush:html">
&#60;a href="hoge1.html" class="nyroModal" rel="gal"&#62;&#60;img src="hoge1.jpg" /&#62;&#60;/a&#62;
&#60;a href="hoge2.html" class="nyroModal" rel="gal"&#62;&#60;img src="hoge2.jpg" /&#62;&#60;/a&#62;
&#60;a href="hoge3.html" class="nyroModal" rel="gal"&#62;&#60;img src="hoge3.jpg" /&#62;&#60;/a&#62;
</pre>
<p>JSを書く必要はありません。class指定のみで大丈夫です。</p>
<p>このうち、rel=&#8221;gal&#8221; の指定が、グループ化してギャラリーにする（前へ・次へボタンを有効にする）設定です。</p>
<p>galという文字列は何でも良く、もし複数ギャラリーを作りたいときは、グループ名を入れればOKです。</p>
<p>たとえば、以下のようにすれば、hogeギャラリーとpiyoギャラリーができて、それぞれ3枚ずつ画像がある状態に出来ます。</p>
<pre class="brush:html">
&#60;a href="hoge1.html" class="nyroModal" rel="hoge"&#62;&#60;img src="hoge1.jpg" /&#62;&#60;/a&#62;
&#60;a href="hoge2.html" class="nyroModal" rel="hoge"&#62;&#60;img src="hoge2.jpg" /&#62;&#60;/a&#62;
&#60;a href="hoge3.html" class="nyroModal" rel="hoge"&#62;&#60;img src="hoge3.jpg" /&#62;&#60;/a&#62;

&#60;a href="piyo1.html" class="nyroModal" rel="piyo"&#62;&#60;img src="piyo1.jpg" /&#62;&#60;/a&#62;
&#60;a href="piyo2.html" class="nyroModal" rel="piyo"&#62;&#60;img src="piyo2.jpg" /&#62;&#60;/a&#62;
&#60;a href="piyo3.html" class="nyroModal" rel="piyo"&#62;&#60;img src="piyo3.jpg" /&#62;&#60;/a&#62;
</pre>
<p>なお、nyroModalは、リンク先の拡張子を見て、動作を変更しています。<br />
.jpgなどの拡張子では、自動的にサイズを調べて、適切なリサイズを行ってくれます。</p>
<p>プログラムから動的に画像を出力する際など、以下のようなURLでは、誤作動を起こすので気をつけて下さい。<br />
http://bpsinc.jp/image/test.jpg?width=50</p>
<p>この場合、以下のようにすれば解決できます。<br />
http://bpsinc.jp/image/test.jpg?width=50&#038;ext=.jpg</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/1870/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery.formとJSONView</title>
		<link>http://www.bpsinc.jp/blog/archives/1758</link>
		<comments>http://www.bpsinc.jp/blog/archives/1758#comments</comments>
		<pubDate>Thu, 17 Jun 2010 00:43:14 +0000</pubDate>
		<dc:creator>baba</dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[馬場]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[バグ]]></category>
		<category><![CDATA[相性]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=1758</guid>
		<description><![CDATA[JSONViewは、Firefoxで application/json なコンテンツを綺麗に表示するプラグインです。
とても便利ですね。
ところが、jQuery.formプラグインなどと組み合わせると、不具合を起こすこと [...]]]></description>
			<content:encoded><![CDATA[<p><a href="https://addons.mozilla.org/ja/firefox/addon/10869/">JSONView</a>は、Firefoxで application/json なコンテンツを綺麗に表示するプラグインです。<br />
とても便利ですね。</p>
<p>ところが、jQuery.formプラグインなどと組み合わせると、不具合を起こすことがあるので注意が必要です。</p>
<p>一般的なajaxでは、</p>
<pre class="brush:javascript">
$.ajax({
  url: 'hogehgoe',
  success: function(data, dataType) {
  }
});
</pre>
<p>といったやりかたをしますが、このときは特に問題ありません。</p>
<p>しかし、jQuery.formで $(&#8217;form&#8217;).ajaxSubmit() を使う場合、内部的には$.ajaxは使用されていません。<br />
XMLHttpRequestでは画像データ等のmultipart/form-dataを送信できないため、ダミーのiframeを作って、そこをターゲットにformの送信を実行しています。</p>
<pre class="brush:javascript">
//jquery.form.jsの内部コードのイメージ
var iframe = '&#60;iframe id="hoge" onload="irame-onload"&#62;&#60;/iframe&#62;';
$('form').attr('target', 'hoge');
$('form').submit();
</pre>
<p>これで、ajaxSubmitをすると、結果がiframeに入ります。<br />
iframeのonloadイベントで、内部のinnerHTMLを見て、結果を呼び出し元に返す処理を行っています。</p>
<p>ここで、iframeの中身がどんな値になるかは、ブラウザの実装依存です。<br />
一般に、プレインテキストやJSON形式が渡ってきたとしても、DOMツリーを構築するためにbodyタグまでは作ってしまうようです。</p>
<p>良くあるパターン</p>
<pre class="brush:html">
&#60;html&#62;
&#60;head&#62;&#60;/head&#62;
&#60;body&#62;{"result":"これが結果です"}&#60;/body&#62;
&#60;/html&#62;
</pre>
<p>jquery.formプラグインは、ブラウザがbodyタグの中に直接値を入れるか、またはpreやtextareaに値を入れることを期待しています。</p>
<p>しかし、JSONViewを使うと、以下のような綺麗なHTMLを勝手に作ってくれてしまいます。</p>
<pre class="brush:html">
&#60;html&#62;
&#60;head&#62;&#60;/head&#62;
&#60;body&#62;
&#60;doctype html=""&#62;
  &#60;div id="json"&#62;
    {
    &#60;ul class="obj collapsible"&#62;
      &#60;li&#62;&#60;span class="prop"&#62;result&#60;/span&#62;: &#60;span class="num"&#62;0&#60;/span&#62;&#60;/li&#62;
    &#60;/ul&#62;
    }
  &#60;/div&#62;
&#60;/doctype&#62;
&#60;/body&#62;
</pre>
<p>人間様が見るには良いですが、これではjquery.formプラグインが認識できません。<br />
そんなわけで、doctype html&#8230; といった値を丸ごとJSONパースしようとして、エラーになってしまいます。</p>
<p>解決策は、Content-Typeを変えるか、jquery.formを改造するくらいしかありません。</p>
<p>Content-Typeの変更が、一番みんなハッピーになれるはずです。</p>
<p>これに気づかず、JSONViewを入れると動かなくなるWebサイトがあるかもしれませんね。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/1758/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHP hiddenでclassを設定できない</title>
		<link>http://www.bpsinc.jp/blog/archives/1751</link>
		<comments>http://www.bpsinc.jp/blog/archives/1751#comments</comments>
		<pubDate>Tue, 15 Jun 2010 00:40:00 +0000</pubDate>
		<dc:creator>baba</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[馬場]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=1751</guid>
		<description><![CDATA[Formヘルパーを使う際、inputタグなどなら、

$form-&#62;input('User.name', array('class' =&#62; 'test'));

のようにclassを指定できますが、
hi [...]]]></description>
			<content:encoded><![CDATA[<p>Formヘルパーを使う際、inputタグなどなら、</p>
<pre class="brush:php">
$form-&#62;input('User.name', array('class' =&#62; 'test'));
</pre>
<p>のようにclassを指定できますが、</p>
<p>hiddenタグの場合、class指定は無視されます。</p>
<pre class="brush:php">
$form-&#62;input('User.id', array('type' =&#62; 'hidden', 'class' =&#62; 'test'));
</pre>
<p>これは、formヘルパーが以下のように意図的に無視している為で、<strong>仕様</strong>のようです。</p>
<pre class="brush:php">
function hidden($fieldName, $options = array()) {
        //（略）
	return sprintf(
		$this-&#62;Html-&#62;tags&#91;'hidden'&#93;,
		$options&#91;'name'&#93;,
		$this-&#62;_parseAttributes($options, array('name', 'class'), '', ' ')
	);
}
</pre>
<p>JavaScriptから制御する際など、hiddenにもclassを付けたいことは多々ありますが、考慮されていないようですね。</p>
<p>直接タイプしても面倒じゃないので、まあそれほど困らないのですが。</p>
<pre class="brush:html">
&#60;input type="hidden" name="data&#91;User&#93;&#91;id&#93;" class="test" /&#62;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/1751/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery.qTipをjQuery1.4で使う</title>
		<link>http://www.bpsinc.jp/blog/archives/1711</link>
		<comments>http://www.bpsinc.jp/blog/archives/1711#comments</comments>
		<pubDate>Sun, 13 Jun 2010 00:59:47 +0000</pubDate>
		<dc:creator>baba</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[馬場]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[ツールチップ]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=1711</guid>
		<description><![CDATA[よく欲しくなるJavaScriptライブラリに、ツールチップがあります。
jQueryにもたくさんのTooltipプラグインがありますが、使い方が簡単でデザインが綺麗なものということで、qTipを選んでみました。
htt [...]]]></description>
			<content:encoded><![CDATA[<p>よく欲しくなるJavaScriptライブラリに、ツールチップがあります。</p>
<p>jQueryにもたくさんのTooltipプラグインがありますが、使い方が簡単でデザインが綺麗なものということで、qTipを選んでみました。<br />
<a href="http://craigsworks.com/projects/qtip/">http://craigsworks.com/projects/qtip/</a></p>
<p>とても良くできていますが、現状（1.0.0-rc3）では、jQuery 1.4に対応していないようです。<br />
そのまま使うと、以下のエラーが発生します。</p>
<blockquote><p>
$(this).data(&#8221;qtip&#8221;) is null<br />
Line 138
</p></blockquote>
<p>これは、jQueryのdata()メソッドの挙動が変更になったためです。</p>
<p>以下のサンプルコードを実施すると分かりますが、jQuery 1.3では「undefined」が表示され、1.4 では「null」が表示されます。</p>
<pre class="brush:html">
&#60;!DOCTYPE html&#62;
&#60;html&#62;
&#60;script type="text/javascript" src="jquery14.js"&#62;&#60;/script&#62;
&#60;/head&#62;
&#60;body&#62;
&#60;h1&#62;test&#60;/h1&#62;
&#60;script type="text/javascript"&#62;
	alert($('h1').data('hoge'));
&#60;/script&#62;
&#60;/body&#62;
&#60;/html&#62;
</pre>
<p>JavaScriptでは、nullのtypeはobjectなので、qTipの判定式が誤作動しています。</p>
<p>これを修正するには、qTipのdevelopment版（jquery.qtip-1.0.0-rc3.js）で133行目にあたる箇所に、次の赤い部分を書き加えます。</p>
<blockquote><p>
// Check if element already has qTip data assigned<br />
if(typeof $(this).data(&#8217;qtip&#8217;) == &#8216;object&#8217;<strong style="color:red"> &amp;&amp; $(this).data(&#8217;qtip&#8217;)</strong>)<br />
{<br />
  // Set new current interface id<br />
  if(typeof $(this).attr(&#8217;qtip&#8217;) === &#8216;undefined&#8217;)<br />
    $(this).data(&#8217;qtip&#8217;).current = $(this).data(&#8217;qtip&#8217;).interfaces.length;</p>
<p>  // Push new API interface onto interfaces array<br />
  $(this).data(&#8217;qtip&#8217;).interfaces.push(obj);<br />
}
</p></blockquote>
<p>これで、jQueryのバージョンを落とさずに便利なライブラリを使えますね。</p>
<p>もちろん、ライセンスは要確認です。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/1711/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>true/false一覧君</title>
		<link>http://www.bpsinc.jp/blog/archives/1686</link>
		<comments>http://www.bpsinc.jp/blog/archives/1686#comments</comments>
		<pubDate>Sat, 12 Jun 2010 00:01:24 +0000</pubDate>
		<dc:creator>baba</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[プログラミング言語]]></category>
		<category><![CDATA[馬場]]></category>
		<category><![CDATA[入門]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=1686</guid>
		<description><![CDATA[当然ながら、言語ごとに真偽判定（true/false）の基準が違います。
特にスクリプト系の言語では、明示的に型を指定しないことが多いので、たまに問題になります。
たまたま手元にあった環境で、どんな値が真に判定されるのか [...]]]></description>
			<content:encoded><![CDATA[<p>当然ながら、言語ごとに真偽判定（true/false）の基準が違います。</p>
<p>特にスクリプト系の言語では、明示的に型を指定しないことが多いので、たまに問題になります。</p>
<p>たまたま手元にあった環境で、どんな値が真に判定されるのか、というのをまとめてみました。<br />
新しい言語に突撃するときのメモ代わりにでもして頂ければ幸いです。</p>
<p>検証コードイメージ</p>
<pre class="brush:ruby">
a = 0
if a
  print 'true'
else
  print 'false'
end
</pre>
<p><a href="http://www.bpsinc.jp/blog/wp-content/uploads/2010/05/truefalse.png"><img src="http://www.bpsinc.jp/blog/wp-content/uploads/2010/05/truefalse.png" alt="truefalse" title="truefalse" width="623" class="aligncenter size-full wp-image-1687" /></a></p>
<p>凡例：<br />
× は、コンパイルエラー<br />
ｰ は、言語仕様にその値が存在しない</p>
<p>備考：<br />
*&#8221;" というのは、ナル文字の値を指す（\0なので、実体はゼロという整数値）<br />
array[] というのは、各言語での空の配列を指す<br />
※1　C言語にfalseは存在しない<br />
※2　配列のアドレスを指すため、真と評価される<br />
※3　noticeが発生するが、設定や@で抑制可能</p>
<p>こうしてみると、やはりPHPは変態です。&#8217;0&#8242; をfalseと判定する言語はあまりないですね。Webに特化しているのがよくわかります。$_GETなどは文字列で渡ってくるので、確かに手抜きに便利仕様です。</p>
<p>空配列をfalseと判定するのが、PythonとPHPというなんだかおもしろい組み合わせになりました。<br />
良く忘れるけど、rubyはゼロという数字をtrueに判定するので注意が必要ですね。</p>
<p>結局、ミスのしようが無い Java / C# は安全で好きです。<br />
また、ゼロは false、ほかは true と割り切ったC言語も、シンプルで好きです。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/1686/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery.tablesorter</title>
		<link>http://www.bpsinc.jp/blog/archives/1406</link>
		<comments>http://www.bpsinc.jp/blog/archives/1406#comments</comments>
		<pubDate>Tue, 20 Apr 2010 02:15:00 +0000</pubDate>
		<dc:creator>baba</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[馬場]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Sort]]></category>
		<category><![CDATA[Table]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=1406</guid>
		<description><![CDATA[テーブル並び替えのJSはたくさんありますが、jQuery.tablesorter が簡単に使えて良さそうです。
これの注意点です。
Ajaxで動的にテーブルのデータを追加するようなとき、最初に空のテーブルに対して

$( [...]]]></description>
			<content:encoded><![CDATA[<p>テーブル並び替えのJSはたくさんありますが、<a href="http://tablesorter.com/docs/">jQuery.tablesorter</a> が簡単に使えて良さそうです。</p>
<p>これの注意点です。</p>
<p>Ajaxで動的にテーブルのデータを追加するようなとき、最初に空のテーブルに対して</p>
<pre class="brush:js">
$('#table').tablesorter();
</pre>
<p>を実行して、あとで要素を追加したくなりますが、これだと上手くソートされません。<br />
初期化時に、データを見て並び替えアルゴリズムを判定しているようです。</p>
<p>必ず、データが1件以上あるテーブルに対して初期化しましょう。</p>
<p>ということで、データ追加時に tablesorter() を実行することになりますが、2回以上これを実行すると、クリック時に複数回ソートが行われてしまいます。<br />
2回登録してあると、「昇順→降順」が一瞬で行われ、実質ソートの切り替えができなくなってしまいます。</p>
<p>destroy系の関数が用意されていないので、手動でイベントを削除するのが良いですね。</p>
<pre class="brush:js">
$('#table th').unbind();
$('#table').tablesorter();
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/1406/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Javascriptでイベントハンドラに好きな値を渡す</title>
		<link>http://www.bpsinc.jp/blog/archives/1367</link>
		<comments>http://www.bpsinc.jp/blog/archives/1367#comments</comments>
		<pubDate>Wed, 14 Apr 2010 00:15:55 +0000</pubDate>
		<dc:creator>baba</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[馬場]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=1367</guid>
		<description><![CDATA[他の言語に慣れていると、Javascriptのスコープチェーンが分かりづらいですね。
たとえば、jQueryでクリックイベントに関数を登録する際、外の変数を参照すると予期せぬ結果になってしまうことがあります。
例：すべて [...]]]></description>
			<content:encoded><![CDATA[<p>他の言語に慣れていると、Javascriptのスコープチェーンが分かりづらいですね。</p>
<p>たとえば、jQueryでクリックイベントに関数を登録する際、外の変数を参照すると予期せぬ結果になってしまうことがあります。</p>
<p>例：すべてのボタンで3が表示されてしまう</p>
<pre class="brush:html">
&#60;html&#62;
&#60;head&#62;
&#60;script type="text/javascript" src="jquery.js"&#62;&#60;/script&#62;
&#60;script type="text/javascript"&#62;
$(function() {
	for (var i = 0; i &#60; 3; i++) {
		$('#button' + i).click(function() {
			alert(i);
		});
	}
});
&#60;/script&#62;
&#60;/head&#62;
&#60;body&#62;
&#60;button id="button0"&#62;0&#60;/button&#62;
&#60;button id="button1"&#62;1&#60;/button&#62;
&#60;button id="button2"&#62;2&#60;/button&#62;
&#60;/body&#62;
&#60;/html&#62;
</pre>
<p>このような場合、以下のようにすることで、意図した動作が実現できます。</p>
<pre class="brush:javascript">
for (var i = 0; i &#60; 3; i++) {
	$('#button' + i).click((function(i) {
		return function() {
			alert(i);
		}
	})(i));
}
</pre>
<p>しかし、毎回これをやるのも面倒なので、好きな引数を渡せるような関数を作ってしまうのも良いですね。<br />
これなら可変長引数にもそのままで対応できます。</p>
<pre class="brush:javascript">
$.func = function() {
    var fn = arguments&#91;arguments.length - 1&#93;;

    var arg = new Array(arguments.length - 1);
    for (var i = 0; i &#60; arguments.length - 1; i++) {
        arg&#91;i&#93; = arguments&#91;i&#93;;
    }

    return function() {
        fn.apply(this, arg);
    }
};

for (var i = 0; i &#60; 3; i++) {
	$('#button' + i).click($.func(i, function(i) {
		alert(i);
	}));
}
</pre>
<p>jQueryにはdojo.hitch相当のものがないですが、これで似たようなことはできそうです。</p>
<p style="color:red">4/17追記</p>
<p>jQuery1.4 で追加された jQuery.proxy が dojo.hitch 相当なので、これを使っても良かったですね。<br />
まあお好みで・・・<br />
というより、よく 1.3 までこの関数なしでやってきましたよね。必須だと思うのですが。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/1367/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>古いIEだとAjaxのUserAgentが変わるので、CakePHPでセッションが切れてしまう</title>
		<link>http://www.bpsinc.jp/blog/archives/1062</link>
		<comments>http://www.bpsinc.jp/blog/archives/1062#comments</comments>
		<pubDate>Mon, 01 Feb 2010 01:41:09 +0000</pubDate>
		<dc:creator>baba</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[馬場]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=1062</guid>
		<description><![CDATA[CakePHPでjQueryを使ったAjaxを実装した際、IEの古いバージョンでのみエラーになる現象に見舞われました。
調べてみると、Ajaxリクエストを送った際にログインが切れているようです。
どうやら原因は、Cake [...]]]></description>
			<content:encoded><![CDATA[<p>CakePHPでjQueryを使ったAjaxを実装した際、IEの古いバージョンでのみエラーになる現象に見舞われました。<br />
調べてみると、Ajaxリクエストを送った際にログインが切れているようです。</p>
<p>どうやら原因は、CakePHPのユーザエージェント検証機能でした。<br />
app/config/core.phpで</p>
<blockquote><p>Configure::write(&#8217;Session.checkAgent&#8217;, false);</p></blockquote>
<p>を設定することで解決しました。</p>
<p>つまり、古いIEでは、通常時のリクエストとAjaxリクエストで、ユーザエージェントが違う、ということですね。<br />
これはたぶん、歴史的な理由からXMLHttpRequestがActiveXオブジェクトで実装されていることに由来するのでしょう。</p>
<p>以下に、各ブラウザで確認したユーザエージェントを書いておきます。<br />
PHPで、$_SERVER['HTTP_USER_AGENT'] を表示しています。また、Ajax通信は、jQueryの$.ajax()を使っています。</p>
<p>■Firefox 3.5.6<br />
通常： Mozilla/5.0 (Windows; U; Windows NT 6.1; ja; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NET CLR 3.5.30729)<br />
Ajax： Mozilla/5.0 (Windows; U; Windows NT 6.1; ja; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NET CLR 3.5.30729)</p>
<p>■Chrome 4 beta<br />
通常： Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.64 Safari/532.5<br />
Ajax： Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.64 Safari/532.5</p>
<p>■IE8<br />
通常： Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; .NET4.0E)<br />
Ajax： Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; .NET4.0E)</p>
<p>■IE7<br />
通常： Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; .NET4.0E)<br />
Ajax： Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; .NET4.0E)</p>
<p>■IE6<br />
通常： Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 6.1; WOW64; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; .NET4.0E)<br />
Ajax： Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; .NET4.0E)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/1062/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
