fcp-main.js 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901
  1. /**
  2. * 注册命名空间
  3. */
  4. baidu.namespace.register("baidu.fcphelper");
  5. baidu.fcphelper = (function(){
  6. /**
  7. * 创建一个Accordion
  8. * @param {Object} data
  9. */
  10. var _creatResultItem = function(data){
  11. return '\
  12. <h3 class="rst-title">\
  13. <a href="#">' + data.title + ':\
  14. <span class="rst-count">' + data.count + '</span>\
  15. </a>\
  16. </h3>\
  17. <div class="rst-content">' + data.content + '</div>\
  18. ';
  19. };
  20. /**
  21. * 获取message.json中定义的相关问题以及建议
  22. * @param {Object} perfix
  23. * @param {Object} start
  24. * @param {Object} end
  25. */
  26. var _get_issue_suggestion = function(perfix,start,end){
  27. var tempArr = [];
  28. var tempInt = 0;
  29. tempArr.push('<table>');
  30. tempArr.push('<thead><tr>'+
  31. '<td>序号(Num)</td>'+
  32. '<td class="td-content-title">&nbsp;</td>'+
  33. '<td class="td-content-content">描述(Description)</td>' +
  34. '</tr></thead><tbody>');
  35. var addTr = function(_t_title,_t_content) {
  36. var _cls = tempInt % 2 == 0 ? 'tr-content-even' : '';
  37. tempArr.push('<tr class="' + _cls + '"><th class="td-linenum" rowspan="2">' + (++tempInt) + '</th>' +
  38. '<td class="td-content-title"><span class="-x-issue">问题</span></td>' +
  39. '<td class="td-content-content -c-x-issue">' + _t_title + '</td></tr>');
  40. tempArr.push('<tr class="' + _cls + '">' +
  41. '<td class="td-content-title"><span class="-x-suggestion">建议</span></td>' +
  42. '<td class="td-content-content">' + _t_content + '</td></tr>');
  43. };
  44. var key;
  45. for(var i = start;i <= end;i++) {
  46. key = ('0000' + i);
  47. key = perfix + '_' + key.substr(key.length - 4);
  48. addTr(baidu.i18n.getMessage(key),baidu.i18n.getMessage(key + '_suggestion'));
  49. }
  50. tempArr.push('</tbody></table>');
  51. return tempArr.join('');
  52. };
  53. /**
  54. * 显示页面上有效的cookie
  55. * @param {Object} respData
  56. * @param {Object} title
  57. * @param {Object} allContent
  58. */
  59. var _js_getCookie = function(respData,title,allContent) {
  60. var tempArr = [];
  61. var tempInt = 0;
  62. tempArr.push('<div>' + baidu.i18n.getMessage('msg0042',[document.cookie.getBytes()]) + '。如下是和整个站点相关的cookie:</div><br />');
  63. tempArr.push('<table>');
  64. tempArr.push('<thead><tr>'+
  65. '<td>序号</td>'+
  66. '<td class="td-cookie-name">名称(name)</td>' +
  67. '<td class="td-cookie-value">值(value)</td>' +
  68. '<td class="td-cookie-domain">所在域(domain)</td>' +
  69. '<td class="td-cookie-expires">过期时间(expires)</td>' +
  70. '<td class="td-cookie-op">操作</td>' +
  71. '</tr></thead><tbody>');
  72. var d = new Date() - 1;
  73. jQuery.each(respData.cookies,function(i,cookie){
  74. tempInt++;
  75. tempArr.push('<tr>'+
  76. '<td class="td-cookie-linenum">' + (i+1) + '</td>'+
  77. '<td class="td-cookie-name">' + cookie.name + '</td>' +
  78. '<td class="td-cookie-value" id="td-cookie-value-"' + cookie.name + '>' + cookie.value + '</td>' +
  79. '<td class="td-cookie-domain">' + cookie.domain + '</td>' +
  80. '<td class="td-cookie-expires">' + ( cookie.expirationDate ? new Date(cookie.expirationDate * 1000).format('yyyy年MM月dd日 HH时mm分ss秒') : '-') + '</td>' +
  81. '<td class="td-cookie-op">' +
  82. '<button class="fe-a-cookie-delete -f-a-c-d-' + d + ' ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"><span class="ui-button-text">删除</span></button>' +
  83. '<input type="hidden" id="hid-url-' + cookie.name + '" value="' + cookie.url + '" />' +
  84. '<input type="hidden" id="hid-domain-' + cookie.name + '" value="' + cookie.domain + '" />' +
  85. '<input type="hidden" id="hid-storeId-' + cookie.name + '" value="' + cookie.storeId + '" />' +
  86. '<input type="hidden" id="hid-expires-' + cookie.name + '" value="' + (cookie.expirationDate ? cookie.expirationDate : '') + '" />' +
  87. '</td>' +
  88. '</tr>');
  89. });
  90. tempArr.push('</tbody></table>');
  91. allContent.push(_creatResultItem({
  92. title : title,
  93. count : tempInt,
  94. content : tempArr.join('')
  95. }));
  96. //-------------------------------------------
  97. jQuery('#fe-helper-box .-f-a-c-d-' + d).live('click',function(e){
  98. var $this = jQuery(this);
  99. var $tr = $this.parent().parent();
  100. var key = $tr.children('.td-cookie-name').html().trim();
  101. var storeId = jQuery('#hid-storeId-' + key).val().trim();
  102. //remove cookie
  103. chrome.extension.sendMessage({
  104. "type" : MSG_TYPE.REMOVE_COOKIE,
  105. "name" : key,
  106. "url" : jQuery('#hid-url-' + key).val().trim(),
  107. "storeId" : storeId
  108. },function(cookie){
  109. var $table = $this.parent().parent().parent();
  110. var idx = $table.index($tr) - 1;
  111. var x = 0;
  112. $tr.remove();
  113. //更改序号
  114. $table.find('td.td-cookie-linenum').each(function(i,td){
  115. jQuery(td).html((i + 1));
  116. x++;
  117. });
  118. //总数
  119. $table.parent().parent().prev().find('.rst-count').html(x);
  120. });
  121. });
  122. };
  123. /**
  124. * 显示页面上的script标签
  125. * @param {Object} respData
  126. * @param {Object} title
  127. * @param {Object} allContent
  128. */
  129. var _js_getScriptTag = function(respData,title,allContent) {
  130. var tempArr = [];
  131. var tempInt = 0;
  132. tempArr.push('<table>');
  133. tempArr.push('<thead><tr>'+
  134. '<td>序号(Num)</td>'+
  135. '<td class="td-content">描述(Description)</td>' +
  136. '</tr></thead><tbody>');
  137. var addTr = function(_content){
  138. tempArr.push('<tr>'+
  139. '<th class="td-linenum">' + ++tempInt + '</th>'+
  140. '<td class="td-content">' + _content + '</td></tr>');
  141. };
  142. //script block
  143. if(respData.scriptTag.scriptBlock) {
  144. addTr(baidu.i18n.getMessage('msg0033',[respData.scriptTag.scriptBlock]));
  145. }
  146. //script src
  147. if(respData.scriptTag.scriptSrc) {
  148. addTr(baidu.i18n.getMessage('msg0034',[respData.scriptTag.scriptSrc]));
  149. }
  150. //JS文件被压缩?
  151. if(respData.jsMinified.count > 0) {
  152. var t = [];
  153. jQuery.each(respData.jsMinified.files,function(k,item){
  154. if(item.href == '#') {
  155. t.push(baidu.i18n.getMessage('msg0047',[item.fileName]));
  156. } else {
  157. t.push(baidu.i18n.getMessage('msg0062',[item.href,item.fileName]));
  158. }
  159. });
  160. addTr(baidu.i18n.getMessage('msg0045',[t.join('、')]));
  161. }
  162. //tangram
  163. if(respData.tangram.length > 0) {
  164. var t = [];
  165. jQuery.each(respData.tangram,function(i,item){
  166. t.push(item);
  167. });
  168. if(t.length == 1) {
  169. addTr(baidu.i18n.getMessage('msg0054',[t.join('')]));
  170. } else {
  171. addTr(baidu.i18n.getMessage('msg0055',[t.join('、')]));
  172. }
  173. }
  174. //重复引入的文件
  175. if(respData.duplicatedFiles.length) {
  176. var dupFile = [];
  177. var dupHref = [];
  178. var txt = [];
  179. jQuery.each(respData.duplicatedFiles,function(i,item){
  180. if(item.dupFiles) { //不同地址的文件,但内容重复
  181. var t = [];
  182. jQuery.each(item.dupFiles,function(j,f){
  183. t.push(baidu.i18n.getMessage('msg0069',[f,f]));
  184. });
  185. dupFile.push(baidu.i18n.getMessage('msg0070',[t.join('、')]));
  186. } else { //同一个地址的文件,被多次引入
  187. dupHref.push(baidu.i18n.getMessage('msg0068',[item.href,item.href,item.count]));
  188. }
  189. });
  190. if(dupHref.length) {
  191. txt.push(baidu.i18n.getMessage('msg0066',['<div style="margin-left:30px;">' + dupHref.join('') + '</div>']));
  192. }
  193. if(dupFile.length) {
  194. txt.push(baidu.i18n.getMessage('msg0067',['<div style="margin-left:30px;">' + dupFile.join('') + '</div>']));
  195. }
  196. addTr(txt.join(''));
  197. }
  198. tempArr.push('</tbody></table>');
  199. allContent.push(_creatResultItem({
  200. title : title,
  201. count : tempInt,
  202. content : tempArr.join('')
  203. }));
  204. };
  205. /**
  206. * 显示过期标签的检测结果
  207. * @param {Object} respData
  208. * @param {Object} title
  209. * @param {Object} allContent
  210. */
  211. var _html_getHTMLDeprecatedTag = function(respData,title,allContent) {
  212. var isEmpty = true;
  213. for(var k in respData.HTMLBase.HTMLDeprecatedTag) {
  214. isEmpty = false;
  215. break;
  216. }
  217. if(isEmpty) {
  218. return;
  219. }
  220. var tempArr = [];
  221. var tempInt = 0;
  222. tempArr.push('<table>');
  223. tempArr.push('<thead><tr>'+
  224. '<td>标签(Tag)</td>'+
  225. '<td class="td-content">描述(Description)</td>' +
  226. '</tr></thead><tbody>');
  227. jQuery.each(respData.HTMLBase.HTMLDeprecatedTag,function(key,item){
  228. tempInt++;
  229. tempArr.push('<tr>'+
  230. '<th class="td-linenum">' + key + '</th>'+
  231. '<td class="td-content">' +
  232. baidu.i18n.getMessage('msg0004',[item]) +
  233. baidu.i18n.getMessage('msg0005') + '</td></tr>');
  234. });
  235. tempArr.push('</tbody></table>');
  236. allContent.push(_creatResultItem({
  237. title : title,
  238. count : tempInt,
  239. content : tempArr.join('')
  240. }));
  241. };
  242. /**
  243. * 显示过期的属性
  244. * @param {Object} HTMLDeprecatedAttributes
  245. * @param {Object} title
  246. * @param {Object} allContent
  247. */
  248. var _html_getHTMLDeprecatedAttribute = function(respData,title,allContent){
  249. var isEmpty = true;
  250. for(var k in respData.HTMLBase.HTMLDeprecatedAttribute) {
  251. isEmpty = false;
  252. break;
  253. }
  254. if(isEmpty) {
  255. return;
  256. }
  257. var tempArr = [];
  258. var tempInt = 0;
  259. tempArr.push('<table>');
  260. tempArr.push('<thead><tr>'+
  261. '<td>属性(Attr)</td>'+
  262. '<td class="td-content">描述(Description)</td>' +
  263. '</tr></thead><tbody>');
  264. jQuery.each(respData.HTMLBase.HTMLDeprecatedAttribute,function(key,item){
  265. tempInt++;
  266. tempArr.push('<tr>' +
  267. '<th class="td-linenum">' + key + '</th>' +
  268. '<td class="td-content"><span class="x-detail">' +
  269. (function(){
  270. var arr = [];
  271. jQuery.each(item,function(k,v){
  272. arr.push(baidu.i18n.getMessage('msg0007',[ v,k ]));
  273. });
  274. return arr.join('');
  275. })() + baidu.i18n.getMessage('msg0005') + '</span></td></tr>');
  276. });
  277. tempArr.push('</tbody></table>');
  278. allContent.push(_creatResultItem({
  279. title : title,
  280. count : tempInt,
  281. content : tempArr.join('')
  282. }));
  283. };
  284. /**
  285. * 获取Link标签的解析结果
  286. * @param {Object} respData
  287. * @param {Object} title
  288. * @param {Object} allContent
  289. */
  290. var _html_getLink = function(respData,title,allContent){
  291. var notInHead = respData.LINK.notInHead;
  292. if(notInHead.length == 0) return;
  293. var ct = '';
  294. ct = '<div>' + baidu.i18n.getMessage('msg0021',[notInHead.length,
  295. 'head']) + '</div>';
  296. ct += (function(d){
  297. var arr = ['<table>'];
  298. arr.push('<thead><tr>'+
  299. '<td>序号(Num)</td>'+
  300. '<td class="td-content">描述(Description)</td>' +
  301. '</tr></thead><tbody>');
  302. if(notInHead.length) {
  303. jQuery.each(d,function(i,link){
  304. arr.push('<tr>\
  305. <th class="td-linenum">' + (i + 1) + '</th>\
  306. <td class="td-content">' + link.outerHTML.replace(/</g,'&lt;').replace(/>/g,'&gt;') + '</td>\
  307. </tr>');
  308. });
  309. }
  310. arr.push('</tbody></table>');
  311. return arr.join('');
  312. })(notInHead);
  313. allContent.push(_creatResultItem({
  314. title : title,
  315. count : notInHead.length,
  316. content : ct
  317. }));
  318. };
  319. /**
  320. * 获取标签包含关系
  321. * @param {Object} respData
  322. * @param {Object} title
  323. * @param {Object} allContent
  324. */
  325. var _html_getTagIncludeCase = function(respData,title,allContent){
  326. if(respData.tagInclude.length == 0) return;
  327. var ct = '';
  328. ct += (function(d){
  329. var arr = ['<table>'];
  330. arr.push('<thead><tr>'+
  331. '<td>序号(Num)</td>'+
  332. '<td class="td-content">描述(Description)</td>' +
  333. '</tr></thead><tbody>');
  334. if(respData.tagInclude.length > 0) {
  335. jQuery.each(d,function(id,v){
  336. arr.push('<tr>\
  337. <th class="td-linenum">' + (id + 1) + '</th>\
  338. <td class="td-content">' + baidu.i18n.getMessage('msg0035',[v.inline,v.block]) + '</td>\
  339. </tr>');
  340. });
  341. }
  342. arr.push('</tbody></table>');
  343. return arr.join('');
  344. })(respData.tagInclude);
  345. allContent.push(_creatResultItem({
  346. title : title,
  347. count : respData.tagInclude.length,
  348. content : ct
  349. }));
  350. };
  351. /**
  352. * DocumentMode
  353. * @param {Object} respData
  354. */
  355. var _html_getDocMode = function(respData){
  356. var tempArr = [];
  357. var quirksMode = '<strong>混杂模式</strong>';
  358. var standardsMode = '<em>标准模式</em>';
  359. var mode = (respData.documentMode.WebKit == 'S') ? standardsMode : quirksMode;
  360. if (respData.documentMode.hasDocType) {
  361. tempArr.push(baidu.i18n.getMessage('msg0009'));
  362. if (respData.documentMode.isUnusualDocType) {
  363. tempArr.push(baidu.i18n.getMessage('msg0010',[mode,quirksMode]));
  364. }
  365. if (respData.documentMode.hasConditionalCommentBeforeDTD ||
  366. respData.documentMode.hasCommentBeforeDTD) {
  367. tempArr.push(baidu.i18n.getMessage('msg0011',[mode,quirksMode]));
  368. }
  369. if (respData.documentMode.IE == respData.documentMode.WebKit) {
  370. tempArr.push(baidu.i18n.getMessage('msg0012',[mode]));
  371. if (respData.documentMode.WebKit == 'Q') {
  372. tempArr.push(baidu.i18n.getMessage('msg0013'));
  373. }
  374. } else {
  375. if (!respData.documentMode.isUnusualDocType) {
  376. if (respData.documentMode.IE) {
  377. var $1 = (respData.documentMode.IE == 'Q') ? quirksMode : standardsMode;
  378. var $2 = (respData.documentMode.WebKit == 'Q') ? quirksMode : standardsMode;
  379. tempArr.push(baidu.i18n.getMessage('msg0014',[$1,$2]));
  380. tempArr.push(baidu.i18n.getMessage('msg0013'));
  381. } else {
  382. tempArr.push(baidu.i18n.getMessage('msg0015'));
  383. }
  384. } else {
  385. tempArr.push(baidu.i18n.getMessage('msg0013'));
  386. }
  387. }
  388. } else {
  389. // 没有设置DTD
  390. tempArr.push(baidu.i18n.getMessage('msg0016',[mode]));
  391. tempArr.push(baidu.i18n.getMessage('msg0013'));
  392. }
  393. return tempArr.join('');
  394. };
  395. /**
  396. * 获取DOM解析的结果
  397. * @param {Object} respData
  398. * @param {Object} title
  399. * @param {Object} allContent
  400. */
  401. var _html_getDom = function(respData,title,allContent) {
  402. var tempArr = [];
  403. var tempInt = 0;
  404. tempArr.push('<table>');
  405. tempArr.push('<thead><tr>'+
  406. '<td>序号(Num)</td>'+
  407. '<td class="td-content">描述(Description)</td>' +
  408. '</tr></thead><tbody>');
  409. var addTr = function(text) {
  410. tempArr.push('<tr><th class="td-linenum">' + (++tempInt) + '</th>' +
  411. '<td class="td-content">' + text + '</td></tr>');
  412. };
  413. //doctype
  414. addTr(_html_getDocMode(respData));
  415. //总数量
  416. addTr(baidu.i18n.getMessage('msg0028',[respData.DOM.count]));
  417. //dom节点的最大嵌套深度
  418. addTr(baidu.i18n.getMessage('msg0063',[respData.DOM.maxDepth.depth,respData.DOM.maxDepth.xpath]));
  419. //title标签检测
  420. if(respData.title.length == 0) {
  421. addTr(baidu.i18n.getMessage('msg0049') + baidu.i18n.getMessage('msg0052'));
  422. } else if(respData.title.length > 1) {
  423. addTr(baidu.i18n.getMessage('msg0051') + baidu.i18n.getMessage('msg0052'));
  424. } else if(!respData.title[0].isInHead){
  425. addTr(baidu.i18n.getMessage('msg0050') + baidu.i18n.getMessage('msg0052'));
  426. }
  427. //img标签的src=''
  428. if(respData.imgTag.length > 0) {
  429. var t = '';
  430. jQuery.each(respData.imgTag,function(i,k){
  431. t = '';
  432. t += k.id ? '#' + k.id : '';
  433. t += t.className ? '.' + t.className.replace(/\s+/g,'.') : '';
  434. t = t ? t : k.outerHTML.replace(/</g,'&lt;').replace(/>/g,'&gt;');
  435. addTr(baidu.i18n.getMessage('msg0053',[t]));
  436. });
  437. }
  438. //所有注释数量
  439. if(respData.DOM.allComm.length) {
  440. //IE条件注释
  441. if (respData.DOM.IECondComm.length) {
  442. addTr(baidu.i18n.getMessage('msg0018',[respData.DOM.IECondComm.length]));
  443. }
  444. //Firefox中不支持的注释:不能出现‘--’
  445. if (respData.DOM.FFNotSptComm.length) {
  446. addTr(baidu.i18n.getMessage('msg0060',[respData.DOM.FFNotSptComm.length]));
  447. }
  448. //所有注释
  449. addTr(baidu.i18n.getMessage('msg0030',[respData.DOM.allComm.length,respData.DOM.allComm.join('').getBytes()]) + baidu.i18n.getMessage('msg0019'));
  450. }
  451. //重复性的ID
  452. if(respData.ID.count) {
  453. var id_arr = [];
  454. jQuery.each(respData.ID.ids,function(id,v){
  455. id_arr.push(baidu.i18n.getMessage('msg0064',[id,v]));
  456. });
  457. addTr(baidu.i18n.getMessage('msg0026',[respData.ID.count,id_arr.join(',')]));
  458. }
  459. //问题Input
  460. if(respData.DOM.invalidInput.count) {
  461. addTr(baidu.i18n.getMessage('msg0029',[respData.DOM.invalidInput.count]));
  462. }
  463. //HTML是否压缩
  464. if(!respData.htmlMinified) {
  465. addTr(baidu.i18n.getMessage('msg0043'));
  466. }
  467. //未闭合的标签
  468. if(respData.unClosedTags.length > 0) {
  469. var t = [];
  470. jQuery.each(respData.unClosedTags,function(k,item){
  471. t.push(baidu.i18n.getMessage('msg0046',[item]));
  472. });
  473. addTr(baidu.i18n.getMessage('msg0038',[t.join('、')]));
  474. }
  475. tempArr.push('</tbody></table>');
  476. allContent.push(_creatResultItem({
  477. title : title,
  478. count : tempInt,
  479. content : tempArr.join('')
  480. }));
  481. };
  482. /**
  483. * 检测CSS的使用情况
  484. * @param {Object} respData
  485. * @param {Object} title
  486. * @param {Object} allContent
  487. */
  488. var _css_getCssUsage = function(respData){
  489. var _cssTitles = [
  490. baidu.i18n.getMessage('msg0039'),
  491. baidu.i18n.getMessage('msg0040'),
  492. baidu.i18n.getMessage('msg0041')
  493. ];
  494. var _getCssTable = function(d){
  495. var arr = ['<table>'];
  496. arr.push('<thead><tr>'+
  497. '<td>序号(Num)</td>'+
  498. '<td class="td-content">选择器(CSS Selector)</td>' +
  499. '</tr></thead><tbody>');
  500. jQuery.each(d,function(i,item){
  501. arr.push('<tr>' +
  502. '<th class="td-linenum">' + (i + 1) + '</th>' +
  503. '<td class="td-content">' +
  504. '<span class="x-selector">' + item.selector + '</span>' +
  505. '<span class="x-css-text">' + item.cssText + '</span>' +
  506. '</td>' +
  507. '</tr>');
  508. });
  509. arr.push('</tbody></table>');
  510. return arr.join('');
  511. };
  512. //style标签内的css检测、link引入的css检测
  513. jQuery.each(respData.styles,function(i,style){
  514. var allContent = [];
  515. jQuery.each(style.content,function(j,v){
  516. allContent.push(_creatResultItem({
  517. title : _cssTitles[j],
  518. count : v.count,
  519. content : _getCssTable(v.content)
  520. }));
  521. });
  522. //创建tab
  523. baidu.fcptabs.addCssTab( style.path, allContent.join('') );
  524. });
  525. };
  526. /**
  527. * 汇总css文件中用到的所有背景图片
  528. * @param {Object} respData
  529. */
  530. var _css_getBackgroundImages = function(respData,allContent){
  531. var tempArr = [];
  532. var lineNum = 0;
  533. var tempInt = 0;
  534. tempArr.push('<table>');
  535. tempArr.push('<thead><tr>'+
  536. '<td>序号(Num)</td>'+
  537. '<td class="td-content">描述(Description)</td>' +
  538. '</tr></thead><tbody>');
  539. var addTr = function(text) {
  540. tempArr.push('<tr><th class="td-linenum">' + (++lineNum) + '</th>' +
  541. '<td class="td-content">' + text + '</td></tr>');
  542. };
  543. //CSS背景图片的使用情况
  544. if(respData.backgroundImages.length) {
  545. var a = [];
  546. var d = new Date() - 1;
  547. jQuery.each(respData.backgroundImages,function(i,item){
  548. a = ['<div class="table-css-bg -t-c-b-' + d + '" style="display:none;">'];
  549. jQuery.each(item.bgImages,function(j,b){
  550. a.push('<div>' + b + '</div>');
  551. });
  552. a.push('</div>');
  553. addTr(baidu.i18n.getMessage('msg0057',[item.fileName,item.bgImages.length,d]) + a.join(''));
  554. tempInt += item.bgImages.length;
  555. });
  556. jQuery('#fe-helper-box .-x-expand-' + d).live('click',function(){
  557. var _this = jQuery(this);
  558. var _table = _this.parent().next();
  559. if(_table.css('display') == 'none') {
  560. _table.slideDown(300);
  561. _this.html('收起');
  562. } else {
  563. _table.slideUp(300);
  564. _this.html('展开');
  565. }
  566. });
  567. jQuery('#fe-helper-box .-t-c-b-' + d + ' div').live('mouseover',function(e){
  568. var imgTooltip = jQuery('#fe-img-tootip');
  569. if(!imgTooltip[0]) {
  570. imgTooltip = jQuery('<img id="fe-img-tootip" src="' + jQuery(this).html().trim() + '" alt="load image failed" />').appendTo('body');
  571. } else {
  572. imgTooltip.attr('src',jQuery(this).html().trim());
  573. }
  574. imgTooltip.css({
  575. top : e.pageY + 20,
  576. left : e.pageX + 20,
  577. 'max-width' : 500,
  578. 'max-height' : 500
  579. }).show();
  580. }).live('mouseout',function(e){
  581. var imgTooltip = jQuery('#fe-img-tootip');
  582. imgTooltip.hide();
  583. })
  584. }
  585. tempArr.push('</tbody></table>');
  586. allContent.push(_creatResultItem({
  587. title : baidu.i18n.getMessage('msg0065'),
  588. count : tempInt,
  589. content : tempArr.join('')
  590. }));
  591. };
  592. /**
  593. * css检测结果汇总
  594. * @param {Object} respData
  595. */
  596. var _css_totalDetectResult = function(respData){
  597. var tempArr = [];
  598. var tempInt = 0;
  599. var allContent = [];
  600. tempArr.push('<table>');
  601. tempArr.push('<thead><tr>'+
  602. '<td>序号(Num)</td>'+
  603. '<td class="td-content">描述(Description)</td>' +
  604. '</tr></thead><tbody>');
  605. var addTr = function(text) {
  606. tempArr.push('<tr><th class="td-linenum">' + (++tempInt) + '</th>' +
  607. '<td class="td-content">' + text + '</td></tr>');
  608. };
  609. //重复引入的文件
  610. if(respData.duplicatedFiles.length) {
  611. var dupFile = [];
  612. var dupHref = [];
  613. var txt = [];
  614. jQuery.each(respData.duplicatedFiles,function(i,item){
  615. if(item.dupFiles) { //不同地址的文件,但内容重复
  616. var t = [];
  617. jQuery.each(item.dupFiles,function(j,f){
  618. t.push(baidu.i18n.getMessage('msg0069',[f,f]));
  619. });
  620. dupFile.push(baidu.i18n.getMessage('msg0070',[t.join('、')]));
  621. } else { //同一个地址的文件,被多次引入
  622. dupHref.push(baidu.i18n.getMessage('msg0068',[item.href,item.href,item.count]));
  623. }
  624. });
  625. if(dupHref.length) {
  626. txt.push(baidu.i18n.getMessage('msg0066',['<div style="margin-left:30px;">' + dupHref.join('') + '</div>']));
  627. }
  628. if(dupFile.length) {
  629. txt.push(baidu.i18n.getMessage('msg0067',['<div style="margin-left:30px;">' + dupFile.join('') + '</div>']));
  630. }
  631. addTr(txt.join(''));
  632. }
  633. //CSS文件压缩
  634. if(respData.cssMinified.count > 0) {
  635. var t = [];
  636. jQuery.each(respData.cssMinified.files,function(k,item){
  637. if(item.href == '#') {
  638. t.push(baidu.i18n.getMessage('msg0047',[item.fileName]));
  639. } else {
  640. t.push(baidu.i18n.getMessage('msg0062',[item.href,item.fileName]));
  641. }
  642. });
  643. addTr(baidu.i18n.getMessage('msg0044',[t.join('、')]));
  644. }
  645. //css expression
  646. if(respData.expressions.length) {
  647. var a = [],t = 0;
  648. jQuery.each(respData.expressions,function(i,item){
  649. a.push(baidu.i18n.getMessage('msg0059',[item.fileName,item.count]));
  650. t += item.count;
  651. });
  652. addTr(baidu.i18n.getMessage('msg0058',[t,a.join('、')]));
  653. }
  654. tempArr.push('</tbody></table>');
  655. allContent.push(_creatResultItem({
  656. title : baidu.i18n.getMessage('msg0048'),
  657. count : tempInt,
  658. content : tempArr.join('')
  659. }));
  660. //背景图片
  661. _css_getBackgroundImages(respData,allContent);
  662. //创建tab
  663. baidu.fcptabs.addCssTab( baidu.i18n.getMessage('msg0048'), allContent.join('') );
  664. };
  665. /**
  666. * HTML侦测,通过调用baidu.html.detect方法进行
  667. */
  668. var _detectHTML = function(){
  669. baidu.html.detect(function(respData){
  670. var content = [];
  671. //html.HTMLDeprecatedTag
  672. _html_getHTMLDeprecatedTag(respData,baidu.i18n.getMessage('msg0006'),content);
  673. //html.HTMLDeprecatedAttribute
  674. _html_getHTMLDeprecatedAttribute(respData,baidu.i18n.getMessage('msg0008'),content);
  675. //LINK
  676. _html_getLink(respData,baidu.i18n.getMessage('msg0022'),content);
  677. //获取标签包含关系
  678. _html_getTagIncludeCase(respData,baidu.i18n.getMessage('msg0036'),content);
  679. //其他DOM相关处理
  680. _html_getDom(respData,baidu.i18n.getMessage('msg0020'),content);
  681. //创建tab
  682. baidu.fcptabs.addHtmlTab(content.join(''));
  683. });
  684. };
  685. /**
  686. * CSS侦测,通过调用baidu.css.detect方法进行
  687. */
  688. var _detectCSS = function(){
  689. baidu.css.detect(function(respData){
  690. //执行检测并查创建tab
  691. _css_getCssUsage(respData);
  692. //所有检测结果
  693. _css_totalDetectResult(respData);
  694. });
  695. };
  696. /**
  697. * Javascript侦测,通过调用baidu.js.detect方法进行
  698. */
  699. var _detectJavascript = function(){
  700. baidu.js.detect(function(respData){
  701. var allContent = [];
  702. //cookies
  703. _js_getCookie(respData,baidu.i18n.getMessage('msg0031'),allContent);
  704. //script相关检测
  705. _js_getScriptTag(respData,baidu.i18n.getMessage('msg0032'),allContent);
  706. //创建tab
  707. baidu.fcptabs.addJavascriptTab(allContent.join(''));
  708. });
  709. };
  710. /**
  711. * 增加HTML、CSS、Javascript的问题及建议tab
  712. */
  713. var _addIssueSuggestionTab = function(){
  714. var _getBtnString = function(_text){
  715. return '<a class="-f-h-get-more-" href="#" onclick="return false;">' + _text + '&gt;&gt;</a>';
  716. };
  717. //HTML问题及建议
  718. jQuery(_getBtnString('查看更多HTML帮助')).appendTo('#fe-helper-tab-html').click(function(e){
  719. if(!jQuery('#fe-helper-tab-HTML-issue-sug')[0]){
  720. baidu.fcptabs.addIssueSuggestionTab('HTML',_get_issue_suggestion('html',1,42));
  721. }
  722. var $allTabs = jQuery( "#fe-helper-main-tab>div");
  723. var index = $allTabs.index( jQuery( '#fe-helper-tab-HTML-issue-sug' ) );
  724. jQuery('#fe-helper-main-tab').tabs( "select" , index );
  725. });
  726. //CSS问题及建议
  727. jQuery(_getBtnString('查看更多CSS帮助')).appendTo('#fe-helper-tab-css').click(function(e){
  728. if(!jQuery('#fe-helper-tab-CSS-issue-sug')[0]){
  729. baidu.fcptabs.addIssueSuggestionTab('CSS',_get_issue_suggestion('css',1,119));
  730. }
  731. var $allTabs = jQuery( "#fe-helper-main-tab>div");
  732. var index = $allTabs.index( jQuery( '#fe-helper-tab-CSS-issue-sug' ) );
  733. jQuery('#fe-helper-main-tab').tabs( "select" , index );
  734. });
  735. //Javascript问题及建议
  736. jQuery(_getBtnString('查看更多Javascript帮助')).appendTo('#fe-helper-tab-js').click(function(e){
  737. if(!jQuery('#fe-helper-tab-Javascript-issue-sug')[0]){
  738. baidu.fcptabs.addIssueSuggestionTab('Javascript',_get_issue_suggestion('javascript',1,114));
  739. }
  740. var $allTabs = jQuery( "#fe-helper-main-tab>div");
  741. var index = $allTabs.index( jQuery( '#fe-helper-tab-Javascript-issue-sug' ) );
  742. jQuery('#fe-helper-main-tab').tabs( "select" , index );
  743. });
  744. };
  745. /**
  746. * 初始化静态文件
  747. */
  748. var _initStaticFile = function(){
  749. //////////先做一些准备工作/////////////////////
  750. //css初始化
  751. baidu.css.init();
  752. //js初始化
  753. baidu.js.init();
  754. };
  755. /**
  756. * 初始化页面
  757. * @return {[type]}
  758. */
  759. var _initHtml = function(callback){
  760. //html初始化
  761. baidu.html.init(callback);
  762. };
  763. /**
  764. * 执行FCPHelper检测
  765. */
  766. var _detect = function(){
  767. //显示进度条
  768. baidu.fcptabs.createProgressBar();
  769. window.setTimeout(function(){
  770. //HTML侦测
  771. _detectHTML();
  772. //CSS侦测
  773. _detectCSS();
  774. //Javascript侦测
  775. _detectJavascript();
  776. //增加问题及建议Tab
  777. _addIssueSuggestionTab();
  778. //检测完毕更新进度条
  779. baidu.fcptabs.updateProgressBar(100);
  780. },100);
  781. };
  782. return {
  783. initStaticFile : _initStaticFile,
  784. initHtml : _initHtml,
  785. detect : _detect
  786. };
  787. })();