/** * content_scripts中如果被检测到当前页面内容为json数据,则自动进行JSON格式化 */ baidu.csJsonFormat = (function(){ "use strict"; var _htmlFragment = [ '
' ].join(''); var _loadCss = function(){ var fcpCss = chrome.extension.getURL('static/css/fe-jsonformat.css'); jQuery('').appendTo('head'); }; var _format = function(){ var source ; if($('body').children().length == 1) { source = $.trim($('body>pre').html()) ; } if(!source) { source = $.trim($('body').html()) } if(!source) { return; } // JSONP形式下的callback name var funcName = null; // json对象 var jsonObj = null; // 下面校验给定字符串是否为一个合法的json try{ jsonObj = new Function("return " + source)(); // 还要防止下面这种情况: "{\"ret\":\"0\", \"msg\":\"ok\"}" if(typeof jsonObj == "string") { // 再来一次 jsonObj = new Function("return " + jsonObj)(); } }catch(ex){ // 如果body的内容还包含HTML标签,肯定不是合法的json了 var nodes = document.body.childNodes; for(var i = 0,len = nodes.length;i < len;i++) { if(nodes.nodeType != Node.TEXT_NODE) { return; } } // 再看看是不是jsonp的格式 var reg=/^([\w\.]+)\(\s*([\s\S]*)\s*\)$/igm; var matches = reg.exec(source); if(matches == null) { return; } funcName = matches[1]; source = matches[2]; try{ jsonObj = new Function("return " + source)(); }catch(e){ return; } } // 是json格式,可以进行JSON自动格式化 if(typeof jsonObj == "object") { try{ // 要尽量保证格式化的东西一定是一个json,所以需要把内容进行JSON.stringify处理 source = JSON.stringify(jsonObj); }catch(ex){ // 通过JSON反解不出来的,一定有问题 return; } $('body').html(_htmlFragment); _loadCss(); JsonFormatEntrance.clear(); JsonFormatEntrance.format(source); // 如果是JSONP格式的,需要把方法名也显示出来 if(funcName != null) { $('#jfCallbackName_start').html(funcName + '('); $('#jfCallbackName_end').html(')'); } // 允许禁用 $('#makeAutoJsonFormatOff').click(function(e){ baidu.feOption.setOptions({ "opt_item_autojson" : 'false' }); alert("以后可以从FeHelper的选项页面中重新开启"); window.location.reload(true); }); } }; var _init = function(){ $(function(){ baidu.feOption.getOptions(["opt_item_autojson"],function(opts){ if(opts["opt_item_autojson"] != 'false') { _format(); } }); }); }; return { init : _init }; })(); baidu.csJsonFormat.init();