2008-08-02

Aptana Jaxer で foo.html? といった ? で終わる ページは callback に失敗する

Aptana Jaxer で http://127.0.0.1:8081/foo.html? といった ? で終わる URL でページを表示し、JavaScript から Jaxer にコールバックしようとすると、次のような例外が発生します。



http://127.0.0.1:8081/foo.html のように ? がないときや http://127.0.0.1:8081/foo.html?bar のように ? 以降があるときは、このエラーは発生せず、期待どおり動作します。

注意さえすれば実用上は不都合ないと思いますが、気になったので原因を調べてみたところ、Jaxer が HTML ページをレンダリングするとき、自動的に追加する JavaScript コードに誤りがありました。

本来なら Jaxer.Callback.pageName の値には、このページの識別子が指定されるはずなのですが、? で終わるときのみ空欄になってしまいます。これはバグですね。

Jaxer.Callback.pageSignature = 610035010;
Jaxer.Callback.pageName = '';
Jaxer.CALLBACK_URI = '/jaxer-server/callback';
Jaxer.ALERT_CALLBACK_ERRORS = true;

具体的な事象が分かったので、Aptana に報告せねばと調べたところ、URL with question mark at the end fails Jaxer という Issue があり、解決済みとなっていました。貢献できると思ったのにちょっと残念。

ここで扱った Aptana Jaxer のバージョンは 0.9.7.2472 です。ですので、先日公開された 1.0.0 RC B では改善されているということですね(未確認です)。

Permission denied to get property Object.constructor

Firefox 3.0にFirebugアドオン(1.2.0b7)を入れたところ、JavaScriptを使ったページで次のエラーが表示されました。FirebugがFirebugを無効にすると直ります。
Permission denied to get property Object.constructor

Firebugは独自にプロパティのアクセス制御をしているのですね。便利ですが使う際に注意が必要そう。

2008-08-01

実践! Ajax フレームワーク jQuery

実践! Ajax フレームワーク jQuery という本が書店に並んでいました。パラパラっと流し読みした感じですと... (立ち読みしちゃった)

実践!Ajaxフレームワーク jQuery

jQuery API のメソッドを1つ1つ取り上げて、サンプルコードとその実行結果を見せながら解説するというスタイルになっています。jQuery 公式サイトの API リファレンスにもサンプル(demo)がありますが、少し読みにくく分かりにくい印象があるので、それを補うための本としての活用があると感じました。ですので、jQuery を使って WEB サイトをどう構成して開発していくかといった視点は弱いですね。

IE6/7 が Aptana Jaxer のレスポンスを誤認して文字エンコーディングの検出に失敗することがある?

Aptana Jaxer で、ある特定の条件で HTML ページをレンダリングすると、Internet Explorer で、誤った文字セットを使用して HTML ページがレンダリングされる という振る舞いが引き金となって、IE6 と IE7 で文字エンコーディングの検出を誤認することがあります。

HTML ページのなるべく先頭に、次のような meta 要素を指定しているにも関わらず、IE6 と IE7 は文字エンコーディングを UTF-8 でなく Shift_JIS として認識してしまいます。

<meta http-equiv="content-type" content="text/html; charset=UTF-8">

この文字エンコーディングの誤認は、Aptana Jaxer が HTML ページをレンダリングするときに自動的に挿入する、次のような script 要素の文字列長と関係しています(と推測しています)。

<html xml:lang="ja" xmlns="http://www.w3.org/1999/xhtml" lang="ja"><head>
<script src="/jaxer/framework/clientFramework_compressed.js?version=0.9.7.2472"></script>
<script>Jaxer.Callback.pageSignature = ...</script>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">

Aptana Jaxer は、html 要素のすぐ後に Jaxer Client Framework の JavaScript ファイルと、サーバとクライアント間の引き渡すデータを JavaScript コードを追加します。この追加する JavaScript の文字列長は、クライアントからサーバにコールバックするかどうか、サーバからクライアントにデータを引き渡す かどうかの条件によって変わってきます。

Aptana Jaxer が追加する script 要素の位置を変更する方法は見つかっていないため、次のとおり、HTTP ヘッダを使って文字エンコーディングが UTF-8 であることを明示すれば、この問題は解決できます。

Aptana Jaxer の中で HTTP ヘッダを上書きできます。次のとおり、Jaxer.Response.addHeader メソッドを使って、Content-Type ヘッダを上書き(引数 true)します。このとき charset=utf-8 を明示します。

Jaxer.response.addHeader('Content-Type', 'text/html; charset=utf-8', true);
もしくは Apache 2.2 の MIME タイプの設定を、次のように変更します。このとき charset=utf-8 を明示します。

AddType "text/html; charset=utf-8" html
なお、このエントリで扱った Aptana Jaxer のバージョンは 0.9.7.2472 のものです。ですので、先日公開された 1.0.0 RC B では改善されているかもしれません(未確認です)。

2008-07-19

jQuery リファレンスに素早く移動できる jQuery Menu Firefox Extension

jQuery Menu Firefox Extension
For all those jQuery freaks out there. Clicking multiple times to get to documentation is for suckers - add this handy menu right into the top of your Firefox menu and save valuable seconds!
jQuery のリファレンスページに素早く移動するための Firefox3 専用のアドオンです。

このアドオンをインストールすると、次のように、jQuery というメニューが追加されます。そして、メニューの項目を選択すると、該当するリファレンスページを表示します。



ほかに何か特別な機能はないようです。単なるブックマークです。

ですが、ブックマークから選択するよりは、数クリックほど省略できるかもしれません。また、jQuery のリファレンスページの構成が変わったとき、このアドオンのアップデートで反映されるかもしれません。

と、無理やり想像して役立ちそうなことを並べましたが、実際にインストールして使ってみると、そのブックマークとしての用途だけでもなかなか便利です。

2008-07-18

jQuery Chili 2.2 から行番号を表示できるようになりました

jQuery Chili のレシピを静的ロードする方法
こういう状況のときは、jQuery Chili の動的ロードを無効にして、あらかじめレシピを指定しておくという対策ができます。この対策を説明したサイトが見つからなかったので、ここでお伝えします。
以前に紹介した jQuery Chili ですが、新しく 2.2 にバージョンアップして、行番号を表示できるようになりました。

行番号の表示は class を指定して、いろいろとコントロールできる のですが、次のとおり、オプションを指定すると、class を指定することなく行番号を表示できます。

ChiliBook.lineNumbers = true;

このブログにもさっそく適用してみました。jQuery Chili 2.2 に差し替えて、lineNumbers オプションを有効にしました。過去のエントリも不都合なく行番号が表示できています。

2008-07-17

特定のディレクトリを Jaxer Filter の対象外にする方法

Aptana Jaxer (mod_jaxer) は、ディレクトリ単位で Jaxer Filter を指定しますが、このとき、その子ディレクトリも含めて Jaxer Filter が有効になります。

ですが、WEB サイトの構成によっては、そのディレクトリの一部を Jaxer Filter の対象外にしたいことがあります。例えば、http://example.com/ で Jaxer Filter を有効にするが、http://example.com/help/ は無効にするといったときです。

mod_jaxer は、次のとおり、JaxerPassThrough ディレクティブを使って、ディレクトリ単位で Jaxer Filter を無効にできます。無効というよりは Jaxer を適用せず、スルーするというイメージでしょうか。

<Directory "${ANCHOR}/public/help">
JaxerPassThrough
</Directory>

ですので、Jaxer を使うとき、小さくディレクトリ単位で Jaxer Filter を有効にしていく方法のほかに、大きくディレクトリで Jaxer Filter を有効にし、小さくディレクトリ単位で無効にしていくという方法も選択できます。

どちらの方法を使うかは、そのときの WEB サイトの設計と Jaxer の使い方によって変わってくると思います。