jQuery1.5.1 animate方法源码阅读

复制代码 代码如下:

/*7536-7646*/
animate: function( prop, speed, easing, callback ) {
if ( jQuery.isEmptyObject( prop ) ) {
return this.each( optall.complete );
}
//#7864行this.options.complete.call( this.elem )使得其可以不断的连续执行动画,比如$(‘selector').animate({prop1},speed1).animate({prop2},speed2)这样的动画队列;
return this[ optall.queue === false ? "each" : "queue" ](function() {
// XXX 'this' does not always have a nodeName when running the
// test suite
var opt = jQuery.extend({}, optall), p,
isElement = this.nodeType === 1,
hidden = isElement && jQuery(this).is(":hidden"),
self = this;
//要执行动画的prop,prop一般是一个plainObj,形如{key1:value1,key2:value2};
for ( p in prop ) {
//驼峰改写,有些比如magrin-top需要变成驼峰的属性即变成marginTop;见cameCase方法;
var name = jQuery.camelCase( p );
//fix属性;主要是前面camelcase的属性;
if ( p !== name ) {
prop[ name ] = prop[ p ];
delete prop[ p ];
p = name;
}
//如果执行$(..).show||$(..).hide;如果这个元素本身是hidden,而动画里面又写hide,直接运行callbacks就可以了;
if ( prop[p] === "hide" && hidden || prop[p] === "show" && !hidden ) {
return opt.complete.call(this);
}
//如果prop[key]==(height||width)并且是一个dom元素;需要有些特殊的处理;
if ( isElement && ( p === "height" || p === "width" ) ) {
// Make sure that nothing sneaks out
// Record all 3 overflow attributes because IE does not
// change the overflow attribute when overflowX and
// overflowY are set to the same value
opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];

// Set display property to inline-block for height/width
// animations on inline elements that are having width/height
// animated
if ( jQuery.css( this, "display" ) === "inline" &&
jQuery.css( this, "float" ) === "none" ) {
if ( !jQuery.support.inlineBlockNeedsLayout ) {
this.style.display = "inline-block";

} else {
var display = defaultDisplay(this.nodeName);

// inline-level elements accept inline-block;
// block-level elements need to be inline with layout
if ( display === "inline" ) {
this.style.display = "inline-block";

} else {
this.style.display = "inline";
this.style.zoom = 1;
}
}
}
}
//如果prop[key]是一个数组;只用第一个值prop[p][0];
if ( jQuery.isArray( prop[p] ) ) {
// Create (if needed) and add to specialEasing
(opt.specialEasing = opt.specialEasing || {})[p] = prop[p][1];
prop[p] = prop[p][0];
}
}

if ( opt.overflow != null ) {
//如果动画元素的overflow已经被设置的情况下,把它暂时为hidden;
this.style.overflow = "hidden";
}
//当前动画键值对,其实就是prop;
opt.curAnim = jQuery.extend({}, prop);
//这里便是动画的核心了,对每一个prop[key]进行处理;
jQuery.each( prop, function( name, val ) {
//获取一个Fx对象;传入的每一个参数都被设置成为这个对象的属性;其中self是指动画元素自身;opt是前面产生的对象;
var e = new jQuery.fx( self, opt, name );
//当执行show||hide操作的时候prop==fxAttrs(参见show||hide方法)
if ( rfxtypes.test(val) ) {
e[ val === "toggle" ? hidden ? "show" : "hide" : val ]( prop );
} else {
var parts = rfxnum.exec(val),
//start保存了初始值,它可能在style,也可能在css中,如果该值==null,undefiend,auto,0等将被设置为0;
start = e.cur();
if ( parts ) {
//end是指变化量的大小,比如:{left:-=66px},那么end=66;
var end = parseFloat( parts[2] ),
//单元运算符,就是px,%;如果是一些不能带单位的,比如z-index,设置为空,否则就设置为px;
unit = parts[3] || ( jQuery.cssNumber[ name ] ? "" : "px" );
// We need to compute starting value
//如果不是px,比如%,em等等;
if ( unit !== "px" ) {
//设置该属性值name为(end || 1) + unit,如果end=0;设置为1;开始值被设置为start = ((end || 1) / e.cur()) * start;
jQuery.style( self, name, (end || 1) + unit);
//这里e.cur()和前面的start = e.cur();是不一样的,因为jQuery.style( self, name, (end || 1) + unit)的执行使得start被改变;用于处理end=0的情况;因为e.cur()作为除数,不能为0;
start = ((end || 1) / e.cur()) * start;
jQuery.style( self, name, start + unit);
}

// If a +=/-= token was provided, we're doing a relative animation
if ( parts[1] ) {
//end相应的被设置为运算后的变量值;
end = ((parts[1] === "-=" ? -1 : 1) * end) + start;
}
e.custom( start, end, unit );
//如果没有数字化的运算;那么没传入的只能是'';
} else {
e.custom( start, val, "" );
}
}
});

// For JS strict compliance
return true;
});
},

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
废话不多说,直接奉上代码 JS script type="text/javascript"function Sum(arg1,arg2){ //数值加法函数var sarg1 = new String(arg1); //将传入的参数转为字符串以便进行参数检查var sarg2 = new String(arg2); //将参数2转为字符类型if( (sarg1=="")||(sarg2=="") ) //确保参数不为空{var e0 = new Error(); //当有参数为空则抛出异常e0.Seria
本文实例讲述了基于jQuery实现的旋转彩圈。分享给大家供大家参考。具体实现方法如下: !DOCTYPE htmlhtmlheadscript src="jquery-1.7.1.min.js"/scriptscriptfor(var i=0;i100000;i++){if(i%4==0)setTimeout("$('#div1').css({'border-left':'40px solid red','border-bottom':'40px solid green','border-right':'
当今 JavaScript 大行其道,各种应用对其依赖日深。web 程序员已逐渐习惯使用各种优秀的 JavaScript 框架快速开发 Web 应用,从而忽略了对原生 JavaScript 的学习和深入理解。所以,经常出现的情况是,很多做了多年 JS 开发的程序员对闭包、函数式编程、原型总是说不清道不明,即使使用了框架,其代码组织也非常糟糕。这都是对原生 JavaScript 语言特性理解不够的表现。要掌握好 JavaScript,首先一点是必须摒弃一些其他高级语言如 Java、C# 等类式面向对象思维的
具体如何屏蔽更多的快捷键可以自行google搜索。 这里要说的是如何屏蔽后去执行自定义的事件。 这里为了方便使用的Kibo做例子,使用google搜索出来的结果一般都是javascript原生实现,很简单的,这里不做介绍。 这里是实现了在一个textarea中enter进行保存的例子,屏蔽掉了原来的回车事件。 代码如下: 复制代码 代码如下: //键盘监听 var areaKey = new Kibo($("#aac010")[0]); areaKey.down('enter',doSave); funct
在这之前我们比较值使用两等号 “==” 或 三等号“===”, 三等号更加严格,只要比较两方类型不同立即返回false。 另外,有且只有一个值不和自己相等,它是NaN 现在ES6又加了一个Object.is,让比较运算的江湖更加混乱。多数情况下Object.is等价于“===”,如下 1 === 1 // trueObject.is(1, 1) // true 'a' === 'a' // trueObject.is('a', 'a') // true true === true // trueObjec
复制代码 代码如下: ?php /* ?xml version="1.0" encoding="utf-8"? article item title name="t1"/title contentcontent1/content pubdate2009-10-11/pubdate /item item title name="t2"title2/title contentcontent2/content pubdate2009-11-11/pubdate /item /article */ /* 使用DO
本文实例讲述了JS+CSS实现模仿浏览器网页字符查找功能的方法。分享给大家供大家参考。具体实现方法如下: 复制代码 代码如下: html head titleJS+CSS模仿的网页字符查找功能/title style type=text/css BODY { FONT-SIZE: 12px; LETTER-SPACING: 1pt; LINE-HEIGHT: 22px; MARGIN-LEFT: 5pt; MARGIN-TOP: 5pt } #scontentmain { HEIGHT: 30px; PO
复制代码 代码如下: !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" html xmlns="http://www.w3.org/1999/xhtml" head meta http-equiv="Content-Type" content="text/html; charset=utf-8" / titlecrea
JavaScript数组的splice()方法改变数组的内容,增加了新的元素,同时消除旧元素。 语法 array.splice(index, howMany, [element1][, ..., elementN]); 下面是参数的详细信息: index : 在该索引开始改变的数组。 howMany : 整数,表示旧数组元素数去除。如果的howmany为0,没有元素被删除。 element1, ..., elementN : 元素添加到数组。如果不指定任何元素,拼接只需删除该数组中的元素。 返回值: 返回
福利彩票的双色球号码是由6个红球号码和1个篮球号码组成的,其中,6个红球号码是从01到33中随机抽出的6个数字,1个篮球号码是从01到16中随机抽出的1个数字。6个红球号码通常按照从小到大的顺序排列。下面是JavaScript中生成一注双色球号码的方法,供大家参考! var redBall = new Array();var redLen = redBall.length;while(redLen6){ var ball = ranNumber(1,33); var flag = true; for(va