【学】jQuery的源码思路6——增加each,animaion,ajax以及插件机制
- each()
 - 插件机制
 - animation
 - ajax
 
//each()
//这里第一个参数指定将this指向每次循环到的那个元素身上,而第三个参数element其实就是this本身所以和第一个参数是一样的,而第二个参数是每次循环的下标
zQuery.prototype.each=function(fn){
    for(var i=0;i<this.elements.length;i++){
        fn.call(this.elements[i],i,this.elements[i]);
    }
};
//插件机制
$.fn=zQuery.prototype;  //引用,如果只绑定一个插件,就直接写$.fn.toRed = function(){}...,相当于直接将toRed函数挂到zQuery.prototype上,可以进行zQuery对象调用
//如果是挂多个插件,将函数参数中的json循环,挂在到zQuery.prototype中
$.fn.extend=function(json){
    for(var key in json){
        //key == tored/toYellow
        //json[key]   ==  fn
        zQuery.prototype[key]=json[key];
    }
};
$.ajax = ajax; //将ajax函数挂在到$.ajax上
//animation
zQuery.prototype.animate=function(json,options){
    for(var i=0;i<this.elements.length;i++){
        move(this.elements[i],json,options);
    }
};
//ajax封装
function ajax(options){
    //-1.整理options
    options=options||{};
    options.data=options.data||{};
    options.type=options.type||'get';
    options.timeout=options.timeout||0;
    //0.整理data json  --> string
    options.data.t=Math.random();
    var arr=[];
    for(var key in options.data){
        arr.push(key+'='+encodeURIComponent(options.data[key]));
    }
    var str = arr.join('&');
    //1.创建ajax
    if(window.XMLHttpRequest){
        var oAjax=new XMLHttpRequest();
    }else{
        var oAjax=new ActiveXObject('Microsoft.XMLHTTP');
    }
    if(options.type=='get'){//get
        //2.建立连接
        oAjax.open('get',options.url+'?'+str,true);
        //3.发送
        oAjax.send();
    }else {//post
        //2.建立连接
        oAjax.open('post',options.url,true);
        //设置请求头
        oAjax.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
        oAjax.send(str);
    }
    //4.接收
    oAjax.onreadystatechange=function(){
        if(oAjax.readyState==4){
            clearTimeout(timer);
            if(oAjax.status>=200 && oAjax.status<300 || oAjax.status==304){
                options.success && options.success(oAjax.responseText);
            }else{
                options.error && options.error(oAjax.status);
            }
        }
    }
    //5.超时
    if(options.timeout){
        var timer=setTimeout(function(){
            //数据不要了	,你别加载
            oAjax.abort();//中断ajax请求,也会触发readyState==4
        },options.timeout);
    }
}
//运动函数的封装
function move(obj,json,options){
    //整理可选参数
    options = options || {};
    options.duration = options.duration || 300;
    options.complete = options.complete || null;
    options.easing = options.easing || 'ease-out';
    var start={};
    var dis={};
    for(var key in json){
        start[key]=parseFloat(getStyle(obj,key));
        if(isNaN(start[key])){
            switch(key){
                case 'width':
                    start[key]=obj.offsetWidth;
                    break;
                case 'height':
                    start[key]=obj.offsetHeight;
                    break;
                case 'opacity':
                    start[key]=1;
                    break;
                case 'left':
                    start[key]=0;
                    break;
                case 'top':
                    start[key]=0;
                    break;
                //marginLeft/top...	padding
            }
        }
        dis[key]=json[key]-start[key];
    }
    var count=Math.round(options.duration/30);
    var n=0;
    clearInterval(obj.timer);
    obj.timer=setInterval(function(){
        n++;
        for(var key in json){//办事部分包起来
            switch(options.easing){
                case 'linear':
                    var a=n/count;//	匀速运动
                    var cur=start[key]+dis[key]*a;
                    break;
                case 'ease-in':
                    var a=n/count;//	加速运动
                    var cur=start[key]+dis[key]*(a*a*a);
                    break;
                case 'ease-out':
                    var a=1-n/count;//	减速运动
                    var cur=start[key]+dis[key]*(1-a*a*a);
                    break;
            }
            if(key=='opacity'){
                obj.style.opacity=cur;
                obj.style.filter='alpha(opacity='+cur*100+')';
            }else{
                obj.style[key]=cur+'px';
            }
        }
        if(n==count){
            clearInterval(obj.timer);
            options.complete && options.complete();
        }
    },30);
}
												
											【学】jQuery的源码思路6——增加each,animaion,ajax以及插件机制的更多相关文章
- 【学】jQuery的源码思路4——增加一些功能
		
本文说一些简单的jQuery实现原理 eq() get() hide() show() index() find() //返回找到的一组元素中的第n个 zQuery.prototype.eq=func ...
 - 【学】jQuery的源码思路5——增加class的操作
		
hasClass, addClass, removeClass, toggleClass //addClass,加入class会对元素,利用正则,将class中多余的空格去掉 zQuery.proto ...
 - 【学】jQuery的源码思路1——后代选择器
		
jQuery的源码思路1--后代选择器 这里探讨一下jQuery中后代选择器的封装原理,并自己写一下 getEle('#div1 ul li .box');接受的参数就是个后代选择器,类似于这样: # ...
 - 【学】jQuery的源码思路2——$符号是如何封装的
		
jQuery中的$符号功能很强大,原因在于对函数参数的个数以及种类的控制,还有对于面向对象思想的运用 function jQuery(args){ //接受参数,并对其判断 this.elements ...
 - 【学】jQuery的源码思路3——添加事件及其他
		
这段添加的方法有: 各类事件函数 css() addEvent() toggle() //添加各种事件,将常用的事件名称放入数组,然后循环着加入到zQuery对象的原型上 var eventArr = ...
 - 【深入浅出jQuery】源码浅析--整体架构
		
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
 - jQuery.Callbacks 源码解读二
		
一.参数标记 /* * once: 确保回调列表仅只fire一次 * unique: 在执行add操作中,确保回调列表中不存在重复的回调 * stopOnFalse: 当执行回调返回值为false,则 ...
 - jQuery.attributes源码分析(attr/prop/val/class)
		
回顾 有了之前的几篇对于jQuery.attributes相关的研究,是时候分析jQuery.attr的源码了 Javascript中的attribute和property分析 attribute和p ...
 - 【深入浅出jQuery】源码浅析2--奇技淫巧
		
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
 
随机推荐
- 关于 Record & TList 的一点吐槽
			
需求是把record 保存在TList中,并可以随时改变TList中Items的各项值. 代码很简单: MyRec = record MyStr: string; constructor Create ...
 - Linux 中断处理浅析
			
最近在研究异步消息处理, 突然想起linux内核的中断处理, 里面由始至终都贯穿着"重要的事马上做, 不重要的事推后做"的异步处理思想. 于是整理一下~ 第一阶段--获取中断号 每 ...
 - Winform绑定数据源的几种方式?
			
第一种:DataSet ds=new DataSet (); this.dataGridView1.DataSource=ds.Table[0]; 第二种:DataTable dt=new DataT ...
 - ARP 扫描主机学习笔记
			
1.通用套接字地址结构与具体套接字地址结构之间可相互转化 1)通用转具体,某些函数将结果存储在通用套接字地址结构中,这时将通用转换为具体,具体通过访问成员名可以方便的得到结果. 2)具体转通用,为了消 ...
 - linux 64位调用
			
linux系统中64位汇编和32位汇编的系统调用主要有以下不同:(1)系统调用号不同.比如x86中sys_write是4,sys_exit是1:而x86_64中sys_write是1, sys_exi ...
 - 1 error C4996: 'pcl::SAC_SAMPLE_SIZE':
			
使用PCL1.8 中使用粗配准拼接 错误 1 error C4996: 'pcl::SAC_SAMPLE_SIZE': This map is deprecated and is kept onl ...
 - odoo server命令行以及配置文件
			
odoo server 启动时 def main(args): check_root_user() odoo.tools.config.parse_config(args) check_postgre ...
 - 使用TCP的HelloServer
			
HelloServer是一个在1234端口监听的服务端程序,它接受客户送来的数据,并且把这些数据解释为响应的ASCII字符,再对客户做出类似“Hello,...!"这样的响应.以下是Hell ...
 - 《java编程思想》读书笔记(一)开篇&第五章(1)
			
2017 ---新篇章 今天终于找到阅读<java编程思想>这本书方法了,表示打开了一个新世界. 第一章:对象导论 内容不多但也有20页,主要是对整本书的一个概括.因为已经有过完整JAV ...
 - Membership基本用法
			
MemberShip简介: Membership是Asp.Net框架,用于管理网站的用户Membership,角色Roles以及配置信息Profile. System.Web.Security.Mem ...