//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. USB协议[转]__总结得很好

    一 枚举过程:◆ 用户将一个USB设备插入USB端口,主机为端口供电,设备此时处于上电状态.◆主机检测设备.◆集线器使用中断通道将事件报告给主机.◆主机发送Get_Port_Status(读端口状态) ...

  2. MySql(六):影响 MySQL Server 性能的相关因素

    MySQL 最多的使用场景是WEB 应用,那么我们就以一个WEB 应用系统为例,逐个分析其系统构成,进行经验总结,分析出数据库应用系统中各个环境对性能的影响. 一.商业需求对性能的影响 这里我们就拿一 ...

  3. 用C语言解决迷宫问题

    #include <stdio.h> #include <stdlib.h> #define ROW 10 #define COL 10 /*迷宫中位置信息*/ typedef ...

  4. less1.5中的减错误

    (@bodywidth)-@leftwidth即在第一个变量外加括号---正确 @bodywidth-@leftwidth即直接使用不加括号--------错误

  5. MVC项目总结

    View命名 View下有多个模块的文件夹,我们根据微软的规定,每个模块下的首页都为Index.cshtml命名 获得当前页面的控制器名称 var currentControllerName = th ...

  6. java中类型的隐式转换

    byte+byte=int,低级向高级是隐式类型转换,高级向低级必须强制类型转换,byte<char<short<int<long<float<double

  7. servletResponse 请求重定向

    package response;/* * 重定向特点: * 1,浏览器会向服务器发送两次请求,意味着就有两个request\response * 2,用重定向技术,浏览器地址栏会发生变化 *  * ...

  8. Android之怎样全屏显示

    三种方法: 1 自己定义主题(见设置自己定义样式和主题一节) http://blog.csdn.net/wei_chong_chong/article/details/47438907 2 使用系统自 ...

  9. Android中List循环遍历性能对照

    在android开发中仅仅要是列表式风格界面我们差点儿都须要用到List来存放数据,在数量非常少的List的话差点儿不论什么一种循环遍历方式总体性能都无区别.可是当我们遇到数据量稍大的时候有必要考虑用 ...

  10. python 基础 1.5 python数据类型(四)--字典

    一.python 数据类型--字典 1.用字符串存储信息,如:存储“姓名,身高,性别”: In [1]: info='Tom 170 M' //字符串存储信息 In [3]: info[0:3] // ...