一、基础知识

1、点击计数

第一种:

     var aBtn=document.getElementsByTagName('input');
var i=0; for(i=0;i<aBtn.length;i++){
addClick(aBtn[i]);
}
function addClick(obj){
var count=0;
obj.onclick=function (){
alert(count++);
};
}

第二种:

     var aBtn=document.getElementsByTagName('input');
var i=0; for(i=0;i<aBtn.length;i++){
(function (obj){
var count=0;
obj.onclick=function (){
alert(count++);
};
})(aBtn[i]);
}

第三种:

     var aBtn=document.getElementsByTagName('input');
var i=0; for(i=0;i<aBtn.length;i++){
aBtn[i].onclick=(function(count){//参数与局部变量等价
return function(){
alert(count++);
}
})(0);
}

2.链式操作

  先在库中设置

 vQuery.prototype.css=function(attr,value){
if(arguments.length==2){//设置样式
var i=0; for(i=0;i<this.elements.length;i++){
this.elements[i].style[attr]=value;
}
}else{//获取样式 if(typeof attr=='string'){
return getStyle(this.elements[0],attr);
}else{
for(i=0;i<this.elements.length;i++){
var k=''; for(k in attr){//循环得到json的值
this.elements[i].style[k]=attr[k];
}
}
}
}
return this;//函数的链式操作
};

  其他方法类似

  然后调用

 $(function(){
$('#btn2').css({'background':'gray','width':'100px'}).toggle(function(str){alert(1);
alert($('#txt1').attr('value'));
},function(){alert(0);
$('#txt1').attr('value',35235345);
}).hover(function(){
$('#div1').hide();
alert($(this).css('width'));
});
});

3.阻止冒泡

先封装

 function myAddEvent(obj,sEv,fn){
if(obj.attachEvent){//IE下
obj.attachEvent('on'+sEv,function(){
if(false==fn.call(obj)){//此处obj为发生事件的那个元素,用 call()解决 this 在 IE 下使用绑定事件的指向问题
event.cancelBubble=true;
return false;
}
});
}else{//ff.chrome下
obj.addEventListener(sEv,function(ev){
if(false==fn.call(obj)){
ev.cancelBubble=true;
ev.preventDefault();
}
},false);
}
}

再调用

 $(document).bind('contextmenu',function(){//阻止右键菜单
alert(0);return false;//console.log($(this));=vQuery
});

4.插件扩展

 $().extend('size',function(){
return this.elements.length;
});
 $(function(){
alert($('div').size());//得到所选元素的个数
});

二、进行封装

 function myAddEvent(obj,sEv,fn){
if(obj.attachEvent){//IE下
obj.attachEvent('on'+sEv,function(){
if(false==fn.call(obj)){//此处obj为发生事件的那个元素,用 call()解决 this 在 IE 下使用绑定事件的指向问题
event.cancelBubble=true;
return false;
}
});
}else{//ff.chrome下
obj.addEventListener(sEv,function(ev){
if(false==fn.call(obj)){
ev.cancelBubble=true;
ev.preventDefault();
}
},false);
}
} function getByClass(oParent,sClass){
var aEle=oParent.getElementsByTagName('*');
var aResult=[];console.log(aEle[0]);
var i=0; for(i=0;i<aEle.length;i++){
if(aEle[i].className==sClass){
aResult.push(aEle[i]);
}
} return aResult;
} function getStyle(obj,attr){
if(obj.currentStyle){
return obj.currentStyle[attr];
}else{
return getComputedStyle(obj,false)[attr];
}
} function vQuery(vArg){
this.elements=[];//用来保存选中的元素 switch(typeof vArg){
case 'function'://console.log(vArg);
myAddEvent(window,'load',vArg);
break;
case 'string':
switch(vArg.charAt(0)){
case '#':
var obj=document.getElementById(vArg.substring(1)); this.elements.push(obj);
break; case '.':
this.elements=getByClass(document,vArg.substring(1));console.log(this.elements);
break; default:
this.elements=document.getElementsByTagName(vArg);
}
break;
case 'object':
this.elements.push(vArg);
}
} vQuery.prototype.click=function(fn){
var i=0;
for(i=0;i<this.elements.length;i++){
myAddEvent(this.elements[i],'click',fn);
} return this;//函数的链式操作
}; vQuery.prototype.show=function(){
var i=0; for(i=0;i<this.elements.length;i++){
this.elements[i].style.display='block';
} return this;//函数的链式操作
}; vQuery.prototype.hide=function(){
var i=0; for(i=0;i<this.elements.length;i++){
this.elements[i].style.display='none';
} return this;//函数的链式操作
}; vQuery.prototype.hover=function(fnOver,fnOut){
var i=0; for(i=0;i<this.elements.length;i++){
myAddEvent(this.elements[i],'mouseover',fnOver);
myAddEvent(this.elements[i],'mouseout',fnOut);
} return this;
}; vQuery.prototype.css=function(attr,value){
if(arguments.length==2){//设置样式
var i=0; for(i=0;i<this.elements.length;i++){
this.elements[i].style[attr]=value;
}
}else{//获取样式 if(typeof attr=='string'){
return getStyle(this.elements[0],attr);
}else{
for(i=0;i<this.elements.length;i++){
var k=''; for(k in attr){
this.elements[i].style[k]=attr[k];
}
}
}
}
return this;//函数的链式操作
}; vQuery.prototype.attr=function(attr,value){
if(arguments.length==2){//设置属性
var i=0; for(i=0;i<this.elements.length;i++){
this.elements[i][attr]=value;
}
}else{//获取属性 return this.elements[0][attr]; } return this;//函数的链式操作
}; vQuery.prototype.toggle=function(){
var i=0;
var _arguments=arguments;//同this一样,arguments也要设置一个变量 for(i=0;i<this.elements.length;i++){
addToggle(this.elements[i]);
}
function addToggle(obj){
var count=0;
myAddEvent(obj,'click',function(){//console.log(arguments);
_arguments[count++%_arguments.length].call(obj);//alert(count++);
});
} return this;//函数的链式操作
}; vQuery.prototype.eq=function(n){
return $(this.elements[n]);
}; function appendArr(arr1,arr2){
var i=0;
for(i=0;i<arr2.length;i++){
arr1.push(arr2[i]);
}
} vQuery.prototype.find=function(str){
var i=0;
var aResult=[];//存放临时数据 for(i=0;i<this.elements.length;i++){
switch(str.charAt(0)){
case '.':
var aEle=getByClass(this.elements[i],str.substring(1)); aResult=aResult.concat(aEle);console.log(aResult);
break;
default:
var aEle=this.elements[i].getElementsByTagName(str); //aResult=aResult.concat(aEle);
appendArr(aResult,aEle);
}
} var newVquery=$();
newVquery.elements=aResult;
return newVquery;
}; function getIndex(obj){
var aBrother=obj.parentNode.children;
var i=0; for(i=0;i<aBrother.length;i++){
if(aBrother[i]==obj){
return i;
}
}
} vQuery.prototype.index=function(){
return getIndex(this.elements[0]);
}; vQuery.prototype.bind=function(sEv,fn){
var i=0; for(i=0;i<this.elements.length;i++){
myAddEvent(this.elements[i],sEv,fn);
}
}; vQuery.prototype.extend=function(name,fn){
vQuery.prototype[name]=fn;//扩展插件
} function $(vArg){
return new vQuery(vArg);
}

三、应用

1.简单的选项卡

 $(function(){

     var aBtn=$('#tab').find('ul').find('li');
var aDiv=$('#tab').find('.box').find('.content'); aBtn.click(function(){
aBtn.attr('className','link');
$(this).attr('className','hover');
aDiv.hide();
aDiv.eq($(this).index()).css('display','block');
});
});

2.淘宝幻灯片上下滑动效果

 $().extend('size',function(){//添加插件
return this.elements.length;
});
$(function(){
var aBtn=$('#play').find('ol').find('li');
var oUl=$('#play').find('ul');
var aLi=oUl.find('li');
var iNow=0;
var timer=null; aBtn.click(function(){
iNow=$(this).index();
tab();
});
function tab(){
aBtn.attr('className','');
aBtn.eq(iNow).attr('className','active');//console.log($(this)); oUl.animate({top:-150*iNow});
}
function timerInter(){
iNow++; if(iNow==aBtn.size()){
iNow=0;
} tab();
}
timer=setInterval(timerInter,2000); $('#play').hover(function(){
clearInterval(timer);
},function(){
timer=setInterval(timerInter,2000);
});
});

封装自己的JS库的更多相关文章

  1. 尝试封装自己的js库

    学了js,用过jquery,然后想着让自己在js这一块有更深的提高,就想尝试着封装自己的js库,偶尔就添加自己想到的功能.有参考过其他大牛封装库的方法,不懂的地方也有借鉴过,但代码还是自己想,自己理解 ...

  2. 仿照jquery封装一个自己的js库(一)

    所谓造轮子的好处就是复习知识点,加深对原版jquery的理解. 本文系笔者学习jquery的笔记,记述一个名为"dQuery"的初级版和缩水版jquery库的实现.主要涉及知识点包 ...

  3. 封装常用的js(Base.js)——【01】理解库,获取节点,连缀,

    封装常用的js(Base.js)——[01]理解库,获取节点,连缀,  youjobit07 2014-10-10 15:32:59 前言:       现如今有太多优秀的开源javascript库, ...

  4. JsQuick--个人封装的Js库

    JsQuick 该库为本人封装的Js库,尚未进行浏览器兼容 /** * 快速框架 版本:1.0.0 * 日期:2015.02.26 * 作者:简楚恩 */ /** * 快速获取控件类 */ var $ ...

  5. 仿照jquery封装一个自己的js库

    所谓造轮子的好处就是复习知识点,加深对原版jquery的理解.本文系笔者学习jquery的笔记,记述一个名为"dQuery"的初级版和缩水版jquery库的实现.主要涉及知识点包括 ...

  6. 仿照jquery封装一个自己的js库(二)

    本篇为完结篇.主要讲述如何造出轮子的高级特性. 一. css方法的高级操作 先看本文第一部分所讲的dQuery css方法 //css方法 dQuery.prototype.css=function( ...

  7. 在Vue将第三方JS库封装为组件使用

    第三方JS库地址:https://github.com/inorganik/CountUp.js 使用NPM进行安装: npm install --save countup 根据官方回答,CountU ...

  8. js库写法

    前言: 现在javascript库特别多,其写法各式各样,总结几种我们经常见到的,作为自己知识的积累.而目前版本的 JavaScript 并未提供一种原生的.语言级别的模块化组织模式,而是将模块化的方 ...

  9. ABP+AdminLTE+Bootstrap Table权限管理系统第七节--登录逻辑及abp封装的Javascript函数库

    经过前几节,我们已经解决数据库,模型,DTO,控制器和注入等问题.那么再来看一下登录逻辑.这里算是前面几节的一个初次试水. 首先我们数据库已经有的相应的数据. 模型和DTO已经建好,所以我们直接在服务 ...

随机推荐

  1. mysql概要(十五)存储过程

    1.定义: 2.查看所有存储过程: show procedure status; 3.创建存储过程: create procedure 存储过程名字(参数) begin s1l语句; end$     ...

  2. mysql与mysqld

    mysql是客户机/服务器的结构. mysql是客户端行工具,连接mysqld服务,执行sql命令,可认为客户端sdk mysqld 启动mysql数据库服务. 脚本启动mysql服务的命令是 net ...

  3. oracle 性能优化建议小结

    原则一:注意WHERE子句中的连接顺序: ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHER ...

  4. Python学习笔记16—电子表格

    openpyl 模块是解决 Microsoft Excel 2007/2010 之类版本中扩展名是 Excel 2010 xlsx/xlsm/xltx/xltm 的文件的读写的第三方库. 安装 pip ...

  5. C++—函数探幽

    一.内联函数 1.内联函数的机制 内联函数是C++为提高程序运行速度而做的一项改进. 函数调用机制:常规函数调用使程序使程序跳到被掉函数的地址,并在函数结束时返回. 内联函数的机制:内联函数的代码与其 ...

  6. golang学习之beego框架配合easyui实现增删改查及图片上传

    golang学习之beego框架配合easyui实现增删改查及图片上传 demo目录: upload文件夹主要放置上传的头像文件,main是主文件,所有效果如下: 主页面: 具体代码: <!DO ...

  7. select动态增加option

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...

  8. 【linux命令】:查看当前登录用户的信息,本文介绍3种方法

    作为系统管理员,你可能经常会(在某个时候)需要查看系统中有哪些用户正在活动.有些时候,你甚至需要知道他(她)们正在做什么.本文为我们总结了4种查看系统用户信息(通过编号(ID))的方法. 1. 使用w ...

  9. hdu5823(反演dp)

    听说3^n也能水过去.. 其实应该是个经典题,求图染色这个np问题. 把问题拆成独立集来进行dp可以在3^n之内水过去. 拆成独立集的时候就发现,等价与一个经典的反演dp问题 然后复杂度就变成了 n* ...

  10. 最大堆的插入/删除/调整/排序操作(图解+程序)(JAVA)

    堆有最大堆和最小堆之分,最大堆就是每个节点的值都>=其左右孩子(如果有的话)值的完全二叉树.最小堆便是每个节点的值都<=其左右孩子值的完全二叉树. 设有n个元素的序列{k1,k2,..., ...