首页 > 语言 > JavaScript > 正文

Javascript代码实现仿实例化类

2024-05-06 16:18:17
字体:
来源:转载
供稿:网友

这篇文章主要介绍了Javascript代码实现仿实例化类的相关资料并附上示例,非常不错的文章,需要的朋友可以参考下

Javascript能做的事情越发的多了起来,随之而来的问题即是Js代码量的增加,面对代码的加多,我选择了仿面向对像类实例化里的构造函数自动启动的方式,把所有的js代码,以注册的形式,类化了起来。

代码

 

 
  1. /** 
  2. * @version $Id$ 
  3. * @author xjiujiu <xjiujiu@foxmail.com> 
  4. * @description HHJsLib Framework Apps 
  5. * @copyright Copyright (c) 2011-2012 http://www.xjiujiu.com.All right reserved 
  6. */ 
  7.  
  8. HHJsLib.register({ 
  9. init: function() { 
  10. this.bindPreviewBtn(); 
  11. this.bindUploadEleImageBtn(); 
  12. this.bindUploadEleAudioBtn('a.audio-upload-btn'); 
  13. this.bindUploadEleVideoBtn('a.video-upload-btn'); 
  14. this.bindDownloadEleAudioBtn(); 
  15. this.bindNewConBtn(); 
  16. this.bindDelConBtn('a.btn-del-con'); 
  17. this.bindDelItemBtn('a.btn-del-item'); 
  18. this.bindNewItemBoxClose('div.item-box'); 
  19. this.bindPlusBtn('a.btn-plus'); 
  20. this.bindAppendNewElement('div.new-item-box ul li a'); 
  21. this.bindSetPreviewVideo(); 
  22. this.bindAddAnswerBtn('a.btn-add-answer'); 
  23. this.bindDelAnswerBtn('a.btn-del-answer'); 
  24. this.bindDelImageBtn('a.btn-del-image'); 
  25. this.bindDelAudioBtn('a.btn-del-audio'); 
  26. this.initPlusBtn(); 
  27. }, 
  28. bindUploadEleVideoBtn: function(dom) { 
  29. var self = this
  30. $(dom).click(function() { 
  31. var $this = $(this); 
  32. var t = HHJsLib.modal.confirm( 
  33. '上传本地视频'
  34. '<div class="text-center">' 
  35. ' <p>浏览您电脑里,从中选择一个视频文件。</p>' 
  36. ' <div class="btn-box btn btn-blue">' 
  37. ' <div id="upload-btn">从电脑上传</div>' 
  38. ' </div>' 
  39. ' </div>' 
  40. ); 
  41. var uploader = HJZUploader.createVideo( 
  42. '#upload-btn',  
  43. {  
  44. formData: {model: 'timeline'}, 
  45. }, 
  46. function(response) { 
  47. if(false == response.rs) { 
  48. self.setDemoBoxInit($this); 
  49. return HHJsLib.warn(response.message); 
  50. self.setDemoAudioInfo($this, response.data); 
  51. $('#dialog-box-' + t).modal('hide'); 
  52. ); 
  53. uploader.on('uploadProgress'function(file) { 
  54. self.setDemoBoxLoading($this); 
  55. }); 
  56.  
  57. return uploader; 
  58. }); 
  59. }, 
  60. bindDelAudioBtn: function(dom) { 
  61. this.bindDelFileBtn(dom, '真的要删除这个音频吗?'); 
  62. }, 
  63. bindDelImageBtn: function(dom) { 
  64. this.bindDelFileBtn(dom, '真的要删除这个图片吗?'); 
  65. }, 
  66. bindDelFileBtn: function(dom, msg) { 
  67. var self = this
  68. $(dom).click(function() { 
  69. var $target = $(this); 
  70. var t = HHJsLib.initPopover($(this), msg); 
  71. $('#btn-sure-' + t).click(function() { 
  72. if(1 != $target.attr('data-new')) { 
  73. $.get( 
  74. queryUrl + 'timelineele/adel'
  75. {id: $target.attr('data-id')}, 
  76. function(response) { 
  77. if(false === response.rs) { 
  78. return HHJsLib.warn(response.message); 
  79. self.delDemoFieldInfo($target); 
  80. $target.popover('destroy'); 
  81. ); 
  82. return
  83. self.delDemoFieldInfo($target); 
  84. $target.popover('destroy'); 
  85. }); 
  86. }); 
  87. }, 
  88. delDemoFieldInfo: function($target) { 
  89. $($target.attr('data-demo-box')).html(''); 
  90. $($target.attr('data-box')).removeClass('uploaded').addClass('no-file'); 
  91. $($target.attr('data-field')).attr('data-id''').attr('data-src'''); 
  92. }, 
  93. bindAddAnswerBtn: function(dom) { 
  94. var self = this
  95. $(dom).click(function() { 
  96. var id = $(this).attr('data-id'); 
  97. var answerHtml = eleTplMap.answerTpl.replace(/{id}/g, id); 
  98. $('#answer-box-' + id).append(answerHtml); 
  99. self.bindDelAnswerBtn('#answer-box-' + id + ' a.btn-del-answer'); 
  100. }); 
  101. }, 
  102. bindDelAnswerBtn: function(dom) { 
  103. var self = this
  104. $(dom).click(function() { 
  105. var $target = $(this); 
  106. if(2 > $target.parent().parent().find('textarea.answer-editor').length) { 
  107. return HHJsLib.warn('至少需要有一个答案!'); 
  108. var t = HHJsLib.initPopover($target, '您确定要删除这个答案吗?'); 
  109. $('#btn-sure-' + t).click(function() { 
  110. $target.parent().remove(); 
  111. }); 
  112. }); 
  113. }, 
  114. bindAppendNewElement: function(dom) { 
  115. var self = this
  116. $(dom).unbind('click').click(function() { 
  117. var type = $(this).attr('data-type'); 
  118. var heading = $(this).parent().parent().attr('data-heading-id'); 
  119. if('heading' == type) { 
  120. self.addNewElePartBox(); 
  121. $("#new-item-box-" + heading).hide(); 
  122. return
  123. self.addNewEleToPartBox(heading, type); 
  124. }); 
  125. }, 
  126. addNewElePartBox: function() { 
  127. var t = this.getTimestamp(); 
  128. var partBoxHtml = eleTplMap.partBox.replace(/{t}/g, t); 
  129. var headingHtml = this.initItemTplByType('heading', t, t); 
  130. var itemHtml = this.initItemTplByType('text', t, t); 
  131. var itemBoxHtml = this.initItemBoxTpl(itemHtml, t, t, 'left''text'); 
  132. partBoxHtml = partBoxHtml.replace(/{heading}/g, headingHtml); 
  133. partBoxHtml = partBoxHtml.replace(/{item}/g, itemBoxHtml); 
  134. $("#main-box").append(partBoxHtml); 
  135. this.bindDelItemBtn('#item-' + t + ' a.btn-del-item'); 
  136. this.movePlusBtnBox(t); 
  137. }, 
  138. addNewEleToPartBox: function(heading, type) { 
  139. var total = $('#ele-part-box-' + heading + ' div.item-ele-box').length; 
  140. var side = total % 2 === 0 ? 'left' : 'right'
  141. var t = this.getTimestamp(); 
  142. var itemHtml = this.initItemTplByType(type, t, heading); 
  143. var itemBoxHtml = this.initItemBoxTpl(itemHtml, heading, t, side, type); 
  144. //清掉原有高度DIV 
  145. $('#clearfix-' + heading).remove(); 
  146. $('#ele-part-box-' + heading).find('div.eles-box').append(itemBoxHtml); 
  147. //绑定Dom事件 
  148. this.bindDelItemBtn('#item-' + t + ' a.btn-del-item'); 
  149. this.movePlusBtnBox(heading); 
  150. this.bindNewEleUpload(type); 
  151. }, 
  152. bindNewEleUpload: function(type) { 
  153. var self = this
  154. switch(type) { 
  155. case 'image'
  156. case 'question'
  157. case 'know'
  158. self.bindUploadModal('a.btn-upload'); 
  159. break
  160. case 'audio'
  161. self.bindUploadEleAudioBtn('a.audio-upload-btn'); 
  162. self.bindDelAudioBtn('a.btn-del-audio'); 
  163. break
  164. }, 
  165. initItemTplByType: function(type, t, heading) { 
  166. var itemHtml = eleTplMap[type].replace(/{t}/g, t); 
  167. itemHtml = itemHtml.replace(/{sort_num}/g, this.getNewEleSortNum(heading)); 
  168.  
  169. return itemHtml.replace(/{headingId}/g, heading); 
  170. }, 
  171. initItemBoxTpl: function(content, heading, t, side, type) { 
  172. var itemBoxHtml = eleTplMap.itemBox.replace(/{t}/g, t); 
  173. itemBoxHtml = itemBoxHtml.replace(/{headingId}/g, heading); 
  174. itemBoxHtml = itemBoxHtml.replace(/{side}/g, side); 
  175. itemBoxHtml = itemBoxHtml.replace(/{content}/g, content); 
  176. itemBoxHtml = itemBoxHtml.replace(/{hash}/g, hex_md5(t)); 
  177. itemBoxHtml += '<div class="clearfix" id="clearfix-' + heading + '"></div>'
  178.  
  179. return itemBoxHtml.replace(/{type}/g, type); 
  180. }, 
  181. movePlusBtnBox: function(heading) { 
  182. //删除原有 
  183. $('#new-item-box-' + heading).remove(); 
  184. //加入新 
  185. var plusBtnHtml = eleTplMap.plusBtn.replace(/{headingId}/g, heading); 
  186. $(plusBtnHtml).insertBefore('#clearfix-' + heading); 
  187. var $items = $('#ele-part-box-' + heading).find('div.item-ele-box'); 
  188. if($items.length < 2) { 
  189. $($items[0]).find('a.btn-del-item').hide(); 
  190. else { 
  191. $($items[0]).find('a.btn-del-item').show(); 
  192. //绑定事件 
  193. this.bindAppendNewElement('#new-item-box-' + heading + " ul.new-item-list-box li a"); 
  194. this.bindPlusBtn('#btn-plus-' + heading); 
  195. }, 
  196. bindNewItemBoxClose: function(dom) { 
  197. $(dom).click(function() { 
  198. $('div.new-item-box').hide(); 
  199. }); 
  200. }, 
  201. bindPlusBtn: function(dom) { 
  202. $(dom).click(function(event) { 
  203. $('div.new-item-box').hide(); 
  204. var id = $(this).attr('data-heading-id'); 
  205. $('#new-item-box-' + id + ' div.new-item-box').removeClass('hide').attr('data-show''1').show(); 
  206. event.preventDefault(); 
  207. }); 
  208. }, 
  209. initPlusBtn: function() { 
  210. var self = this
  211. $('div.ele-part-box').each(function() { 
  212. var dataId = $(this).attr('data-heading'); 
  213. self.movePlusBtnBox(dataId); 
  214. }); 
  215. }, 
  216. bindDelItemBtn: function(dom) { 
  217. var self = this
  218. $(dom).click(function() { 
  219. var $target = $(this); 
  220. var t = HHJsLib.initPopover($target, '您确定要删除这项吗?'); 
  221. var id = $target.attr('data-id'); 
  222. var heading = $('#item-' + id).attr('data-heading-id'); 
  223. $('#btn-sure-' + t).click(function() { 
  224. if(1 == $target.attr('data-new')) { 
  225. $.get( 
  226. queryUrl + 'timelineele/adel'
  227. {id: $target.attr('data-id')}, 
  228. function(response) { 
  229. if(false === response.rs) { 
  230. return HHJsLib.warn(response.message); 
  231. $('#item-' + id).fadeOut('fast'function() { 
  232. $(this).remove(); 
  233. self.movePlusBtnBox(heading); 
  234. self.reArrangeItem(heading); 
  235. }); 
  236. $target.popover('destroy'); 
  237. ); 
  238. return
  239. $target.popover('destroy'); 
  240. $('#item-' + id).fadeOut('fast'function() { 
  241. $(this).remove(); 
  242. self.movePlusBtnBox(heading); 
  243. self.reArrangeItem(heading); 
  244. }); 
  245. }); 
  246. }); 
  247. }, 
  248. reArrangeItem: function(heading) { 
  249. var rank = 1; 
  250. $('#ele-part-box-' + heading).find('div.item-ele-box').each(function() { 
  251. if(rank % 2 === 0) { 
  252. $(this).removeClass('pull-left item-left'
  253. .addClass('pull-right item-right'); 
  254. else { 
  255. $(this).removeClass('pull-right item-right'
  256. .addClass('pull-left item-left'); 
  257. rank ++; 
  258. }); 
  259. }, 
  260. bindNewConBtn: function() { 
  261. var self = this
  262. $('#btn-new-con-item').click(function() { 
  263. var t = self.getTimestamp(); 
  264. var conItemHtml = eleTplMap.conItemTpl.replace(/{t}/g, t); 
  265. $('#conclusion-box').append(conItemHtml); 
  266. self.bindDelConBtn('#btn-del-con-' + t); 
  267. self.bindUploadModal('a.btn-upload'); 
  268. }); 
  269. }, 
  270. bindDelConBtn: function(dom) { 
  271. var self = this
  272. $(dom).click(function() { 
  273. var $target = $(this); 
  274. var t = HHJsLib.initPopover($target, '您确定要删除这个结论吗?'); 
  275. var id = $target.attr('data-id'); 
  276. $('#btn-sure-' + t).click(function() { 
  277. if(1 == $target.attr('data-new')) { 
  278. $.get( 
  279. queryUrl + 'timelineele/adel'
  280. {id: $target.attr('data-id')}, 
  281. function(response) { 
  282. if(false === response.rs) { 
  283. return HHJsLib.warn(response.message); 
  284. $('#item-con-' + id).fadeOut('fast'function() { 
  285. $(this).remove(); 
  286. }); 
  287. $target.popover('destroy'); 
  288. ); 
  289. return
  290. $target.popover('destroy'); 
  291. $('#item-con-' + id).fadeOut('fast'function() { 
  292. $(this).remove(); 
  293. }); 
  294. }); 
  295. }); 
  296. }, 
  297. getNewEleSortNum: function(heading) { 
  298. return parseInt(this.getMaxSortNum(heading)) + 1; 
  299. }, 
  300. getMaxSortNum: function(heading) { 
  301. var sortNums = []; 
  302. $('.ele-sort-' + heading).each(function() { 
  303. sortNums.push($(this).val()); 
  304. }); 
  305. sortNums = sortNums.sort(function(a, b) { 
  306. if (a === b) { 
  307. return 0; 
  308. if (typeof a === typeof b) { 
  309. return a > b ? -1 : 1; 
  310. return typeof a > typeof b ? -1 : 1; 
  311. }); 
  312.  
  313. return sortNums[0] == null ? 0 : sortNums[0]; 
  314. }, 
  315. bindUploadEleImageBtn: function() { 
  316. this.bindUploadModal('a.btn-upload'); 
  317. }, 
  318. bindUploadEleAudioBtn: function(dom) { 
  319. var self = this
  320. $(dom).click(function() { 
  321. var $this = $(this); 
  322. var t = HHJsLib.modal.confirm( 
  323. '上传音频'
  324. '<div class="text-center">' 
  325. ' <p>浏览您电脑里,从中选择一个音频文件。</p>' 
  326. ' <div class="btn-box btn btn-blue">' 
  327. ' <div id="upload-btn">从电脑上传</div>' 
  328. ' </div>' 
  329. ' </div>' 
  330. ); 
  331. var uploader = HJZUploader.createAudio( 
  332. '#upload-btn',  
  333. {  
  334. formData: {model: 'timeline'}, 
  335. }, 
  336. function(response) { 
  337. if(false == response.rs) { 
  338. self.setDemoBoxInit($this); 
  339. return HHJsLib.warn(response.message); 
  340. self.setDemoAudioInfo($this, response.data); 
  341. $('#dialog-box-' + t).modal('hide'); 
  342. ); 
  343. uploader.on('uploadProgress'function(file) { 
  344. self.setDemoBoxLoading($this); 
  345. }); 
  346.  
  347. return uploader; 
  348. }); 
  349. }, 
  350. setDemoAudioInfo: function($target, data) { 
  351. var audioHtml = '<audio controls="controls"><source src="' + siteUrl + data.src + '" /></audio>'
  352. $($target.attr('data-demo-box')).html(audioHtml).show(); 
  353. $($target.attr('data-field')).attr('data-id', data.id).attr('data-src', data.src); 
  354. }, 
  355. bindUploadModal: function(dom) { 
  356. var self = this
  357. $(dom).unbind('click').click(function() { 
  358. var $this = $(this); 
  359. var t = HHJsLib.modal.confirm( 
  360. '上传图片'
  361. '<div class="text-center">' 
  362. ' <p>浏览您电脑里的图片,从中选择一张。</p>' 
  363. '<div class="btn-box btn btn-blue">' 
  364. ' <div id="upload-btn">从电脑上传</div>' 
  365. ' </div>' 
  366. ' </div>' 
  367. ); 
  368. var uploader = HJZUploader.createImage( 
  369. '#upload-btn',  
  370. {  
  371. formData: {model: 'timeline'
  372. }, 
  373. function(response) { 
  374. if(false == response.rs) { 
  375. self.setDemoBoxInit($this); 
  376. return HHJsLib.warn(response.message); 
  377. var imgHtml = '<img src="' 
  378. + siteUrl + response.data.src 
  379. '" alt="' + response.data.name + '" />'
  380. $($this.attr('data-demo-box')).html(imgHtml).show(); 
  381. $($this.attr('data-field')).val(response.data.id).attr('data-src', response.data.src); 
  382. $('#dialog-box-' + t).modal('hide'); 
  383. ); 
  384. uploader.on('uploadProgress'function(file) { 
  385. self.setDemoBoxLoading($this); 
  386. }); 
  387. self.bindDelImageBtn('a.btn-del-image'); 
  388.  
  389. return uploader; 
  390. }); 
  391. }, 
  392. bindPreviewBtn: function() { 
  393. var self = this
  394. $('#edit-btn, #preview-btn').click(function() { 
  395. try
  396. self.verifyBaseInfo(); 
  397. self.verifyEleInfo(); 
  398. self.verifyConclusionInfo(); 
  399. $('#timeline-form').submit(); 
  400. }catch(e) { 
  401. return HHJsLib.warn(e); 
  402. }); 
  403. }, 
  404. verifyBaseInfo: function() { 
  405. HHJsLib.isEmptyByDom('#image-path''时间轴大图'); 
  406. HHJsLib.isEmptyByDom('#cover''时间轴封面'); 
  407. HHJsLib.isEmptyByDom('#name''标题'); 
  408. HHJsLib.isEmptyByDom('#description''描述'); 
  409. }, 
  410. verifyEleInfo: function() { 
  411. this.verifyHeaderEleInfo(); 
  412. this.verifyTextEleInfo(); 
  413. this.verifyImageEleInfo(); 
  414. this.verifyVideoEleInfo(); 
  415. this.verifyAudioEleInfo(); 
  416. this.verifyQuestionEleInfo(); 
  417. this.verifyKnowEleInfo(); 
  418. }, 
  419. verifyHeaderEleInfo: function() { 
  420. $('div.item-heading-box').each(function() { 
  421. HHJsLib.isEmpty($(this).find('textarea').val(), '头条内容');  
  422. }); 
  423. }, 
  424. verifyTextEleInfo: function() { 
  425. $('div.item-text-box').each(function() { 
  426. HHJsLib.isEmptyByDom('#ele-text-' + $(this).attr('data-id'), '文本内容元素'); 
  427. }); 
  428. }, 
  429. verifyImageEleInfo: function() { 
  430. $('div.item-image-box').each(function() { 
  431. HHJsLib.isEmptyByDom('#ele-image-hash-' + $(this).attr('data-id'), '图片地址'); 
  432. HHJsLib.isEmptyByDom('#ele-image-content-' + $(this).attr('data-id'), '图片介绍'); 
  433. }); 
  434. }, 
  435. verifyVideoEleInfo: function() { 
  436. $('div.item-video-box').each(function() { 
  437. HHJsLib.isEmptyByDom('#ele-video-hash-' + $(this).attr('data-id'), '视频地址'); 
  438. HHJsLib.isEmptyByDom('#ele-video-content-' + $(this).attr('data-id'), '视频介绍'); 
  439. }); 
  440. }, 
  441. verifyAudioEleInfo: function() { 
  442. $('div.item-audio-box').each(function() { 
  443. HHJsLib.isEmptyByDom('#ele-audio-hash-' + $(this).attr('data-id'), '音频地址'); 
  444. HHJsLib.isEmptyByDom('#ele-audio-content-' + $(this).attr('data-id'), '音频介绍'); 
  445. }); 
  446. }, 
  447. verifyQuestionEleInfo: function() { 
  448. $('div.item-question-box').each(function() { 
  449. HHJsLib.isEmptyByDom('#ele-question-content-' + $(this).attr('data-id'), '问题内容'); 
  450. HHJsLib.isEmptyByDom('#ele-question-extend-' + $(this).attr('data-id'), '问题答案解释'); 
  451. HHJsLib.isEmpty(answerLen, '问题答案'); 
  452. $('#answer-box-' + $(this).attr('data-id')).find('textarea').each(function() { 
  453. HHJsLib.isEmpty($(this).val(), '问题答案'); 
  454. }); 
  455. }); 
  456. }, 
  457. verifyKnowEleInfo: function() { 
  458. $('div.item-know-box').each(function() {  
  459. HHJsLib.isEmptyByDom('#ele-know-hash-' + $(this).attr('data-id'), '知道图片地址'); 
  460. HHJsLib.isEmptyByDom('#ele-know-content-' + $(this).attr('data-id'), '知道介绍'); 
  461. }); 
  462. }, 
  463. verifyConclusionInfo: function() { 
  464. var length = $('#conclusion-box div.item-con').length; 
  465. HHJsLib.isEmpty(length, '总结'); 
  466. $('#conclusion-box div.item-con').each(function() { 
  467. var dataId = $(this).attr('data-id'); 
  468. HHJsLib.isEmptyByDom('#ele-con-hash-' + dataId, '总结图片'); 
  469. HHJsLib.isEmptyByDom('#ele-con-content-' + dataId, '总结详情'); 
  470. }); 
  471. }, 
  472. bindDownloadEleAudioBtn: function() { 
  473. var self = this
  474. $('a.download-audio-btn').click(function() { 
  475. var $this = $(this); 
  476. try
  477. HHJsLib.isEmptyByDom("#item-audio-upload-hash-" + $this.attr('data-id'), '下载地址'); 
  478. var url = $("#item-audio-upload-hash-" + $this.attr('data-id')).val(); 
  479. if('mp3' != url.substring(url.lastIndexOf('.') + 1).toLowerCase()) { 
  480. return HHJsLib.warn('格式不支持,必须是Mp3格式!'); 
  481. }  
  482. var t = HHJsLib.modal.info( 
  483. '下载音频'
  484. '<p class="text-center">正在下载音频文件中,请稍等...<p>' 
  485. ); 
  486. self.setDemoBoxLoading($this); 
  487. $.getJSON( 
  488. siteUrl + 'index.php/public/resource/adownload',  
  489. {url: encodeURIComponent(url)},  
  490. function(response) { 
  491. if(false == response.rs) { 
  492. self.setDemoBoxInit($this); 
  493. return HHJsLib.warn(response.message); 
  494. $('#dialog-box-' + t).modal('hide'); 
  495. self.setDemoAudioInfo($this, response.data); 
  496. ); 
  497. catch(e) { 
  498. return HHJsLib.warn(e); 
  499. }); 
  500. }, 
  501. setDemoBoxLoading: function($target) { 
  502. $($target.attr('data-box')).removeClass('no-file').addClass('uploaded'); 
  503. $($target.attr('data-file-box')).html(''); 
  504. }, 
  505. setDemoBoxInit: function($target) { 
  506. $($target.attr('data-box')).removeClass('uploaded').addClass('no-file'); 
  507. $($target.attr('data-file-box')).html(''); 
  508. }, 
  509. bindSetPreviewVideo: function() { 
  510. $('input.ele-video').change(function() { 
  511. var url = $(this).val(); 
  512. if(url != '') { 
  513. if('swf' != url.substring(url.lastIndexOf('.') +1 ).toLowerCase()) { 
  514. return HHJsLib.warn('视频地址不合法,请输入有效的在线观看Flash地址!'); 
  515. var previewHtml = '<embed src="' + url + '" quality="high" width="495" height="220" align="middle" allowScriptAccess="always" allowFullScreen="true" mode="transparent" type="application/x-shockwave-flash"></embed>'
  516. $($(this).attr('data-demo-box')).html(previewHtml); 
  517. }); 
  518. }, 
  519. bindDelEleBtnFormEdit: function() { 
  520. this.bindDelUploadImgBtn(); 
  521. }, 
  522. getTimestamp: function() { 
  523. return (new Date()).getTime(); 
  524. }); 

以上所述就是本文给大家分享的全部内容了,希望能够对大家学习javascript有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选