例えば、次のように「callback=resultcallback」を指定してみるとよく分かるだろう。
http://api.search.yahoo.com/WebSearchService/V1/webSearch?appid=YahooDemo&query=apple&results=3&output=json &callback=resultcallback
すると、次の文字列が得られる(これも同じく実際には改行が含まれない)。
resultcallback({"ResultSet":
{"type":"web",
"totalResultsAvailable":242000000,
"totalResultsReturned":3,
"firstResultPosition":1,
…略…,
"Result":[
{"Title":"Apple",
"Summary":"Macintosh hardware, software, and Internet tools. Offering Quicktime info, developer resources, and other items related to Apple computers.",
"Url":"http:\/\/www.apple.com\/",
…略…
},
{"Title"、"Summary"、など次の結果…},
…略…
}
}
);
この文字列をscriptタグを使って読み込んで実行すれば、「呼び出し結果が、resultcallbackメソッドへと引き渡されて実行される」という動作になる。
つまり開発者は、resultcallbackという名前のメソッドを用意しておき、その引数を処理することで、Yahoo! Search APIの検索結果を取得して処理ができるわけだ。
実際にその処理を書いたのが、リスト5だ。リスト5は完全にJavaScriptだけで処理されており、サーバ側に用意すべきものは含まれない(図3)。
<html>
<head>
<!-- 動的に埋め込むためのプレースホルダ -->
<script type="text/javascript" charset="utf-8" id="import">
</script>
<script type="text/javascript">
<!--
function resultcallback(result)
{
// 結果数
var resultCount = result['ResultSet']['totalResultsReturned'];
// 元のノード
var originalnode = document.getElementById('result');
// 結果を入れるノードを作る
var resultnode = document.createElement('div');
resultnode.id = 'result';
// 結果数だけ繰り返してノードを作る
for (var i = 0; i < resultCount; i++)
{
var subnode = document.createElement('div');
subnode.innerText = result['ResultSet']['Result'][i]['Title'] +
"/" + result['ResultSet']['Result'][i]['Url'];
resultnode.appendChild(subnode);
}
// 結果のノードを差し替える
originalnode.parentNode.replaceChild(resultnode, originalnode);
}
function search()
{
// 動的にscriptタグを作ってYahoo APIを呼び出す
// appidは環境に応じて変更すること
var baseurl =
"http://api.search.yahoo.com/WebSearchService/V1/webSearch?appid=YahooDemo";
// クエリ文字列
baseurl += "&query=";
baseurl += encodeURIComponent(document.getElementById('searchtext').value);
// 結果数(ここでは10件)、JSON、JSONコールバック関数
// ここではコールバックを「resultcallback」に
baseurl += "&results=10&output=json&callback=resultcallback";
// scriptタグの埋め込み
// (IE6の場合のみ動作する。FirefoxなどではDomツリーの作り直しが必要)
document.getElementById('import').src = baseurl;
}
-->
</script>
</head>
<body>
<form>
検索文字列:<input type="text" id="searchtext"/><br/>
<input type="button" onClick="javascript:search();" value="検索"/>
</form>
<!-- 結果を埋め込むプレースフォルダ -->
<div id="result">
</div>
</body>
</html>
リスト5には、scriptタグのプレースフォルダとして、次のように「id= import」としたものを用意してある(importという名前は例として筆者が決めたものであり、どのような名前でも構わない)。
<script type="text/javascript"
charset="utf-8" id="import">
</script>
Copyright © ITmedia, Inc. All Rights Reserved.