• このエントリーをはてなブックマークに追加

はじめに

未だに愛用しておりますが,最近,ちょっと要件を満たせないことがあったので,ソースコードに少しだけ手を入れてみました.

なお,3年半ほど前に行った修正:

からの変更でお話します.

修正その 1:メソッド zip2addr() の第 7引数をハッシュで受け取るように

同メッドは,オリジナルでは 6つ,私の以前の修正 では,郵便番号データ取得後の挙動を定義したコールバック関数を指定できるよう,後ろに 1つ追加しました:

AjaxZip2.zip2addr = function ( azip1, apref, aaddr, azip2, astrt, aarea, callback ) { ... };

今回,要件を満たすために,挙動を指定するためにいくつかパラメータを追加したいのだけど,さらに引数の数を増やすのもなぁ...ということで,7引数目を「挙動のオプションのためのハッシュ」として受け取るようにしてみました.

AjaxZip2.zip2addr = function ( azip1, apref, aaddr, azip2, astrt, aarea, options ) { ... };

先のコールバック関数であれば,次のように指定します:

AjaxZip2.zip2addr( ..., { callback: function (res) { ... } } );
// AjaxZip2.zip2addr( ..., function (res) { ... } );  // ちなみに,以前はこう

修正その 2:同一ページ複数フォームに対応

同じページにおいて,「郵便番号 → 住所」な機能をもったフォームを 2つ設置した場合,次のような感じになるかと思います:

// 1つ目のフォーム
$('#form1 [name="zip2addr"]').bind('click', function () {
    AjaxZip2.zip2addr( ... );
});
 
// 2つ目のフォーム
$('#form2 [name="zip2addr"]').bind('click', function () {
    AjaxZip2.zip2addr( ... );
});

オリジナルでは,検索処理の際に,郵便番号やフォーム要素の名前等を基にした文字列(便宜上,イカ,「ユニーク文字列」とします)を AjaxZip2.prev に入れていて,これが次の検索のときにまったく同じ( == 前回検索時と郵便番号が同じ)場合は何もしない(通信的な意味で),というようなことをしています.

そのため,両者のフォーム要素の名前(と役割)が同じだったりすると,1つ目のフォームで郵便番号を入れて検索後,2つ目のフォームで同じ番号を入れて検索...しても何も起こらない(エラーでもない),といったことがあったりします.

そこで,AjaxZip2.prev をハッシュ化し,フォームそれぞれについてのユニーク文字列を持たせるようにしてみました.そのキーを,zip2addr() メソッド 7引数目の id というキーで指定できるようにしています:

// 1つ目のフォーム
$('#form1 [name="zip2addr"]').bind('click', function () {
    AjaxZip2.zip2addr( ..., { id: 'a' } );
});
 
// 2つ目のフォーム
$('#form2 [name="zip2addr"]').bind('click', function () {
    AjaxZip2.zip2addr( ..., { id: 'b' } );
});

前者は AjaxZip2.prev.a に,後者は AjaxZip2.prev.b に,それぞれそのフォームのユニーク文字列が入るようになっています.

(あー,よく考えたら,フォームそれぞれの action 属性の値が異なっていればうまく動きますねw)

修正その 3:ユニーク文字列判別を無視する

AjaxZip2.zip2addr( ..., { force: true } );

ってすれば,先のユニーク文字列に関する判別を無視して,強制的に検索処理を進めます.「修正その 2」の件の別解だった気がするので,あまり使わないかも.

差分

今回修正してみた分の差分は次のとおり:

diff --git a/ajaxzip2.js b/ajaxzip2.js
index 4acac87..9556fbd 100755
--- a/ajaxzip2.js
+++ b/ajaxzip2.js
@@ -30,7 +30,7 @@ AjaxZip2 = function () {};
 AjaxZip2.VERSION = '2.10';
 AjaxZip2.JSONDATA = 'ajaxzip2/data';
 AjaxZip2.CACHE = [];
-AjaxZip2.prev = '';
+AjaxZip2.prev = {};
 AjaxZip2.PREFMAP = [
     null,       '北海道',   '青森県',   '岩手県',   '宮城県',
     '秋田県',   '山形県',   '福島県',   '茨城県',   '栃木県',
@@ -53,14 +53,21 @@ AjaxZip2.RESULT = {
     HOGE:           undefined
 };
 
-AjaxZip2.zip2addr = function ( azip1, apref, aaddr, azip2, astrt, aarea, callback ) {
+AjaxZip2.zip2addr = function ( azip1, apref, aaddr, azip2, astrt, aarea, options ) {
     var fzip1 = AjaxZip2.getElementByName(azip1);
     var fzip2 = AjaxZip2.getElementByName(azip2,fzip1);
     var fpref = AjaxZip2.getElementByName(apref,fzip1);
     var faddr = AjaxZip2.getElementByName(aaddr,fzip1);
     var fstrt = AjaxZip2.getElementByName(astrt,fzip1);
     var farea = AjaxZip2.getElementByName(aarea,fzip1);
-    if( typeof callback == 'undefined' ) callback = function() {};
+
+    if ( typeof options == 'undefined' ) { options = {} }
+    var callback = options.callback || function () {};
+    var uniq_id  = options.id || '__single__';
+    var force    = options.force || false;
+
+    if ( AjaxZip2.prev[uniq_id] == 'undefind' ) { AjaxZip2.prev[uniq_id] = '' }
+
     if ( ! fzip1 ) return callback( { result: AjaxZip2.RESULT.HOGE } );
     if ( ! fpref ) return callback( { result: AjaxZip2.RESULT.HOGE } );
     if ( ! faddr ) return callback( { result: AjaxZip2.RESULT.HOGE } );
@@ -83,8 +90,8 @@ AjaxZip2.zip2addr = function ( azip1, apref, aaddr, azip2, astrt, aarea, callbac
     if ( fzip1.form ) uniq += fzip1.form.id+fzip1.form.name+fzip1.form.action;
     if ( fzip2 ) uniq += fzip2.name;
     if ( fstrt ) uniq += fstrt.name;
-    if ( uniq == AjaxZip2.prev ) return callback( { result: AjaxZip2.RESULT.SAME_AS_PREV } );
-    AjaxZip2.prev = uniq;
+    if ( ! force && uniq == AjaxZip2.prev[uniq_id] ) return callback( { result: AjaxZip2.RESULT.SAME_AS_PREV } );
+    AjaxZip2.prev[uniq_id] = uniq;
 
     // JSON取得後のコールバック関数
     var func1 = function ( data, _callback ) {

おわりに

以上,未だに愛用中の AjaxZip2 を,とある要件を満たすように修正してみたお話でした.(もうちょっと考えていれば,修正せずに済んだ部分もありますが!)