//getStyle

 function getStyle(obj,attr){
if(obj.currentStyle){
return obj.currentStyle[attr];
}
else{
return getComputedStyle(obj,false)[attr];
}
}

//getByClass

 function getByClass(oParent,sClass){
var arr = [];
var aEle = oParent.getElementsByTagName("*");
for(var i = 0;i < aEle.length;i ++){
if(aEle[i].className == sClass){
arr.push(aEle[i])
}
}
return arr;
}

//myAddEvent

 function myAddEvent(obj,sEv,fn){
//改造后return false 能同时具有阻止冒泡和默认事件的作用
if(obj.attachEvent){
obj.attachEvent("on"+sEv,function(){
if(false == fn.call(obj)){
event.cancelBubble = true;
return false;
}
});
}
else{
obj.addEventListener(sEv,function(ev){
if(false == fn.call(obj)){
ev.cancelBubble = true;
ev.preventDefault();
}
},false);
}
}

//元素获取

 function jQuery(vArg){
this.elements = [];
switch(typeof vArg){//typeof
case "function":
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));
break;
default:
this.elements = document.getElementsByTagName(vArg);
}
break;
case "object":
this.elements.push(vArg);
}
}

//$拥有jQuery功能

 function $(vArg){
return new jQuery(vArg);
}

//click()

 jQuery.prototype.click = function(fn){
for(var i = 0;i < this.elements.length;i ++){
myAddEvent(this.elements[i],'click',fn);
}
return this;//支持链式操作
};

//css()

 jQuery.prototype.css = function(attr,value){
if(arguments.length == 2){
for(var i = 0;i < this.elements.length;i ++){
this.elements[i].style[attr] = value;
}
}
else{
if(typeof attr == "string"){//typeof
return getStyle(this.elements[0],attr);//获取时不能链式操作,因为到这里就返回了。带单位
}
else{
for(var i = 0;i < this.elements.length;i ++){
var k = "";
for(k in attr){
this.elements[i].style[k] = attr[k];
}
}
}
}
return this;
};

//toggle()  >>  0>fn1; 1>fn2; 2>fn3

 jQuery.prototype.toggle = function(){
var _arguments = arguments;
for(var i = 0;i < this.elements.length;i ++){
addToggle(this.elements[i]);
}
function addToggle(obj){
var count = 0;
myAddEvent(obj,"click",function(){
_arguments[count++ % _arguments.length].call(obj);
});
}
return this;
};

//attr()

 jQuery.prototype.attr = function(name,value){
if(arguments.length == 2){
for(var i = 0;i < this.elements.length;i ++){
this.elements[i][name] = value;
}
}
else{
return this.elements[0][name];
}
return this;
};

//eq()

 jQuery.prototype.eq = function(num){
return $(this.elements[num]);//普通的dom对象变成jQuery对象。单一dom对象的处理方式
};

//find()

 jQuery.prototype.find = function(str){
var aResult = [];
for(var 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);
default:
var aEle = this.elements[i].getElementsByTagName(str);
appendArr(aResult,aEle);
}
}
var newJquery = $();
newJquery.elements = aResult;//数组dom对象的处理方式
return newJquery;
}; function appendArr(arr1,arr2){
for(var i = 0;i < arr2.length;i ++){
arr1.push(arr2[i]);
}
}

//index()

 jQuery.prototype.index = function(){
return getIndex(this.elements[0]);
};

//getIndex()

 function getIndex(obj){
var aBrother = obj.parentNode.children;
for(var i = 0;i < aBrother.length;i ++){
if(aBrother[i] == obj){
return i;
}
}
}

//bind()

 jQuery.prototype.bind = function(sEv,fn){
for(var i = 0;i < this.elements.length; i++){
myAddEvent(this.elements[i],sEv,fn);
}
};

//extend()

 jQuery.prototype.extend = function(name,fn){
jQuery.prototype[name] = fn;
};

//size()

 $().extend("size",function(){
return this.elements.length;
});

//animate()插件

 $().extend("animate",function(json){
for(var i = 0;i < this.elements.length;i ++){
startMove(this.elements[i],json);
}
function startMove(obj,json,fnEnd){
clearInterval(obj.timer);
obj.timer = setInterval(function(){
var oStop = true;
for( var attr in json){
var cur = 0;
if(attr == "opacity"){
cur = Math.round( parseFloat( getStyle(obj,attr) ) * 100 );
}
else{
cur = parseInt( getStyle(obj,attr) );
} var speed = (json[attr] - cur) / 7;
speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed); if(cur != json[attr]){
oStop = false;
}
if(attr == "opacity"){
obj.style.filter = 'alpha(opacity:'+(cur+speed)+')';
obj.style.opacity = (cur + speed) / 100;
}
else{
obj.style[attr] = cur + speed + "px";
}
}
if(oStop){
clearInterval(obj.timer);
fnEnd&&fnEnd();
}
},30);
}
});

//drag()插件

 $().extend('drag',function(){
for(var i = 0;i < this.elements.length;i++){
drag(this.elements[i]);
}
function drag(obj){
var disX = 0;
var disY = 0;
obj.onmousedown = function(ev){
//这里位置的计算一定是mousedown的时候
var oEvent = ev || event;
disX = oEvent.clientX - parseInt( getStyle(obj,"left") );
disY = oEvent.clientY - parseInt( getStyle(obj,"top") ); if(obj.setCapture){
obj.onmousemove = mouseMove;
obj.onmouseup = mouseUp;
obj.setCapture();
}
else{
document.onmousemove = mouseMove;
document.onmouseup = mouseUp;
}
function mouseMove(ev){
var oEvent = ev || event; obj.style.top = oEvent.clientY - disY + "px";
obj.style.left = oEvent.clientX - disX + "px";
}
function mouseUp(){
this.onmousemove = this.onmouseup = null;
if(obj.releaseCapture){
obj.releaseCapture();
}
}
return false;
};
}
});

模拟jQuery的一些功能的更多相关文章

  1. angularJs中怎么模拟jQuery中的this?

    最近自己正在学习angularJs,在学到ng-click时,由于想获取当前点击元素的自身,开始想到了用$index来获取当前元素的索引同样能实现我想要的效果,但是在有些特殊的情况下,使用$index ...

  2. 模拟select控件功能

    直接上代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  3. 在ASP.NET Core使用Middleware模拟Custom Error Page功能

    一.使用场景 在传统的ASP.NET MVC中,我们可以使用HandleErrorAttribute特性来具体指定如何处理Action抛出的异常.只要某个Action设置了HandleErrorAtt ...

  4. 模拟jQuery简单封装ajax

    /*模拟jQuery的写法 (简单写法)*/ var $={}; /*ajax*/ $.ajax = function (options) { /* * 请求 * 1.请求接口 type get po ...

  5. 模拟jQuery库

    用js模拟jQuery方法,体会封装思想 <!DOCTYPE html><html><head><meta charset="UTF-8" ...

  6. ajx技术解析以及模拟jQuery封装

    1.后台处理程序 <%@ page language="java" contentType="text/html; charset=UTF-8" page ...

  7. 基于jQuery带备忘录功能的日期选择器

    今天给大家分享一款基于jQuery带备忘录功能的日期选择器.这款日期控制带有备记忘录功能.有备忘录的日期有一个圆圈,单击圆圈显示备忘录.该实例适用浏览器:360.FireFox.Chrome.Safa ...

  8. Java基础知识强化之IO流笔记53:IO流练习之 自定义类模拟BufferedReader的readLine()功能案例

    1. 用Reader模拟BufferedReader的readLine()功能:   readLine():一次读取一行,根据换行符判断是否结束,只返回内容,不返回换行符 2. 代码实现和思路分析: ...

  9. 自己使用Jquery封装各种功能分享

    自己使用Jquery封装各种功能分享: 左右滚动图片 瀑布流 流动显示列表 广告切换 头像切换And广告切换 获取搜索引擎的来源关键字 上面列表中展示的功能都是使用jquery进行封装实现的,希望大家 ...

随机推荐

  1. Java函数的基本知识

    http://blog.csdn.net/cxwen78/article/details/7322891主要从Java函数的定义,函数的特点,函数的应用,函数的重载四个方面来讲解Java函数. 一.函 ...

  2. XML完成小程序

    XML文档的格式如下: <?xml version="1.0" encoding="utf-8"?> <学生名单> <学生 Nam ...

  3. ubuntu 下开源安装

    常用开源库安装: 0.安装g++: sudo apt-get install g++ 1.首先不可或缺的就是编译器与基本的函式库: sudo apt-get install build-essenti ...

  4. HDU 2242 考研路茫茫——空调教室(边双连通)

    HDU 2242 考研路茫茫--空调教室 题目链接 思路:求边双连通分量.然后进行缩点,点权为双连通分支的点权之和,缩点完变成一棵树,然后在树上dfs一遍就能得出答案 代码: #include < ...

  5. SpringBoot启动流程分析(二):SpringApplication的run方法

    SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...

  6. SQL Server中排名函数row_number,rank,dense_rank,ntile详解

    SQL Server中排名函数row_number,rank,dense_rank,ntile详解 从SQL SERVER2005开始,SQL SERVER新增了四个排名函数,分别如下:1.row_n ...

  7. 数据库ACID操作---事务四原则

    事务操作四原则: 1>原子性:简单来说——整个事务操作如同原子已经是物理上最小的单位,不可分离事务操作要么一起成功,要么一起失败. 2>一致性:倘若事务操作失败,则回滚事务时,与原始状态一 ...

  8. 认识 service worker

    离线缓存可以提升用户体验,可以节省网络资源,但是,浏览器对资源缓存和自定义网络请求的控制一直不够完善,service worker 的出现就是为了解决这些问题 它可以解决目前离线应用的问题,同时也可以 ...

  9. webstorm-----eslint的配置和使用

    https://blog.csdn.net/qq_29329037/article/details/80100450

  10. 【BZOJ2132】圈地计划 最小割

    [BZOJ2132]圈地计划 Description 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地. ...