肉动漫无修3D在线观看-肉动漫无码无删减在线观看-肉动漫h黄动漫日本免费观看-肉动漫3D卡通无修在线播放-床上色APP下载免费版-床伴在线观看免费高清完整泰剧第四集

Web前端知識(shí)

首頁(yè) > 免費(fèi) > Web前端知識(shí) >

基于RequireJS和JQuery的模塊化編程——常見(jiàn)問(wèn)題解析

來(lái)源:北京匯仁智杰科技有限公司   時(shí)間:2016-04-14   點(diǎn)擊:

  由于js的代碼邏輯越來(lái)越重,一個(gè)js文件可能會(huì)有上千行,十分不利于開(kāi)發(fā)與維護(hù)。最近正在把邏輯很重的js拆分成模塊,在一頓糾結(jié)是使用requirejs還是seajs的時(shí)候,最終還是偏向于requirejs。下面就循序漸進(jìn)的講解一下匯仁智杰技術(shù)大師遇到的問(wèn)題,以及解決的辦法。
  關(guān)于AMD和CMD的理解
  AMD(異步模塊定義)的典型就是requirejs,而CMD(通用模塊定義)的典型是淘寶的seajs。
  他們的相同點(diǎn)是,都會(huì)異步的加載js。但是不同點(diǎn)是,require.js加載完會(huì)立即執(zhí)行;而seajs則是等到進(jìn)入主函數(shù)需要執(zhí)行時(shí)才執(zhí)行。
  如果使用seajs初始的加載執(zhí)行效率會(huì)比較高,但是在使用的過(guò)程中可能會(huì)取執(zhí)行js,因此可能會(huì)出現(xiàn)卡頓,影響用戶體驗(yàn)。而requirejs則是在一開(kāi)始就把所有加載的js都執(zhí)行,這時(shí),如果你的模塊中有一些執(zhí)行方法,它們可能并不會(huì)按照你想的順序執(zhí)行。
  因此,如果已經(jīng)習(xí)慣了異步編程,并且希望有完善的文檔推薦使用requirejs;如果是想對(duì)執(zhí)行順序有特殊要求,又方便開(kāi)發(fā),那么也可以使用seajs。
如何解決requirejs中循環(huán)依賴問(wèn)題
  如果你定義的某個(gè)a模塊使用到了b模塊,而b模塊又使用了a模塊,那么就會(huì)拋出循環(huán)依賴的異常。
  比如,我這里寫(xiě)了一個(gè)循環(huán)依賴的例子。
  主頁(yè)面:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<script data-main="test.js" src="lib/require.js"></script>
</body>
</html>
  主方法:
requirejs.config({
  baseUrl: './'
});
requirejs(['js/a'],function (a){
  console.log("in test");
  a.testfromb();
});
  a.js模塊中,atest()方法提供b調(diào)用、testfromb()方法調(diào)用b的方法
define(function(require){
 var b = require("js/b");
 console.log("in a");
 return {
  atest:function(){
   console.log("test in a");
  },
  testfromb:function(){
   console.log("testfromb in a");
   b.btest();
  }
 }
});
  b模塊中,調(diào)用了a的方法。
define(function(require){
 var a = require("js/a");
 console.log("in b");
 return {
  btest:function(){
   console.log("test in b");
   a.atest();
  }
 }
});
  這樣相當(dāng)于a調(diào)用了b的方法,但是b的方法依賴于a的方法,這就造成了循環(huán)依賴。瀏覽器會(huì)提示錯(cuò)誤:
Uncaught Error: Module name "js/a" has not been loaded yet for context: _
  按照官方文檔的說(shuō)法,這種屬于設(shè)計(jì)的問(wèn)題,應(yīng)該盡量避免。那么如果避免不了該怎么辦呢?可以這樣修改b模塊:
define(function(require){
 // var a = require("js/a");
 console.log("in b");
 return {
  btest:function(){
  console.log("test in b");
   require("js/a").atest();
  }
 }
});
  這里是等到執(zhí)行atest()方法時(shí),才加載a模塊。這時(shí),a模塊很顯然已經(jīng)加載完了 。可以看到輸出的信息:
in b
a.js:3 in a
test.js:6 in test
a.js:9 testfromb in a
b.js:6 test in b
a.js:6 test in a

0.png

  同樣的方式,修改a可能就不好使了。這時(shí)因?yàn)槟K加載的順序是從b開(kāi)始的。
  如何在requirejs中使用jquery
  如果想要使用jquery比較簡(jiǎn)單,直接在main.js中添加對(duì)應(yīng)的依賴即可:
requirejs.config({
 baseUrl: './',
 paths:{
  'jquery':'lib/jquery'
 }
});
requirejs(['jquery'],
function ($){
 $('#test').html('test');
});
  如何在requirejs中使用jquery插件
  對(duì)于jquery的插件,比較常見(jiàn)的做法都是傳入一個(gè)jquery的對(duì)象,在這個(gè)jquery對(duì)象的基礎(chǔ)上添加插件對(duì)應(yīng)的方法。
  首先需要添加jquery插件的依賴,這里用兩個(gè)插件舉例子——jquery-ui和jquery-datatables
requirejs.config({
 baseUrl: './',
 paths:{
  'jquery':'lib/jquery',
  'jquery-ui':'lib/jquery-ui',
  'jquery-dataTables':'lib/jquery.dataTables'
 },
 shim:{
  'jquery-ui':['jquery'],
  'jquery-dataTables':['jquery']
 }
});
requirejs(['jquery','jquery-ui','jquery-dataTables'],
function ($){
 ....
});
  由于jquery插件都需要依賴于jquery,因此可以在shim中指定依賴關(guān)系。
  除了上面這種使用方法,也可以使用commonJS風(fēng)格的調(diào)用:
define(function(require){
 var $ = require('jquery');
 require('jquery-ui');
 require('jquery-dataTables');
  //下面都是測(cè)試,可以忽略
 var _test = $('#test');
 _test.selectmenu({
  width : 180,
  change : function(event, ui) {
   console.log('change');
  }
 });
 return {
  test:function(){
   //測(cè)試jquery-ui
   _test.append($('<option>test1</option><option>test1</option>'));
   _test.selectmenu("refresh");
   //測(cè)試jquery-datatables
    var _table = $('table');
   _table.dataTable();
  }
 }
});
  不過(guò),執(zhí)行上面的代碼,會(huì)報(bào)一個(gè)異常:
Uncaught TypeError: _table.dataTable is not a function
  這是因?yàn)椋琩ataTables并不是一個(gè)require風(fēng)格的模塊,因此直接這樣引入,并不會(huì)執(zhí)行它內(nèi)部的匿名函數(shù)。可以修改它的匿名函數(shù),傳入$對(duì)象,在最后一行:
 */
 return $.fn.dataTable;
//}));原來(lái)是這樣
}($)));//這里增加執(zhí)行這個(gè)匿名函數(shù),并且傳入$對(duì)象。
}(window, document));
  requirejs使用jquery-ui的問(wèn)題
  由于requirejs加載js文件后會(huì)立即執(zhí)行,如果你的jquery ui 插件需要刷新DOM頁(yè)面,那么可能會(huì)導(dǎo)致頁(yè)面的事件失效。
  比如,你的模塊在加載后,對(duì)頁(yè)面的某個(gè)元素$('#test')綁定了click事件。但是使用了某個(gè)UI插件,這個(gè)插件會(huì)重新渲染DOM元素,test對(duì)應(yīng)的click事件就失效了。
  解決辦法:
  把事件綁定推遲到DOM元素渲染完后再手動(dòng)觸發(fā)綁定;
  也可以使用事件捕獲代替DOM元素的事件綁定。
  比如在DOM重構(gòu)的JS模塊中,執(zhí)行渲染的代碼下面:
require("xxx").initEvents();
  常見(jiàn)場(chǎng)景:
  比如我在頁(yè)面中使用了jquery-steps這個(gè)UI插件,它會(huì)對(duì)頁(yè)面進(jìn)行重新渲染。這就導(dǎo)致我最開(kāi)始綁定的事件都失效了....只有推遲到這個(gè)js重構(gòu)完頁(yè)面,再綁定才行。

網(wǎng)絡(luò)營(yíng)銷推廣 . 北京匯仁智杰科技有限公司!

地址:北京市昌平區(qū)回龍觀龍冠大廈5層
咨詢:13370157521
業(yè)務(wù)QQ:373002979
E - mail:sales @ huirenzhijie.com
企業(yè)網(wǎng)站備案:京ICP備15021091號(hào)-1

匯仁智杰與眾不同

  • 有網(wǎng)絡(luò)推廣經(jīng)驗(yàn)
  • 有網(wǎng)站建站隊(duì)伍
  • 有大型網(wǎng)站建設(shè)經(jīng)驗(yàn)
  • 致力于營(yíng)銷型網(wǎng)站建設(shè)
  • 始終堅(jiān)持技術(shù)和服務(wù)同樣重要
查看PC版網(wǎng)站
備案號(hào):京ICP備15021091號(hào)-1 版權(quán)所有:匯仁智杰

主站蜘蛛池模板: 成人影片大全 | a在线观看免费视频 | 国产一区二区在线免费观看 | 凹凸精品视频分类视频 | 国产一级特黄a大片99 | 99九九精品国产高清自在线 | 最近韩国HD免费观看国语 | 蜜柚视频在线观看全集免费观看 | 国产区免费在线观看 | 浪小辉军警服务员VIDEOS | 亚洲嫩草AV永久无码精品无码 | 美女脱光app | 伦理片天堂eeuss影院2o12 | 狠狠色狠狠色狠狠五月ady | 国产蜜臀AV在线一区视频 | 岛国大片在线播放免费 | 国产亚洲精品久久久久久一区二区 | 欧美性类s0x | 久久精品国产亚洲AV忘忧草蜜臀 | 亚洲 日韩 色 图网站 | 2020最新无码国产在线视频 | 91欧洲在线视精品在亚洲 | 国产日韩成人内射视频 | 亚洲 中文 自拍 无码 | 国产乱辈通伦影片在线播放亚洲 | 久久艹影院 | 精品久久久久久久99热 | 99视频精品全部免费免费观 | 日本午夜精品久久久无码 | 日本午夜精品理论片A级APP发布 | 中国人泡妞www免费 中国拍三a级的明星女 | 黄色a一级视频 | 亚洲国产精品无码中文字幕 | 一品道门在线观看免费视频 | 中文文字幕文字幕亚洲色 | 无遮挡午夜男女XX00动态 | 在线广播收听 | 国产精品日本无码久久一老A | 特污兔午夜影视院 | 久久精品视在线-2 | 久久精品国产在热亚洲 |