经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » jQuery » 查看文章
基于jQuery实现简单的js模块化
来源:cnblogs  作者:GH_军  时间:2019/4/22 8:58:01  对本文有异议

    在多人合作完成网页,经常遇到大家的js代码相互影响的问题。现在有许多模块化的前端框架,应该是可以解决这个问题。但本人并非前端开发人员,那些框架都没用过,只对jQuery相对熟悉,就想用jQuery来解决这个问题。

    首先相互影响主要有两个方面,一是js代码中定义的function名重复,导致覆盖问题;另一个是js操作页面元素时,大家使用的id、name、class等可能重复,导致操作了错误的对象。

    对于第一点,采用的是定义一个注册函数,其他自定义的方法都要通过调用注册函数进行注册,注册时去检查该函数是否已经存在。对于第二点,考虑使用div作为容器(当然其他标签元素也可以),一个功能模块放到一个容器中,一个模块的js只操作对应容器中的元素,该模块只通过容器进行对外的交互(模块化后一个模块只知道自己的容器是谁,数据传递只在模块和容器间进行)。

    下面是自定义的注册函数$r,参数有两个,第一个参数是功能模块函数,要求把一个功能的js代码块写到一个函数中,传递给注册函数。第二个参数是模块名称字符串,多级采用“.”来分隔。

  1. // 注册函数$r
  2. window.$r = function(){
  3. var i, func, modelName, name, model, paramArr;
  4. func = arguments[0];
  5. modelName = arguments[1];
  6. if(typeof func != 'function'){
  7. console.error('第一个参数不是function');
  8. return;
  9. }
  10. if(typeof modelName != 'string'){
  11. console.error('第二个参数应当为模块名字符串');
  12. return;
  13. }
  14. paramArr = modelName.split('.');
  15. model = window;
  16. name = '';
  17. for(i=0; i<paramArr.length; i++){
  18. if(i == paramArr.length - 1){
  19. if(typeof model[paramArr[i]] != 'undefined'){
  20. console.error('模块"' + modelName + '"已存在');
  21. return;
  22. }
  23. model[paramArr[i]] = checkParamProxy;
  24. return checkParamProxy;
  25. }
  26. model = model[paramArr[i]] = model[paramArr[i]] || {};
  27. if(typeof model != 'object'){
  28. for(j=0; j<i; j++){}
  29. console.error('"' + name + paramArr[i] + '"不是object');
  30. return;
  31. }
  32. name += paramArr[i] + '.';
  33. }
  34. function checkParamProxy($p){
  35. if(typeof $p == 'undefined'){
  36. console.error('模块' + modelName + '需要传入一个jQuery类型参数作为容器');
  37. return;
  38. }
  39. if($p instanceof jQuery){
  40. return func.call($p, $p);
  41. }
  42. console.error('"' + $p + '"不是jQuery对象');
  43. return;
  44. }
  45. }

     下面举个示例,页面代码如下,里面就两个div,container1和container2,当作容器使用。

  1. <html>
  2. <head>
  3. <meta charset="UTF-8"/>
  4. <title>Register</title>
  5. </head>
  6. <body>
  7. <div id="container1" style="height: 100px;width: 100px;"></div>
  8. <div id="container2" style="height: 120px;width: 80px;"></div>
  9. </body>
  10. </html>

    现在注册一个绘制内切椭圆或圆形的js模块,模块名叫“graph.ellipse”,然后将容器container1的jQuery对象作为参数赋给graph.ellipse

  1. // 注册graph.ellipse模块
  2. $r(function($c){ // $c为容器的jQuery对象,也可通过this来获取
  3. $c.html('<div style="height: 100%;width: 100%; border: 2px solid #999999;border-radius: 50%;"></div>');
  4. $c.on('change', function(){
  5. var color = $c.data('color');
  6. $c.children().css({'border-color':color});
  7. })
  8. $c.trigger('loaded');
  9. }, 'graph.ellipse');
  10. graph.ellipse($('#container1')); // 将container1作为模块容器

   这样就得到了一个宽高为100px的圆。

 

    在graph.ellipse模块中,将操作都限定在$c(示例中即$('#container1'))内,比如用$c.find(e|o|e)查找元素,用$c.append(content|fn)追加元素等,这样就确保不会对其他模块产生影响。模块对外交互采用$c.trigger(type)和$c.on(type,fn)触发绑定事件机制,比如示例中$c.trigger('loaded')触发一个loaded加载完成事件,需要在模块加载完成后执行的操作,就可以在外部用$('#container1').on('loaded',function(){// TODO graph.ellipse模块加载完成后执行})来实现。外部要改变圆的颜色,就可以用$('#container1').data({'color':'#27ae60'}).trigger('change')触发容器上的change事件,得到一个绿色的圆。

 

原文链接:http://www.cnblogs.com/zengyuanjun/p/10727031.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号