jsonFormater之应用
JS脚本:
function JsonFormater(opt) {
this.options = $.extend({
dom: '',//带有高亮、关键字颜色设置
baseDom:'', //基本格式节点
tabSize: 2,
singleTab: " ",
quoteKeys: true,
imgCollapsed: "img/Collapsed.gif",
imgExpanded: "img/Expanded.gif",
isCollapsible: true
}, opt || {});
this.isFormated = false;
this.obj = {
_dateObj: new Date(),
_regexpObj: new RegExp()
};
this.init();
}
JsonFormater.prototype = {
init: function () {
this.tab = this.multiplyString(this.options.tabSize, this.options.singleTab);
this.bindEvent();
},
// 基本格式转换-只读模式
baseFomat: function(txt,compress/*是否为压缩模式*/){/* 格式化JSON源码(对象转换为JSON文本) */
var indentChar = ' ';
if(/^\s*$/.test(txt)){
alert('数据为空,无法格式化! ');
return;
}
try{var data=eval('('+txt+')');}
catch(e){
alert('数据源语法错误,格式化失败! 错误信息: '+e.description,'err');
return;
};
var draw=[],last=false,This=this,line=compress?'':'\n',nodeCount=0,maxDepth=0;
var notify=function(name,value,isLast,indent/*缩进*/,formObj){
nodeCount++;/*节点计数*/
for (var i=0,tab='';i" + html + " ");
this.isFormated = true;
} catch (e) {
alert("JSON数据格式不正确:\n" + e.message);
$(this.options.dom).html("");
this.isFormated = false;
}
},
bindEvent: function () {
var that = this;
$(this.options.dom).off('click','.imgToggle');
$(this.options.dom).on('click', '.imgToggle', function () {
if (that.isFormated == false) {
return;
}
that.makeContentVisible($(this).parent().next(), !$(this).data('status'));
});
},
expandAll: function () {
if (this.isFormated == false) {
return;
}
var that = this;
this.traverseChildren($(this.options.dom), function(element){
if(element.hasClass('jf-collapsible')){
that.makeContentVisible(element, true);
}
}, 0);
},
collapseAll: function () {
if (this.isFormated == false) {
return;
}
var that = this;
this.traverseChildren($(this.options.dom), function(element){
if(element.hasClass('jf-collapsible')){
that.makeContentVisible(element, false);
}
}, 0);
},
collapseLevel: function(level){
if (this.isFormated == false) {
return;
}
var that = this;
this.traverseChildren($(this.options.dom), function(element, depth){
if(element.hasClass('jf-collapsible')){
if(depth >= level){
that.makeContentVisible(element, false);
}else{
that.makeContentVisible(element, true);
}
}
}, 0);
},
isArray: function (obj) {
return obj &&
typeof obj === 'object' &&
typeof obj.length === 'number' && !(obj.propertyIsEnumerable('length'));
},
getRow: function (indent, data, isPropertyContent) {
var tabs = "";
if (!isPropertyContent) {
tabs = this.multiplyString(indent, this.tab);
}
if (data != null && data.length > 0 && data.charAt(data.length - 1) != "\n") {
data = data + "\n";
}
return tabs + data;
},
formatLiteral: function (literal, quote, comma, indent, isArray, style) {
if (typeof literal == 'string') {
literal = literal.split("<").join("<").split(">").join(">");
}
var str = "" + quote + literal + quote + comma + "";
if (isArray) str = this.getRow(indent, str);
return str;
},
formatFunction: function (indent, obj) {
var tabs;
var i;
var funcStrArray = obj.toString().split("\n");
var str = "";
tabs = this.multiplyString(indent, this.tab);
for (i = 0; i < funcStrArray.length; i++) {
str += ((i == 0) ? "" : tabs) + funcStrArray[i] + "\n";
}
return str;
},
multiplyString: function (num, str) {
var result = '';
for (var i = 0; i < num; i++) {
result += str;
}
return result;
},
traverseChildren: function (element, func, depth) {
var length = element.children().length;
for (var i = 0; i < length; i++) {
this.traverseChildren(element.children().eq(i), func, depth + 1);
}
func(element, depth);
},
makeContentVisible : function(element, visible){
var img = element.prev().find('img');
if(visible){
element.show();
img.attr('src', this.options.imgExpanded);
img.data('status', 1);
}else{
element.hide();
img.attr('src', this.options.imgCollapsed);
img.data('status', 0);
}
},
ProcessObject: function (obj, indent, addComma, isArray, isPropertyContent) {
var html = "";
var comma = (addComma) ? ", " : "";
var type = typeof obj;
var clpsHtml = "";
var prop;
if (this.isArray(obj)) {
if (obj.length == 0) {
html += this.getRow(indent, "[ ]" + comma, isPropertyContent);
} else {
clpsHtml = this.options.isCollapsible ? "