//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. 浅谈js中的MVC

    MVC是什么? MVC是一种架构模式,它将应用抽象为3个部分:模型(数据).视图.控制器(分发器) 本文将用一个经典的例子todoList来展开 一个事件发生的过程(通信单向流动): 1.用户在视图V ...

  2. 初识Dubbo 系列之6-Dubbo 配置

    配置 Xml配置 配置项说明 具体配置项,请參见:配置參考手冊 (+) API使用说明 假设不想使用Spring配置.而希望通过API的方式进行调用,请參见:API配置 (+) 配置使用说明 想知道怎 ...

  3. Django之tag的使用

    settings.py: #安装 pip install django-taggit INSTALLED_APPS = [ 'myblog', 'taggit', 'django.contrib.ad ...

  4. 对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符。 给定一个字符串(不一定全为字母)A及它的长度n。请返回第一个重复出现的字符。保证字符串中有重复字符,字符串的长度小于等于500。

    // 第一种方法 // ConsoleApplication10.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include < ...

  5. cacti 主机/网络设备流量监控 图解

    1.在配置中找到设备 console —>  Device 2.初次添加 cacti 监控主机的时候是没有任何设备的,所以要选择add 添加你要监控的主机 \

  6. C#高级编程 第十五章 反射

    (二)自定义特性 使自定义特性非常强大的因素时使用反射,代码可以读取这些元数据,使用它们在运行期间作出决策. 1.编写自定义特性 定义一个FieldName特性: [AttributeUsage(At ...

  7. Windows操作系统远程Linux服务器传输文件方法(以EasyDSS云平台、EasyNVR上传部署为例)

    本文转自博客:https://blog.csdn.net/black_3717/article/details/79769406 问题背景: 之前给客户部署我们一款EasyDSS云平台(配合EasyN ...

  8. EasyNVR H5直播流媒体解决方案前端构建之:如何播放自动适配RTMP/HLS直播播放

    之前在进行EasyNVR多屏开发的时候,由于多屏功能不需要在手机端展示出来(pc多播放为RTMP,手机端播放为HLS),因此只注意到了引用videojs来进行rtmp的播放.由于不同项目需求不同,对h ...

  9. maven依赖本地非repository中的jar包【转】

    今天在使用maven编译打包一个web应用的时候,碰到一个问题: 项目在开发是引入了依赖jar包,放在了WEB-INF/lib目录下,并通过buildpath中将web libariary导入. 在e ...

  10. 替代或者与 Redis 配合存储十亿级别列表的数据.

    http://ssdb.io/docs/zh_cn/index.html 用户案例 如果你在生产环境中使用 SSDB, 欢迎你给我发邮件(ssdb#udpwork.com), 我很愿意把你加入到下面的 ...