JavaScriptで10の練習問題 #5

キーワードを入れてYahoo!の検索結果を出力

究極に楽をするならiframeのsrcに検索クエリ付きのURLを渡す。
でも、それではあまり勉強にならないので、今回はJSONPを使ってみることにする。
Yahoo Developer NetworkAPIキーを取得して開始。

function yahooSearch(apiKey) {
    this.apiKey = apiKey;
}
yahooSearch.prototype = {
    init: function () {
        var self = this;
        self.form   = document.MyForm;
        self.input  = self.form.text;
        self.submit = self.form.submit;
        self.view   = document.getElementById('view');
        self.form.onsubmit = function () {
            self.jsonp();
            return false;
        };
    },
    param: function () {
        return [
            'http://api.search.yahoo.com/WebSearchService/V1/webSearch',
            '?appid='+ encodeURIComponent(this.apiKey),
            '&results=10',
            '&format=html',
            '&language=ja',
            '&output=json',
            '&callback=callbackFunc',
            '&query='+ encodeURIComponent(this.input.value)
        ].join('');
    },
    jsonp: function () {
        // submitを無効にする
        this.submit.disabled = true;
        // <script type="text/javascript" src="Request URL"></script>をねじ込む
        var script = document.createElement('script');
        script.setAttribute('type', 'text/javascript');
        script.setAttribute('src', this.param());
        document.body.appendChild(script);
    },
    render: function (r) {
        // 例外処理とか適当
        if (r.Error) {
            this.view.innerHTML = 'Error: 検索結果がありません!';
            this.submit.disabled = false;
            return false;
        }
        // 表示
        var items = r.ResultSet.Result;
        var array = [];
        for (var i = 0, len = items.length; i < len; i++) {
            array[i] = '<a href="'+ items[i].Url +'">'+ items[i].Title +'</a>';
        }
        this.view.innerHTML = array.join('<br>');
        // submitを有効にする
        this.submit.disabled = false;
    }
}

var study_05 = new yahooSearch('API Key');

window.onload = function () {
    (function () {
        study_05.init();
    })();
}

// この関数で受け取る
function callbackFunc(r) {
    (function () {
        study_05.render(r);
    })();
}

JSONPって名前だけしか知らなかったけど、こう言うことだったんですね。
面白い。

今回使用したHTML

<form name="MyForm">
  <input type="text" name="text" value="">
  <input type="submit" name="submit" value="検索">
</form>
<div id="view"></div>