149 lines
5.4 KiB
JavaScript
149 lines
5.4 KiB
JavaScript
|
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();
|