開発環境
- macOS Sierra - Apple (OS)
- Emacs (Text Editor)
- JavaScript (プログラミング言語)
- JavaScript Library
- Safari(Web browser)
-
参考書籍
- JavaScript 第6版 (David Flanagan(著)、村上 列(翻訳)、オライリージャパン)
- JavaScriptリファレンス 第6版(David Flanagan(著)、木下 哲也(翻訳)、オライリージャパン)
Exercises for Programmers: 57 Challenges to Develop Your Coding Skills (Brian P. Hogan 著、Pragmatic Bookshelf)のChapter 9(Working with External Services)、47(Who's in Space?)を取り組んでみる。
47(Who's in Space?)
コード(Emacs)
HTML5
<div id="output0">取得中…</div> <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js" integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8=" crossorigin="anonymous"></script> <script src="sample47.js"></script>
JavaScript
{
'use strict';
let url = 'http://api.open-notify.org/astros.json',
$div_output = $('#output0');
$.getJSON(url, (json) => {
let people = json.people,
space = {};
people.forEach((person) => {
let craft = person.craft;
if (space[craft] === undefined) {
space[craft] = [person.name];
} else {
space[craft].push(person.name);
}
});
let crafts = Object.keys(space);
let output = '<table border="1"><tr><th>Name</th><th>Craft</th></tr>';
crafts.sort();
crafts.forEach((craft) => {
let names = space[craft];
names.sort((name1, name2) => {
let last1 = name1.split(' ').pop(),
last2 = name2.split(' ').pop();
return last1 < last2 ? -1 : last1 === last2 ? 0 : 1;
});
output += `<tr><td>${names[0]}</td>` +
`<td colspan="${names.length}">${craft}</td></tr>`;
names.slice(1).forEach((name) => {
output += `<tr><td>${name}</td></tr>`;
});
});
output += '</table>';
$div_output.html(output);
});
}
取得中…
ローカル(file://)で Safari だと 同一生成元ポリシー(The Same Origin Policy)に引っかからないけど、ブログだと引っかかるのうっかり忘れてた。localでも、http://なら Safariでも取得できない。一応 python3 -m http.server で確認。Firefox、Chromeとかは 「file://」でも取得できないみたい。
ということで、修正、書き換え。
コード(Emacs)
HTML5
<div id="output1">取得中…</div> <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js" integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8=" crossorigin="anonymous"></script> <script src="sample47_1.js"></script>
JavaScript
{
'use strict';
let url = 'http://api.open-notify.org/astros.json',
$div_output = $('#output1');
$.ajax({
type: 'get',
url: url,
dataType: 'jsonp',
success: (json) => {
let people = json.people,
space = {};
people.forEach((person) => {
let craft = person.craft;
if (space[craft] === undefined) {
space[craft] = [person.name];
} else {
space[craft].push(person.name);
}
});
let crafts = Object.keys(space);
let output = '<table border="1"><tr><th>Name</th>' +
'<th>Craft</th></tr>';
crafts.sort();
crafts.forEach((craft) => {
let names = space[craft];
names.sort((name1, name2) => {
let last1 = name1.split(' ').pop(),
last2 = name2.split(' ').pop();
return last1 < last2 ? -1 : last1 === last2 ? 0 : 1;
});
output += `<tr><td>${names[0]}</td>` +
`<td colspan="${names.length}">${craft}</td></tr>`;
names.slice(1).forEach((name) => {
output += `<tr><td>${name}</td></tr>`;
});
});
output += '</table>';
$div_output.html(output);
},
});
}
取得中…
0 コメント:
コメントを投稿