開発環境
- OS X Lion - Apple(OS)
- Safari (Webプラウザ)
- BBEdit - Bare Bones Software, Inc.(Text Editor)
- Script言語:JavaScript
- JavaScript Library: jQuery
『初めてのJavaScript 第2版』(シェリー・パワーズ著(Shelley Powers著)、武舎 広幸+武舎 るみ訳、オライリー・ジャパン、2009年、ISBN978-4-84312-225-5) の15章(Ajaxのデータ - XMLかJSONか)練習問第15-1を解いてみる。
その他参考書籍
- JavaScript 第6版
- JavaScriptリファレンス 第6版
- 『jQueryクックブック』(jQuery Community Experts 著、株式会社クイープ 訳、オライリー・ジャパン、2010年、ISBN978-4-87312-269-1)
15-1.
メモ: jQuery版で、最初はjQueryクックブックの「レシピ16.6 XMLからDOMへの変換」を参考に、xmlDOMプラグインを使用してdataTypeをxmlにしたけど上手くいかず。。そしてdataTypeをxmlからhtmlに変更したら上手くいった。そこで、xmlDOMプラグインは必要ないんじゃないかな〜と思って、$.xmlDOM(data)とするのではなく、$(data)としたら、上手くDOM操作できた。ということでプラグインを削除。このことに気づくまで少し時間がかかった。
コード(BBEdit)
var xmlhttp = new XMLHttpRequest();
var url = "http://mkamimura.com/kamimura_blog/learning_javascript/sample1.xml";
xmlhttp.open('GET', url, true);
xmlhttp.onreadystatechange = print_recipe1;
xmlhttp.send(null);
function print_recipe1(){
$('#pre0').append(xmlhttp.readyState + ", " + xmlhttp.status + "\n");
if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
$('#pre0').append("成功!\n");
var d0 = document.getElementById('d0');
var recipe = document.createElement('div');
var h3 = document.createElement('h3');
var title = xmlhttp.responseXML.getElementsByTagName('title')[0].firstChild.nodeValue;
title = document.createTextNode(title);
h3.appendChild(title);
recipe.appendChild(h3);
var ul = document.createElement('ul');
var ingredients = xmlhttp.responseXML.getElementsByTagName('ingredient');
for(var i = 0; i < ingredients.length; i++){
var li = document.createElement('li');
var ingredient = ingredients[i].firstChild.nodeValue;
ingredient = document.createTextNode(ingredient);
li.appendChild(ingredient);
ul.appendChild(li);
}
recipe.appendChild(ul);
var p = document.createElement('p');
var instruction = xmlhttp.responseXML.getElementsByTagName('instruction')[0].
firstChild.nodeValue;
instruction = document.createTextNode(instruction);
p.appendChild(instruction);
recipe.appendChild(p);
d0.appendChild(recipe);
} else {
$('#pre0').append("通信中か失敗!\n");
}
}
// jQuery版
var option = {
type:'GET',
dataType: 'xml',
url:url,
success:print_recipe2,
error:print_error,
complete: print_end
};
function print_recipe2(data, text_status){
$('#pre0').append("jQuery版: 成功!" + text_status + "\n");
var recipe = $(document.createElement('div'));
var h3 = $(document.createElement('h3'));
var title = $(data).find('recipe > title').text();
h3.text(title);
recipe.append(h3);
var ul = $(document.createElement('ul'));
$(data).find('recipe > ingredient').each(function(){
var li = $(document.createElement('li'));
li.append($(this).text());
ul.append(li);
});
recipe.append(ul);
var p = $(document.createElement('p'));
var instruction = $(data).find('recipe > instruction').text();
p.append(instruction);
recipe.append(p);
$('#d1').append(recipe);
}
function print_error(){
$('#pre0').append("jQuery版: エラー\n");
}
function print_end(){
$('#pre0').append("jQuery版: 終了\n");
}
$.ajax(option);
通常版
jQuery版
0 コメント:
コメントを投稿