//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. Python Flask 在Sina App Engine (SAE)上安家

    早就听说了Python的大名,随着的编程语言的理解加深,越发认为动态语言的威力--真大呀. 趁这段时间不忙,我也用Python写了一个应用,而且将其部署到Sina App Engine (SAE).S ...

  2. sprint3 【每日scrum】 TD助手站立会议第四天

    站立会议 组员 昨天 今天 困难 签到 刘铸辉 (组长) 和楠哥学习了通过AlarmManager 来实现闹钟,由于要用到BroadcastReceiver广播协议,所以正在学习中,暂时只是按照教程写 ...

  3. (最短路径算法整理)dijkstra、floyd、bellman-ford、spfa算法模板的整理与介绍

    这一篇博客以一些OJ上的题目为载体.整理一下最短路径算法.会陆续的更新... 一.多源最短路算法--floyd算法 floyd算法主要用于求随意两点间的最短路径.也成最短最短路径问题. 核心代码: / ...

  4. 织梦在广告(myad)中使用css样式

    使用单引号,以及只有style这一个属性

  5. 使用jquery改动表单的提交地址

    基本思路: 通过使用jquery选择器得到相应表单的jquery对象,然后使用attr方法改动相应的action 演示样例程序一: 默认情况下,该表单会提交到page_one.html 点击butto ...

  6. a标签javascript传参不正确的解决办法!

    代码部分: <a href="javascript:void(0);" onClick="findList(${goodsClassify.id})"&g ...

  7. erlang中的图片下载

    问题如题,这是在一个群里问的一个的问题.其实就是http的Server的上传下载的功能.  ibrowse:start().ibrowse:send_req("http://img1.gti ...

  8. shell 获取当前svn代码目录版本号

    在当前svn代码目录下执行以下命令: svn info | grep "Last Changed Rev:" | awk -F ': ' '{print $2}' > svn ...

  9. 模式识别之svm()---支持向量机svm 简介1995

    转自:http://www.blogjava.net/zhenandaci/archive/2009/02/13/254519.html 作者:Jasper 出自:http://www.blogjav ...

  10. Echache整合Spring缓存实例解说

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要介绍了EhCache,并通过整合Spring给出了一个使用实例. 一.EhCac ...