• 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以及插件机制的更多相关文章

  1. 【学】jQuery的源码思路4——增加一些功能

    本文说一些简单的jQuery实现原理 eq() get() hide() show() index() find() //返回找到的一组元素中的第n个 zQuery.prototype.eq=func ...

  2. 【学】jQuery的源码思路5——增加class的操作

    hasClass, addClass, removeClass, toggleClass //addClass,加入class会对元素,利用正则,将class中多余的空格去掉 zQuery.proto ...

  3. 【学】jQuery的源码思路1——后代选择器

    jQuery的源码思路1--后代选择器 这里探讨一下jQuery中后代选择器的封装原理,并自己写一下 getEle('#div1 ul li .box');接受的参数就是个后代选择器,类似于这样: # ...

  4. 【学】jQuery的源码思路2——$符号是如何封装的

    jQuery中的$符号功能很强大,原因在于对函数参数的个数以及种类的控制,还有对于面向对象思想的运用 function jQuery(args){ //接受参数,并对其判断 this.elements ...

  5. 【学】jQuery的源码思路3——添加事件及其他

    这段添加的方法有: 各类事件函数 css() addEvent() toggle() //添加各种事件,将常用的事件名称放入数组,然后循环着加入到zQuery对象的原型上 var eventArr = ...

  6. 【深入浅出jQuery】源码浅析--整体架构

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  7. jQuery.Callbacks 源码解读二

    一.参数标记 /* * once: 确保回调列表仅只fire一次 * unique: 在执行add操作中,确保回调列表中不存在重复的回调 * stopOnFalse: 当执行回调返回值为false,则 ...

  8. jQuery.attributes源码分析(attr/prop/val/class)

    回顾 有了之前的几篇对于jQuery.attributes相关的研究,是时候分析jQuery.attr的源码了 Javascript中的attribute和property分析 attribute和p ...

  9. 【深入浅出jQuery】源码浅析2--奇技淫巧

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

随机推荐

  1. ThinkPHP M函数疑点

    模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写,然后加上模型层的名称(默认定义是Model),例如: 模型名 约定对应数据表(假设数据库的前缀定义是 think_) User ...

  2. Kruskal(测试源代码)

    1.此程序为c++程序 2.以下代码可实现手动输入,即去掉代码中的/*...*/注释符,并同时去掉赋值代码段 3.源代码 #include<iostream> using namespac ...

  3. 解决Android应用安装快完毕时提示签名冲突

    最近开发了一个Android手机应用,自己用Eclipse调试安装没问题,使用其他人调试生成的bin下的apk就会出现问题,安装到最后提示"安装签名冲突"错误,想了一下估计是没有给 ...

  4. RPM方式安装MySQL5.6

    原文转自:http://blog.csdn.net/liumm0000/article/details/18841197 未整理! RPM方式安装MySQL5.6 a. 检查MySQL及相关RPM包, ...

  5. css3背景图水平垂直顺时针逆时针翻转旋转

    .bgPlay{ background:url(../images/bg.jpg) no-repeat; /* background-size:auto auto || cover 代表以宽或高填满元 ...

  6. iOS 动态下载系统提供的中文字体

    使用系统提供的中文字体,既可避免版权问题,又可以减小应用体积 #pragma mark - 判断字体是否已经被下载 - (BOOL)isFontDownLoaded:(NSString *)fontN ...

  7. C#中as用法

    在程序中,进行类型转换时常见的事,C#支持基本的强制类型转换方法,例如 Object obj1 = new NewType();NewType newValue = (NewType)obj1;这样强 ...

  8. MyEclipse使用前优化与配置

    全局优化 1 设置默认编码方式 首选项>  General > Workspace >  GBK改成UTF-8 2 设置默认文件默认打开方式 首选项>  General > ...

  9. JQuery 控制元素显示隐藏

    JS在浏览器里面做调试的时候,先在浏览器里面找到页面代码加上断点来执行.然后根据执行情况来查找部分变量是否能找到,一点一点的排查内容.可以做筛选条件 部分隐藏.默认让部分条件加上.hide 默认隐藏, ...

  10. PHP mysql_fetch_array() 函数

    PHP mysql_fetch_array() 函数 从结果集中取得一行作为关联数组,或数字数组,或二者兼有.返回根据结果集取得的行生成的数组,如果没有更多行则返回false. 提示:有很重要的一点必 ...