はじめに

特定の郵便番号指定時にインタラクティヴになってくれなかったようなので,修正を加えました.

原因

このライブラリは,7桁の郵便番号,仮に 123-4567 とします,を与えたとき,特定のディレクトリ (以下,データディレクトリ.デフォルトではライブラリの入っているディレクトリ下の data ディレクトリ) の中の zip-***.json というファイル,この例では zip-123.json,を探し,その中のJSONデータから必要な情報を引っ張ってくるようになっています.

さて,冒頭で触れた「特定の郵便番号」,3桁部分が 199 や 200 のものがその例ですが,データディレクトリを覗いてみると,これらに対応する zip-199.jsonzip-200.json といったファイルが存在していませんでした.

おそらく,すべての登録されている郵便番号の 3桁部分が 001 ~ 999 のすべてをカバーするわけではなく,そのカバーされないものについては,zip-***.json なファイルが存在しない,または 更新ツール で生成されない,ということになりましょうか.

そんなことからライブラリのソースコード,Ajax処理部分を確認したところ,気になる部分がありました.

    if ( window.Ajax && Ajax.Request ) {
        ...
        var opt = {
            method: 'GET',
            asynchronous: true,
            onComplete: func2
        };
        new Ajax.Request( url, opt );
    }
    else if ( window.jQuery ) {
        ...
        jQuery.getJSON( url, func3 );
    }

Ajaxリクエスト失敗時における処理が定義されていないようですね.これで冒頭の原因を特定できたっぽいです.

対策

上記部分を,Ajaxリクエスト失敗時にも対応できるようにしました.

    var func_error = function( xhr ) {
        return callback( { result: AjaxZip2.RESULT.NOT_FOUND } );  // 前エントリを参照
    };
 
    if ( window.Ajax && Ajax.Request ) {
        ...
        var opt = {
            method: 'GET',
            asynchronous: true,
            onComplete: func2,
            onFailure: func_error
        };
        new Ajax.Request( url, opt );
    }
    else if ( window.jQuery ) {
        ...
        jQuery.ajax({
          url:      url,
          type:     'get',
          dataType: 'json',
          success:  func3,
          error:    func_error
        });
    }

ソースコード

オリジナルとの差分であるパッチと,それを実際にあてたものを,CodeReposにコミットしておきました.オリジナルが置いてあるディレクトリに branches/patch-20090224 というディレクトリを作成し,その中に置いてあります.

おわりに

以上,インタラクティヴさは 前エントリ とまったく変わりませんが不具合っぽいものが 1つなくなりました.

ホントのところは,失敗時に XMLHttpRequest オブジェクトのステータスコードとかで分岐してごにょごにょする必要がありそうですが,まぁその辺は省略しときます.

最後に,2000000 という郵便番号を入力し,指摘いただいた方に感謝.

こちらもあわせてどうぞ

Leave a Reply

直近のつぶやきを読み込みちゅう...