2
schangxiang@126.com
2024-08-16 b47c50a2a514def7374b32d7194b2c599cba5625
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
function JsonTree(jsonData) {
    function isArray(o) {
        if (Array.isArray) {
            return Array.isArray(o);
        }
        if (Object.prototype.toString.call(o) === '[object Array]') {
            return true;
        }
        return false;
    }
 
    function htmlEncode(str) {
        var div = document.createElement("div");
        div.appendChild(document.createTextNode(str));
        return div.innerHTML;
    }
 
    //building the jsonData as dom elements
    this.getTree = function(domId) {
        if (this.display === true) {
            return;
        } else {
            this.display = true;
        }
        var html = '';
        var dataType = isArray(jsonData) ? 'arr' : '';
        var tree = document.createElement('div');
        tree.id = domId || "tree";
        tree.className = 'tree';
        //tree.id = "JsonViewer";
        tree.innerHTML = buildDom(jsonData, dataType);
        bindEvents(tree);
        return tree;
    }
    //building doms
    function buildDom(o, literal) {
        // null object
        var type = o === null
                   ? 'null'
                   : (isArray(o) ? 'array' : typeof o);
        var html = '';
 
        switch(type) {
            case 'array' :
                for (var i = 0, len = o.length; i < len; i++) {
                    html += '<li class = \'tree-close\' title=\''
                            + literal + '[' + i + ']\'><strong>'
                            + i + '</strong>:'
                            + buildDom(o[i], literal + '[' + i + ']')
                            + ',</li>';
                }
                return '<span class="operator">+</span><div class="group">'
                       + '[<ul class="' + type + '">'
                       + html.replace(/,<\/li>$/, '<\/li>')
                       + '</ul>]</div><div class="summary">Array['
                       + len + ']</div>';
                break;
            case 'object':
                //sort obj
                //var keys = Object.keys(o);
                //keys.sort();
                for (var key in o) {
                    //quote numeric property
                    if (/^\d+$/.test(key)) {
                        html += '<li class = \'tree-close\' title=\'' + literal
                                + '["' + key + '"]\'><strong>"'
                                + key + '"</strong>:'
                                + buildDom(
                                    o[key], literal + '["' + key + '"]'
                                  )
                                + ',</li>';
                    } else {
                        html += '<li class = \'tree-close\' title=\''
                                + key
                                + '\'><a href=\'#' + (literal == '' ? key : literal).charAt(0).toUpperCase()
                                + (literal == '' ? key : literal).slice(1)
                                + '\'><strong>' + key + '</strong></a>:'
                                + buildDom(o[key], literal == '' ? key : literal)
                                + ',</li>';
                    }
                }
                //remove last comma
                return '<span class="operator">+</span><div class="group">'
                       +'{<ul class="' + type + '">'
                       + html.replace(/,<\/li>$/, '<\/li>')
                       + '</ul>}</div><div class="summary">Object</div>';
                break;
            case 'string':
                return '<span class="value ' + type + '">"'
                        + (/^https?\:(\/\/).*$/i.test(o)
                          ? '<a href="' + o + '" target="_blank">' + o + '</a>'
                          : htmlEncode(o) ) + '"</span>';
                break;
            default :
                return '<span class="value ' + type + '">' + o + '</span>';
        }
    }
 
    function bindEvents(tree) {
        tree.onclick = function(e) {
            e = e || window.event;
            var src = e.srcElement || e.target;
            if (src.className === 'operator') {
                if (src.parentNode.className == 'tree-close') {
                    src.parentNode.className = 'open';
                    src.innerHTML = '-';
                } else {
                    src.parentNode.className = 'tree-close';
                    src.innerHTML = '+';
                }
            }
            _resize();
        }
    }
}
 
var domConfig = document.getElementById('config');
var domToc = document.getElementById('toc');
domConfig.appendChild(new JsonTree(echartsConfig).getTree());
function _resize() {
    var viewHeight = document.documentElement.clientHeight;
    var scrollHeight = document.documentElement.scrollTop
                       || document.body.scrollTop;
    var offsetHeight = document.body.offsetHeight;
    var maxHeight;
    var footHole = offsetHeight - scrollHeight - viewHeight;
    if (footHole > 230) {
        // 未见footer,60 top、bottom, 40 per one
        maxHeight = viewHeight - 100 - 40 * 2;
    }
    else {
        // 见footer
        maxHeight = viewHeight - 350 - 40 * 2;
    }
    if (domConfig.scrollHeight > maxHeight) {
        domConfig.style.height = maxHeight + 'px';
    } else {
        domConfig.style.height = 'auto';
    }
    if (domToc.scrollHeight > maxHeight) {
        domToc.style.height = maxHeight + 'px';
    } else {
        domToc.style.height = 'auto';
    }
}
$(window).on('scroll', _resize);
$(window).on('resize', _resize);
_resize();