7.2 jQueryによる実装

(1/1)
jQuery
jQuery という無償のJavaScriptライブラリを活用することで、クラウドサービス を利用するプログラムを書きやすくなる。
前回作成した、郵便番号→住所検索プログラム、Wikipedia検索プログラムの2つを、jQuery を使ったプログラムに移植する。

目次

サンプル・プログラム

郵便番号→住所検索

郵便番号→住所検索
使用する クラウドサービス は「7.1 郵便番号→住所検索,Wikipedia検索」で紹介したものと同じだ。呼び出し方を jQueryAjax通信に差し替えた。
Ajax(Asynchronous JavaScript + XML)とは、ページ遷移せずに(リロードすることなく)データを読み込むための非同期通信の仕組みで、XMLと付いているものの、JSONやJSONP、テキストや画像データを非同期で受信することができる。

   1: <!--
   2: /** zip2address2.html
   3:  *  プログラミング入門 - 7.2 jQueryによる実装
   4:  *
   5:  * @copyright   (c)studio pahoo
   6:  * @author      パパぱふぅ
   7:  * @動作環境    JavaScript ES6(ES2015)
   8:  * @参考URL     https://www.pahoo.org/e-soul/webtech/js00/js00-07-02.html
   9: */
  10: -->
  11: <!DOCTYPE html>
  12: <html lang="ja">
  13: <head>
  14: <meta charset="UTF-8">
  15: <title></title>
  16: <script src="./pahooClipboard.js"></script>  <!-- クリップボード・クラス -->
  17: <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <!-- jQuery -->
  18: <script>

jQuery公式サイトからダウンロードしてきてもよいが、ここでは、Google APIs に登録されているものを呼び出す形にした。

  72: /**
  73:  * 検索ボタン押下処理
  74:  * @param   なし
  75:  * @return  なし
  76: */
  77: function zip2address2() {
  78:     //エラー・クリア
  79:     let errmsg = '';
  80:     $('#error').html(errmsg);
  81: 
  82:     //変換後テキスト・クリア
  83:     $('#state').val('');
  84:     $('#city').val('');
  85:     $('#street').val('');
  86:     $('#dest').val('');
  87: 
  88:     //検索郵便番号
  89:     let zip = $('#zip').val();
  90:     //空白除去
  91:     zip = zip.trim();
  92:     //バリデーション
  93:     const regex = new RegExp('^[0-9]{3}\-[0-9]{4}$')
  94:     if (! regex.test(zip)) {
  95:         errmsg = '郵便番号が間違っています.'
  96:         console.error(errmsg);
  97:         $('#error').html('エラー:' + errmsg);
  98:         return;
  99:     }
 100:     //郵便番号をハイフンで分離
 101:     let zips = zip.split('-');
 102: 
 103:     //WebAPI呼び出し
 104:     $.ajax({
 105:         url:        'https://api.thni.net/jzip/X0401/JSONP/' + zips[0+ '/' + zips[1+ '.js',
 106:         type:           'GET',
 107:         async:          true,               //非同期通信フラグの指定
 108:         timeout:        1000,               //タイムアウト時間(ミリ秒)
 109:         dataType:       'jsonp',            //Access-Control-Allow-Origin対策
 110:         jsonpCallback:  'ZipSearchValue'    //JSONP関数
 111:     })
 112: 
 113:     //WebAPI接続成功
 114:     .done(function (result) {
 115:         console.log(result);
 116:         $('#state').val(result.stateName);
 117:         $('#city').val(result.city);
 118:         $('#street').val(result.street);
 119:         $('#dest').val(result.stateName + result.city + result.street);
 120:     })
 121: 
 122:     //WebAPI接続失敗
 123:     .fail(function (data) {
 124:         console.error(data);
 125:         errmsg = '郵便番号が間違っているかWebAPIに接続できません.'
 126:         console.error(errmsg);
 127:         $('#error').html('エラー:' + errmsg);
 128:     });
 129: }

前回作成した zip2address 関数と同じく、まずエラーや変換後テキストをクリアしておく。
jQuery には多彩なセレクタが用意されている。たとえば、$('#error')document.getElementById('error') と書くのと同じ意味である。セレクタを活用することで、キー入力を省力化できる。
セレクタ意味
$('title')タグ <title> を指す
$('.className');クラス名 className を指す
$('#error');ID名 error を指す
セレクタを用いたときは、
document.getElementById('error').innerHTML = errmsg;
⇒ $('#error').html(errmsg);
document.getElementById('state').value = '';
⇒ $('#dest').val('');
のようにメソッドも変わる。

Ajax通信$.ajax ではじめる。
URLには、クラウドサービス の呼び出しURLを記述する。typeはGETを、async(非同期)をtrueに。timeoutにはタイムアウト時間(ミリ秒)を、SOP(Same-Origin Policy;同一生成元ポリシー)対策のため、dataTypeにJSONPを指定する。今回利用する ZIP SEARCH API SERVICE では、JSONP関数名があらかじめ決められているので、jsonpCallbackに決められた関数名 'ZipSearchValue' を指定する。

クラウドサービス 接続に成功したときは、.done 以降に処理関数を記述する。
この部分は、前回作成したものを jQuery のセレクタに焼き直しただけである。

クラウドサービス 接続に失敗したときは、.fail 以降に処理関数を記述する。
こちらも、前回作成したものを jQuery のセレクタに焼き直しただけである。

ユーザー関数の行数は XMLHttpRequest オブジェクトを使った前回のものと大差ないのだが、1行の長さが短くなっており、スクリプトを appendChild するという強引なコードもないので読みやすくなっている。

Wikipedia検索

Wikipedia検索

  69: /**
  70:  * 検索ボタン押下処理
  71:  * @param   なし
  72:  * @return  なし
  73: */
  74: function wikisearch2() {
  75:     //エラー・クリア
  76:     let errmsg = '';
  77:     $('#error').html(errmsg);
  78: 
  79:     //検索結果クリア
  80:     $('#dest').val('');
  81: 
  82:     //検索キーワード
  83:     let query = $('#query').val();
  84:     //空白除去
  85:     query = query.trim();
  86:     //入力文字のエスケープ
  87:     query = specialCharacters2HTMLentities(query);
  88:     //URLエンコード
  89:     query = encodeURI(query)
  90: 
  91:     //WebAPI呼び出し
  92:     $.ajax({
  93:         url:        'https://ja.wikipedia.org/w/api.php',
  94:         type:       'GET',
  95:         async:      true,       //非同期通信フラグの指定
  96:         timeout:    1000,       //タイムアウト時間(ミリ秒)
  97:         dataType:   'jsonp',    //Access-Control-Allow-Origin対策
  98:         data: {
  99:             format:         'json',
 100:             action:         'query',
 101:             prop:           'extracts',
 102:             exintro:        '',
 103:             explaintext:    '',
 104:             redirects:      1,
 105:             titles:         query
 106:         },
 107:     })
 108: 
 109:     //WebAPI接続成功
 110:     .done(function (result) {
 111:         console.log(result);
 112:         let key = Object.keys(result.query.pages)[0];
 113:         let summary = result.query.pages[key].extract;
 114:         //応答結果あり
 115:         if (typeof summary !'undefined') {
 116:             document.getElementById('dest').value = summary;
 117:         //応答結果なし
 118:         } else {
 119:             errmsg = '検索キーワードが見つかりません.'
 120:             console.error(errmsg);
 121:             $('#error').html('エラー' + errmsg);
 122:         }
 123:     })
 124: 
 125:     //WebAPI接続失敗
 126:     .fail(function (data) {
 127:         console.error(data);
 128:         errmsg = 'WebAPIに接続できません.'
 129:         console.error(errmsg);
 130:         $('#error').html('エラー' + errmsg);
 131:     });
 132: }

wikisearch 関数も jQuery で書き直した。
Wikipedia API では、いくつかのパラメータをGETで渡すので、渡す内容をdateに記述する。
あとは zip2address2 関数の時と同じである。

コラム:jQueryのメリットとデメリット

勉強が好調な人のイラスト(女性)
今回見てきたように、jQuery は、Ajax通信プログラムを簡潔に書いたり、セレクタを使うことでHTMLへのアクセスの手間を省くというメリットがある。
また、ブラウザに依存するコードを減らすこともできる。jQuery 利用者は多く、豊富なプラグインが出回っており、使いやすくアクセントのあるGUIを作るときの役にも立つ。
当然デメリットもある。
コーディングの手間を省いたとはいえ、大規模なフロントエンド開発には向いていないし、大規模な開発ではかえって実行速度を低下させることがある。
$ で始める独特な記述のため、prototype.jsVue.js などの他のライブラリやフレームワークと競合することがある。
そして、これが一番大きなデメリットなのだが、JavaScript の基本知識を学ぶことができないということが挙げられる。
本シリーズでは、jQuery の解説はここで止め(ピンポイントで使用することはあるかもしれないが)、これ以降は再びネイティブな JavaScript でプログラムを紹介することにする。

参考サイト

(この項おわり)
header