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

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

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

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

// 注册函数$r
window.$r = function(){
var i, 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;
return checkParamProxy;
}
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] + '.';
} function checkParamProxy($p){
if(typeof $p == 'undefined'){
console.error('模块' + modelName + '需要传入一个jQuery类型参数作为容器');
return;
}
if($p instanceof jQuery){
return func.call($p, $p);
}
console.error('"' + $p + '"不是jQuery对象');
return;
}
}

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

<html>
<head>
<meta charset="UTF-8"/>
<title>Register</title>
</head>
<body>
<div id="container1" style="height: 100px;width: 100px;"></div>
<div id="container2" style="height: 120px;width: 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%;width: 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(){// TODO graph.ellipse模块加载完成后执行})来实现。外部要改变圆的颜色,就可以用$('#container1').data({'color':'#27ae60'}).trigger('change')触发容器上的change事件,得到一个绿色的圆。

 

基于jQuery实现简单的js模块化的更多相关文章

  1. 基于jquery的插件turn.js学习笔记

    基于jquery的插件turn.js学习笔记 简介 turn.js是一个可以实现3d书籍展示效果的jq插件,使用html5和css3来执行效果.可以很好的适应于ios和安卓等触摸设备. How it ...

  2. 一个基于jQuery的简单树形菜单

    在工作中的项目使用的是一个前端基于 jQuery easyui 的一个系统,其中左侧的主菜单使用的是 easyui 中的 tree 组件,不是太熟悉,不过感觉不是太好用. 比如 easyui 中的 t ...

  3. 【treeview】 基于jQuery的简单树形插件

    [treeview] 效果图: 前几天想把后台的目录结构通过树形插件的方法反映到前端来,在网上搜了半天只找到了这个treeview,虽然不是很好看,不过还是够用的..用treeview的前提是要有jq ...

  4. 基于JQuery的简单富文本编辑器

    利用jQuery实现最简单的编辑器 我试了很多种方法,目前最快捷能够实现及其简单的编辑可以使用 document.execCommand("ForeColor", "fa ...

  5. 基于jquery的移动端JS无缝切换

    Html: <div id="slide-box-1"> <ul> <li> <a href="javascript:void( ...

  6. 【分享】纯js的n级联动列表框 —— 基于jQuery,支持下拉列表框和列表框,最重要的是n级,当然还有更重要的

    多个列表框联动,不算是啥大问题,但是却挺麻烦,那么怎么才能够尽量方便一点呢?网上搜了一下,没发现太好用的,于是就自己写了一个.基于jQuery,无限级联动,支持下拉列表框和列表框. 先说一下步骤和使用 ...

  7. 基于jQuery简单实用的Tabs选项卡插件

    jQuery庞大的插件库总是让人欢喜让人忧,如何从庞大的插件库里挑出适合自己的插件,总是让很多缺少经验的朋友头疼的事!今天为大家推荐几款简单实用的Tabs选项卡插件,推荐理由:简单易用灵活,样式美观, ...

  8. 基于Jquery 简单实用的弹出提示框

    基于Jquery 简单实用的弹出提示框 引言: 原生的 alert 样子看起来很粗暴,网上也有一大堆相关的插件,但是基本上都是大而全,仅仅几句话可以实现的东西,可能要引入好几十k的文件,所以话了点时间 ...

  9. 出位的template.js 基于jquery的模板渲染插件

    找了好几款基于jquery的模板渲染插件,无一感觉很难用(教程较少.绑定不统一),也可能我智商问题,比如jquery template.js .jtemplate.js. 然后在github上找到这一 ...

随机推荐

  1. 【机器学习笔记一】协同过滤算法 - ALS

    参考资料 [1]<Spark MLlib 机器学习实践> [2]http://blog.csdn.net/u011239443/article/details/51752904 [3]线性 ...

  2. new Date()传参的浏览器兼容性

    测试以下是在IE9的测试情况 可以看到IE9不支持new Date('2018-1-2')和new Date('123456'),但是支持new Date('2018-01-02').new Date ...

  3. 如何使用SignTool签署应用程序包

    备注 有关签署UWP应用程序包的信息,请参阅使用SignTool签署应用程序包. 了解如何使用SignTool对Windows应用商店应用包进行签名,以便部署它们.SignTool是Windows软件 ...

  4. 【重学计算机】机组D4章:存储系统

    1. 存储系统层次结构 主存速度缓慢的原因:主存增速与CPU不同步,执行指令期间多次访问主存 主存容量不足的原因: 存在制约主存容量的技术因素:如由CPU.主板等相关技术指标规定了主存容量 应用对主存 ...

  5. Python爬虫入门教程 49-100 Appium安装+操作51JOB_APP(模拟手机操作之一)手机APP爬虫

    爬前准备工作 在开始安装Appium之前,你要先知道Appium是做什么的?Appium 是一个自动化测试开源工具,看到没,做测试用的,它有点类似Selenium,可以自动操作APP实现一系列的操作. ...

  6. Jenkins集群搭建

    Jenkins的目的是加快CI/CD的步伐,集群的搭建也不是必须的,当一台服务器的构建速度受到限制下,可以考虑使用主从并发构建,来加快构建速度.作为一款超级管家的角色,Jenkins的资料非常多,Je ...

  7. Python3+unitest自动化测试初探(下篇)

    目录 9.用例结果校验 10.跳过用例 11.Test Discovery 12.加载用例 unittest官方文档 本篇随笔承接: Python3+unitest自动化测试初探(中篇) Python ...

  8. Ocelot-基于.NET Core的开源网关实现

    写在前面 API网关是系统内部服务暴露在外部的一个访问入口,类似于代理服务器,就像一个公司的门卫承担着寻址.限制进入.安全检查.位置引导等工作,我们可以形象的用下图来表示: 外部设备需要访问内部系统服 ...

  9. 利用SHA-1算法和RSA秘钥进行签名验签(带注释)

    背景介绍 1.SHA 安全散列算法SHA (Secure Hash Algorithm)是美国国家标准和技术局发布的国家标准FIPS PUB 180-1,一般称为SHA-1.其对长度不超过264二进制 ...

  10. 从一个点子到一个社区APP,是如何通过.NET实现的?——“文林物业系统”APP介绍及采访记录

    “文林物业系统”(简称“文林社区”)是一款与物业管理软件无缝衔接的移动端系统.可在线查看通知公告.报修.投诉建议.查询物业管理费.水电气等其他费用,并且支持在线缴费.以物业管理为接入点,在未来,将会致 ...