基于jQuery实现简单的js模块化

摘要:
但本人并非前端开发人员,那些框架都没用过,只对jQuery相对熟悉,就想用jQuery来解决这个问题。下面是自定义的注册函数$r,参数有两个,第一个参数是功能模块函数,要求把一个功能的js代码块写到一个函数中,传递给注册函数。Register现在注册一个绘制内切椭圆或圆形的js模块,模块名叫“graph.ellipse”,然后将容器container1的jQuery对象作为参数赋给graph.ellipse//注册graph.ellipse模块$r;graph.ellipse;//将container1作为模块容器这样就得到了一个宽高为100px的圆。

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

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

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

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

//注册函数$r
window.$r = function(){
    vari, func, modelName, name, model, paramArr;
    func = arguments[0];
    modelName = arguments[1];
    if(typeof func != 'function'){
        console.error('第一个参数不是function');
        return;
    }
    if(typeof modelName != 'string'){
        console.error('第二个参数应当为模块名字符串');
        return;
    }
    paramArr =  modelName.split('.');
    model =window;
    name = '';
    for(i=0; i<paramArr.length; i++){
        if(i == paramArr.length - 1){
            if(typeof model[paramArr[i]] != 'undefined'){
                console.error('模块"' + modelName + '"已存在');
                return;
            }
            model[paramArr[i]] =checkParamProxy;
            returncheckParamProxy;
        }
        model = model[paramArr[i]] = model[paramArr[i]] ||{};
        if(typeof model != 'object'){
            for(j=0; j<i; j++){}
            console.error('"' + name + paramArr[i] + '"不是object');
            return;
        }
        name += paramArr[i] + '.';
    }
    
    functioncheckParamProxy($p){
        if(typeof $p == 'undefined'){
            console.error('模块' + modelName + '需要传入一个jQuery类型参数作为容器');
            return;
        }
        if($p instanceofjQuery){
            returnfunc.call($p, $p);
        }
        console.error('"' + $p + '"不是jQuery对象');
        return;
    }
}

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

<html>
<head>
<meta charset="UTF-8"/>
<title>Register</title>
</head>
<body>
    <div   style="height: 100px; 100px;"></div>
    <div   style="height: 120px; 80px;"></div>
</body>
</html>

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

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

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(){// TODOgraph.ellipse模块加载完成后执行})来实现。外部要改变圆的颜色,就可以用$('#container1').data({'color':'#27ae60'}).trigger('change')触发容器上的change事件,得到一个绿色的圆。

免责声明:文章转载自《基于jQuery实现简单的js模块化》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇js实现Mac触摸板双指事件(上/下/左/右/放大/缩小)Xib中UIScrollView添加约束步骤下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

requireJS的使用_API(1)

之前有介绍过requireJS(模块化开发),可以看看 ,但是不详细,所以今天参考官网来详细介绍一下: 1.加载js文件: RequireJS的目标是鼓励代码的模块化,它使用了不同于传统<script>标签的脚本加载步骤。可以用它来加速、优化代码,但其主要目的还是为了代码的模块化。它鼓励在使用脚本时以module ID替代URL地址。 Requ...

k8s中节点级别的日志

容器化应用程序写入到 stdout 和 stderr 中的任何信息,都将被容器引擎重定向到某个地方。例如,Docker 容器引擎将 stdout 和 stderr 这两个输出流重定向到 logging driver ,Kubernetes的默认配置中,最终 logging driver 最终把日志写入了一个 json 格式的文件。 Docker 的 js...

更新js缓存办法

http://zhenggm.iteye.com/blog/680600 遇到的问题:在访问量比较大的系统中,我们需要将一些静态的文件在客户端缓存,以减少下载的流量,从而加快客户端访问的速度。但是缓存会带来一个问题,就是如何在服务端更新完文件之后,客户端能够及时得到更新。 解决思路:1. 在一个配置文件中维护js文件map; 2. 在页面中通过js ma...

js 光标位置处理

/** * 获取选中文字 * 返回selection,toString可拿到结果,selection含有起始光标位置信息等 **/ function getSelectText() { var text, userSelection = window.getSelection()||document.se...

JS获取本机时间和实时动态时间代码

一、JS代码获取本机时间代码: 1、时间函数: 当前时间日期函数为: Date();  那么我们把当前时间赋值给一个变形now,然后下面方便调用即: now=Date(); 年: now.getFullYear(); 月: now.getMonth()+1; 日: now.getUTCDate(); 时: now.getHours(); 分: now.g...

JS 测试网络速度与网络延迟

一、延迟与网速 通过js加载一张1x1的极小图片,测试出图片加载的所用的时长。如果换一个几百KB的图片,则可心用来计算下载网速 document.write('<input type="button" value="停止计时" onclick="clearTimeout(timeid) " /> '); document.write('&l...