2014年3月22日土曜日

開発環境

Head First JavaScript ―頭とからだで覚えるJavaScriptの基本( Michael Morrison (著), 豊福 剛 (翻訳)、オライリージャパン)の12章(ダイナミックなデータ)、自分で考えてみよう(p.571)を解いてみる。

その他参考書籍

自分で考えてみよう(p.571)

コード(BBEdit)

ajax.js

var Blog = function (date, body, image) {
        this.date = date ? new Date(date) : new Date();
        this.body = body || 'Nothing going on today';
        this.image = image;
    },
    AjaxRequest = function () {
        this.request = null;
        if (window.XMLHttpRequest) {
            try {
                this.request = new XMLHttpRequest();
            } catch (e) {
                this.request = null;
            }
        } else if (window.ActiveXObject) {
            try {
                this.request = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                try {
                    this.request = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e) {
                    this.request = null;
                }
            }
        }
    },
    getText = function (elem) {
        var text = '',
            i,
            max,
            child,
            value,
            nodes;
        if (elem) {
            if (elem.childNodes) {
                for (i = 0, max = elem.childNodes.length; i < max; i += 1) {
                    child = elem.childNodes[i];
                    value = child.nodeValue;
                    if (value) {
                        text += value;
                    } else {
                        nodes = child.childNodes;
                        if (nodes) {
                            value = nodes[0].nodeValue;
                            if (value) {
                                text += value;
                            }
                        }
                    }
                }
            }
        }
        return text;
    },
    div = document.getElementById('d0'),
    contents = [],
    ajax_req,
    url = 'http://mkamimura.com/kamimura_blog/javascript/' +
            'head_first_javascript/blog.xml',
    handler = function () {
        var xml_data,
            blog,
            title,
            author,
            entries,
            entry,
            i,
            max;
        if (ajax_req.getReadyState() === 4 && ajax_req.getStatus() === 200) {
            xml_data = ajax_req.getResponseXML();
            blog = xml_data.getElementsByTagName('blog')[0];
            title = blog.getElementsByTagName('title')[0];
            Blog.title = getText(title);
            author = blog.getElementsByTagName('author')[0];
            entries = blog.getElementsByTagName('entry');
            Blog.prototype.signature = getText(author);
            for (i = 0, max = entries.length; i < max; i += 1) {
                entry = entries[i];
                contents.push(new Blog(
                    getText(entry.getElementsByTagName('date')[0]),
                    getText(entry.getElementsByTagName('body')[0]),
                    getText(entry.getElementsByTagName('image')[0])));
            }
            Blog.showBlog(5);
        }
    },
    // 読み込みデータの読み込み中はプログレスバーを表示
    loadBlog = function () {
        div.innerHTML = '読み込み中 <progress />'
        ajax_req.send('GET', url, handler)
    };

Date.prototype.shortFormat = function () {
    return (this.getMonth() + 1) + '/' + this.getDate() + '/' +
        this.getFullYear();
};

Blog.blogSorter = function (entry1, entry2) {
    return entry2.date - entry1.date;
};
Blog.showBlog = function (n) {
    var blog_html = '<div>' + Blog.title + '</div>',
        i,
        highlight = true;
    contents.sort(Blog.blogSorter);
    if (!n) {
        n = contents.length;
    }
    for (i = 0; i < n; i += 1) {
        blog_html += contents[i].toHTML(highlight);
        highlight = ! highlight;
    };
    div.innerHTML = blog_html;
};
Blog.showSignature = function () {
    return 'This blog created by ' + Blog.prototype.signature;
};
Blog.prototype.toHTML = function (highlight) {
    var blog_html = highlight ? '<div style="background-color: #EEEEEE;">' :
                                '<div>';
    blog_html += '<strong>' + this.date.shortFormat() + '</strong><br />';
    if (this.image) {
        blog_html += '<table><tr><td><img src="' + this.image + '" /></td>' +
                '<td style="vertical-align:top">' + this.body + '</td></tr>' +
                '</table>';
    } else {
        blog_html += this.body + '<br />';
    }
    blog_html += '<em>' + Blog.showSignature() + '</em></div><br />';
    return blog_html;
};

AjaxRequest.prototype.send = function (type, url, handler, post_data_type,
        post_data) {
    if(this.request !== null) {
        this.request.abort();
        url += "?dummy=" + new Date().getTime();
        
        try {
            this.request.onreadystatechange = handler;
            this.request.open(type, url, true);
            
            if (type.toLowerCase() === 'get') {
                this.request.send(null);
            } else {
                this.request.setRequestHeader('Content-Type', poast_data_type);
                this.request.send(post_data);
            }
        } catch (e) {
            div.innerHTML = 'サーバとの通信でAjaxエラー\n' + '詳細: ' + e;
        }
    }
};
AjaxRequest.prototype.getReadyState = function () {
    return this.request.readyState;
};
AjaxRequest.prototype.getStatus = function () {
    return this.request.status;
};
AjaxRequest.prototype.getResponseXML = function () {
    return this.request.responseXML;
};

ajax_req = new AjaxRequest();
loadBlog();

0 コメント:

コメントを投稿