封装常用的js(Base.js)——【01】理解库,获取节点,连缀,
封装常用的js(Base.js)——【01】理解库,获取节点,连缀,
现如今有太多优秀的开源javascript库,比如jQuery,Prototype,Dojo等等,这些javascript库已经把最常用的代码进行了有效的封装,以便我们开发,从而提高效率。现在我这里探讨的是自己创建一个javascript库,自己创建的肯定没有那些开源javascript库功能强大,目的主要是为了提升自己的原生javascript开发能力。
Base.js是我自己学习瓢城web俱乐部李炎灰老师的javascript教程,根据教程总结归纳出一份常用的js代码片段,里面有我学习时候的一些注释,笔记。这些笔记站在新手的角度思考初学时会碰上的问题,有些问题可能我自己以后再回头看都会笑自己当初怎么问这么幼稚的问题,希望在我学而时习之,温故而知新的同时,能帮助众多和我一样想学原生js的新手。当然,可能光看我的笔记作用不太大,不知道我写的什么玩意- -!!推荐大家自己也去看看李炎灰老师的javascript教程。百度搜"瓢城web俱乐部"就可以了。
//2014.10.07【90】
//在常用的js中,最常用的还是获取节点。所以首先先封装获取节点。
/*
函数式
function $(id) {
return document.getElementById(id);
}
*/
/*
对象式
*/
var Base = {
getId : function (id) {
return document.getElementById(id)
},
getName : function (name) {
return document.getElementsByName(name)
},
getTagName : function (tag) {
return document.getElementsByTagName(tag);
}
};
/*
然后封装之后如何调用(有些啰嗦了,照顾新手)。就把Base.js当做一个jquery,写html页面的时候在</body>前面加上
<script src="js/Base.js"></script>
<script src="js/demo.js"></script>
封装好的Base.js不管它,需要在demo.js中调用我们封装好的代码。在demo.js中写
window.onload=function(){
alert(Base.getId('box').innerHTML);
alert(Base.getName('sex')[0].value);
alert(Base.getTagName('div')[2].innerHTML);
}
【PS:写到这里发现我们自己封装好的Base.js获取节点的方法还是比不上jquery的选择器,不管是ID还是类或者元素,都可以直接一个“$”搞定,以后等到一定能力了去看看jquery里面怎么封装的那些获取节点的方法去。】
*/
复制代码
接下来是介绍【连缀】功能,比如写jquery的时候,经常会看到这样的代码。
$('#box').css('color','red').html('标题').click(function(){alert('a')});
这就是连缀,就是一句话同时设置一个或多个节点,两个或两个以上的操作。(突然想到一个词,链式调用....链式调用跟连缀感觉有些像....希望以后深入学习的时候可以弄懂吧.)
这样的话就需要对上面的代码作出一些修改,var Base={},这种写法不能在它的原型中添加方法,所以需要使用函数式对象写法:
//2014.10.07【91】
/*
现有代码:
var Base = {
getId : function (id) {
return document.getElementById(id)
},
getName : function (name) {
return document.getElementsByName(name)
},
getTagName : function (tag) {
return document.getElementsByTagName(tag);
}
};
需求:
修改代码,在Base这个基础库的核心对象中,添加css方法,html方法,click方法,并且实现连缀,
即 Base.getId('box').css('color','red').css('backgroundColor','black').html('pox'),click(function(){alert('a')});
分析:添加方法不难,难的是如何实现连缀,
Base.getId('box')返回的是一个divElement,这个对象是没有CSS方法的;
我们需要将Base.getId('box')返回Base对象,
Base.getId('box').css('color','red')返回的也是Base对象;
Base.getId('box').css('backgroundColor','black')还是返回Base对象;
即每执行完一个方法后 都要返回Base对象。
*/
function Base(){
//创建一个数组,来保存获取的节点和节点数组
this.elements=[];
//获取id节点
this.getId=function(id){
this.elements.push(document.getElementById(id));
return this;
};
//获取元素节点
this.getTagName=function(tag){
var tags=document.getElementsByTagName(tag);
for(var i=0;i<tags.length;i++){
this.elements.push(tags[i]);
}
return this;
}
}
//添加css()方法
Base.prototype.css = function (attr, value) {
for (var i = 0; i < this.elements.length; i ++) {
this.elements[i].style[attr] = value;
}
return this;
}
//添加html()方法
Base.prototype.html=function(str){
for(var i=0;i<this.elements.length;i++){
this.elements[i].innerHTML=str;
}
return this;
}
//添加click()方法
Base.prototype.click=function(fn){
for(var i=0;i<this.elements.length;i++){
this.elements[i].onclick=fn;
}
return this;
}
/*
一:由push联想到数组那一章节,可以复习下关于数组的一些方法,toLocalString()、toString()、valueOf()、join()、后进先出栈方法LIFO, push(),shift(),先进先出队列方法FIFO吗,shift(),unshift(),reverse(),sort(),concat(),slice(),splice(),indexOf(),lastIndexOf(),every(),filter(),forEach(),map(),some(),reduce(),reduceRight()...
二:为什么CSS要写到外面,而不是Base(){} 里面?这是为了区分获取节点和各种方法。所以方法单独拿出来写
三:为什么是Base.prototype.css=... ,而不是 this.css=... 或者 Base.css=...?
如果用this.css,这时候this是代表window,所以不能用this;
关于this关键字,翻了下书,没找到什么合适的描述。留个链接以后详细看看
http://www.blogjava.net/baoyaer/articles/105864.html
如果用Base.css,运行依然会报错,“base.getId("#box").css is not a function”;
原因复习【33-39】面向对象与原型;
*/
//前台调用代码,即demo.js里面的代码
window.onload=function(){
var base=new Base();
base.getId('box').css('color','red').css('backgroundColor','black');
base.getTagName('p').css('color','green').html('标题').click(function(){
alert('a');
}).css('backgroundColor','pink');
};
/*html主要代码
<div id="box">box</div>
<p>段落</p>
<p>段落</p>
<p>段落</p>
*/
复制代码
写到这里,满以为要告一段落了,一运行,看看,html()方法有效,把p里面的内容“段落”都改成标题了,背景颜色也变成粉色了,连缀也实现了,再看,仔细看,好像哪里不对劲!按照代码,我是想把 box的背景色变成黑色,段落背景变成粉色的,为什么都是粉色了?!而且本来只想把“段落”变成“标题”的,结果连带 “box”也变成“标题”二字了。
这是因为后面的与前面都是用的一个对象,var base=new Base();后面的会把前面的覆盖,所以得修改下,每个都必须有专门的一个实例。最后,得出来的纯净的代码就是
var $ = function () {
return new Base();
}
function Base() {
//创建一个数组,来保存获取的节点和节点数组
this.elements = [];
//获取ID节点
this.getId = function (id) {
this.elements.push(document.getElementById(id));
return this;
};
//获取元素节点
this.getTagName = function (tag) {
var tags = document.getElementsByTagName(tag);
for (var i = 0; i < tags.length; i ++) {
this.elements.push(tags[i]);
}
return this;
};
}
文章来源:http://www.youjobit.com/news_248.html
IT人才招聘
封装常用的js(Base.js)——【01】理解库,获取节点,连缀,的更多相关文章
- 站长常用的200个js代码 站长常用js代码大全 站长常用js代码集合
站长常用的200个js代码 1.文本框焦点问题 onBlur:当失去输入焦点后产生该事件 onFocus:当输入获得焦点后,产生该文件 Onchange:当文字值改变时,产生该事件 Onselect: ...
- js 模块化的一些理解和es6模块化学习
模块化 1 IIFE 2 commonjs 3 浏览器中js的模块化 4 简单理解模块加载器的原理 5 es6 之前在参加百度前端技术学院做的小题目的时候,自己写模块的时候 都是写成立即调用表达式( ...
- 【转】第6篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:自动注册JS脚本+自动反射方法分析
作者: 牛A与牛C之间 时间: 2013-11-21 分类: 技术文章 | 暂无评论 | 编辑文章 主页 » 技术文章 » 第6篇:Xilium CefGlue 关于 CLR Object 与 JS ...
- 【转】第5篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:自动注册JS脚本+委托回调方法分析
作者: 牛A与牛C之间 时间: 2013-11-19 分类: 技术文章 | 暂无评论 | 编辑文章 主页 » 技术文章 » 第5篇:Xilium CefGlue 关于 CLR Object 与 JS ...
- vue.js精讲01
笔记及源码地址 : https://github.com/wll8/vue_note 01 2017-09-13 view一个 mvvm框架(库),和 ag 类似.比较小巧,容易上手. mvc: mv ...
- .net mvc 站点自带简易SSL加密传输 Word报告自动生成(例如 导出数据库结构) 微信小程序:动画(Animation) SignalR 设计理念(一) ASP.NET -- WebForm -- ViewState ASP.NET -- 一般处理程序ashx 常用到的一些js方法,记录一下 CryptoJS与C#AES加解密互转
.net mvc 站点自带简易SSL加密传输 因项目需要,传输数据需要加密,因此有了一些经验,现简易抽出来分享! 请求:前端cryptojs用rsa/aes 或 rsa/des加密,后端.net ...
- 【前端知识体系-JS相关】深入理解MVVM和VUE
1. v-bind和v-model的区别? v-bind用来绑定数据和属性以及表达式,缩写为':' v-model使用在表单中,实现双向数据绑定的,在表单元素外使用不起作用 2. Vue 中三要素的是 ...
- Js模块化开发的理解
Js模块化开发的理解 模块化是一个语言发展的必经之路,其能够帮助开发者拆分和组织代码,随着前端技术的发展,前端编写的代码量也越来越大,就需要对代码有很好的管理,而模块化能够帮助开发者解决命名冲突.管理 ...
- js参数arguments的理解
原文地址:js参数arguments的理解 对于函数的参数而言,如下例子 function say(name, msg){ alert(name + 'say' + msg); } say('xiao ...
随机推荐
- iOS Debug日志 viewhierarchy调试笔记
Debut - View Debugging - Capture View Hierarchy 当视图没有正常显示时,用view hierarchy进行调试,查看左边的分支里有没有加载对应的视图. 如 ...
- C# 格式化字符串,日期,字符串操作汇总
时间格式化 有时候我们要对时间进行转换,达到不同的显示效果 默认格式为:2005-6-6 14:33:34 如果要换成成200506,06-2005,2005-6-6或更多的该怎么办呢 我们要用到:D ...
- BZOJ1950 : [Ceoi2006]Link
显然在最优解中,添加的边都是从$1$出发的. 这个图是一个环套树的结构,对于树的部分,显然叶子节点必须加边. 因此可以自底向上确定树中哪些节点需要加边,同时得到$1$到环上每个点的距离. 对于每个环, ...
- [linux]crontab 命令执行问题
在服务器上设置了一个R脚本的crontab任务,死活不执行.在网上搜了很久,终于解决了. 这里主要说一下crontab异常时,该如何排查. 假设cron命令为:* * * * Rscript /you ...
- Node.js学习
1. 下载 网址:https://nodejs.org/download/ 2. 添加express框架 如下图,运行Node.js command prompt 在命令行中输入:npm instal ...
- Hadoop IPC的代码结构分析
与IPC相关的代码在org.apache.hadoop.ipc包下.共七个文件,其中4个辅助类: RemoteException Status VersionedProtocol Connection ...
- 【BZOJ2473/2120】维护队列 分块+二分
Description 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色的弹珠有多少.当然,A有时候会 ...
- C程序演示产生僵死进程的过程
先抄录网上一段对僵死进程的描述: 僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中.这种 ...
- 实现UITableView循环利用
tableViewUITableView循环利用 前言 大家都知道UITableView,最经典在于循环利用,这里我自己模仿UITableView循环利用,写了一套自己的TableView实现方案,希 ...
- 从一个QQ群友那儿偷来的js图形 ^_^
<script type="text/javascript"> var head=document.createElement("HEAD"); d ...