目录
@
转载请注明出处
1.什么是jquery?
jQuery是js的一个库,简化了js代码的书写(注:jQuery语句中用逗号分隔各个css,因为一条css对应一个对象属性,对象属性之间是用逗号分隔而非分号)
举例:
例1:简化了获取元素的语句 + 设置样式的书写变得更加直观好记
例2:jQuery解决了兼容性问题
注:因为jQuery是js的一个库,引入的时候就是一个js文件,所以,我们是可以用原生js代码来修改jQuery文件的?
1.下载jQuery库
压缩版本compressed:体积小,方便网络传输;但不易于阅读。多用于实际使用。
未压缩版本uncompressed: 体积大,便于阅读,多用于开发。
2.引入jQuery库
本地引入:同js一样,用script引入,服从目录语法
网络引入:示例
<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
1.入口函数的加载模式不同:
2.重复为同一元素添加事件的不同
1.\$ (document).ready(function(){......});
2.\$ (function(){......});
3.第一种中的\$ 换成jQuery
4.第二种里的\$ 换成jQuery
我们遵循write less,do more的原则,推荐使用第二种写法。
1.jQuery访问符冲突问题: jQuery框架与其他框架都使用了\$ 时,书写代码时,使用\$ 就会有冲突(后引进的框架覆盖先引进的)。
2.解决办法:
释放访问符\$ 的使用权,改为jQuery。例:
jQuery.noConflict();
jQuery(function(){......});
释放\$ 使用权之后,就不能用\$ 编写jQuery代码了,会无效。
释放操作必须在用jQuery编写代码之前。
自定义新的访问符。例:
var Q = jQuery.noConflict();
Q(function(){......});
1.jQuery核心方法是什么?
jQuery的核心方法就是jQuery(),或者说\$ ().
2.jQuery核心方法接收的参数有哪些情况?
3.jQuery对象详解
jQuery方法框架结构分析:
框架:
仔细看我们就可以发现,这个框架只不过是两个立即执行函数的嵌套:
外层的:(function (window,undefined){})(window)
内层的:var jQuery = (function (){})())
而在内层的IIFE中:
在后面的分析我们会知道--jQuery对象的实质就是jQuery.fn.init的实例,因此结合上图,我们不难发现:
1.自定义的字面量对象就是init的原型对象
2.我们通过jQuery.fn.init或者jQuery.prototype均可访问和修改init的原型
分析完内层,我们接着分析框架中的外层IIFE:
(1) 将内层IIFE的返回值(内层的jQuery函数)赋给外层变量jQuery
(2) 定义全局变量jQuery,\$ ,并将上一步jQuery的值赋给它们(jQuery()与\$ ()的效果相同的原因)
return new jQuery.fn.init(selector, context, rootjQuery);
可知,jQuery方法的返回值,即jQuery对象就是jQuery.fn.init的实例.3.jQuery对象是一个伪数组对象
伪数组对象:
4.使用jQuery与使用原生js有什么区别么?在jQuery中是否能使用原生js代码呢?
1.静态jQuery.ready方法与实例.ready()方法
jQuery.extend = jQuery.fn.extend = function() {
//实现代码
}
‘静态‘jQuery.ready的定义:
源码中的定义形式:
jQuery.extend({
ready:function (){}
});
说明:
(1).此方法返回一个类promise对象,当DOM加载就绪时,该对象变得可以解析.(即:当DOM加载就绪时,可以用该对象访问其属性,调用其方法等等)
(2).该方法的返回值会被jQuery.when,Promise.resolve()以及 .ready()方法中使用
实例方法--.ready()
源码定义如下:
jQuery.fn.ready = function( fn ) {
jQuery.ready.promise().done( fn );//当DOM加载就绪时,调用promise()方法并执行fn函数
return this;
};
说明: .ready(fn) 函数--当DOM加载就绪时执行fn函数
jQuery.holdReady(hold)方法
说明:通过hold(取值:true/false)来延迟/取消延迟jQuery的ready事件.
2.‘静态‘类型检测方法
3.‘静态‘jQuery.each(obj,fn)方法
源码定义: .each(obj,fn)方法是直接定义在jQuery原型上的
each: function( obj, callback ) {
var length, i = 0;
if ( isArrayLike( obj ) ) { //针对类数组
length = obj.length;
for ( ; i < length; i++ ) {
if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
break; //当回调函数返回false时,跳出整个循环
}
}
} else {
for ( i in obj ) { //针对enumerable不为false的一般对象
if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
break; //当回调函数返回false时,跳出整个循环
}
}
}
return obj;
}
源码分析:
(1) 针对类数组对象,对每一个数字键值i,执行obj[i].callback(i,obj[i]).如果遇到某一项返回值为false,跳出循环,终止遍历
(2) 针对一般对象,使用in操作符,对于每一个可遍历键值i,执行obj[i].callback(i,obj[i]).如果遇到某一项返回值为false,跳出循环,终止遍历
总结:
(1) 类数组不遍历非数字键值属性
(2) 一般对象不遍历enumerable为false的属性
(3) 一旦遍历过程中某一次函数调用返回值为false,终止遍历
(4) 整个.each的返回值为被遍历的对象
4.‘静态‘ jQuery.map(elems,callback,arg)方法
源码定义:
// arg is for internal usage only
map: function( elems, callback, arg ) {
var length, value,
i = 0,
ret = [];
// Go through the array, translating each of the items to their new values
if ( isArrayLike( elems ) ) { //针对类数组
length = elems.length;
for ( ; i < length; i++ ) {
value = callback( elems[ i ], i, arg );
if ( value != null ) {
ret.push( value );
} //将value中的值添加到数组末尾,并返回新的数组的长度
}
// Go through every key on the object,
} else {
for ( i in elems ) { //针对enumerable非false的一般对象
value = callback( elems[ i ], i, arg );
if ( value != null ) {
ret.push( value );
} //将value中的值添加到数组末尾,并返回新的数组长度
}
}
// Flatten any nested arrays
return concat.apply( [], ret );
} //Array.prototype.concat(合并数组,返回新数组) + Object.prototype.apply
源码分析:
(1) 针对类数组对象,对每一个数字键值 i ,调用callback( elems[ i ], i, arg ),并将其中非null的返回值添加到数组ret中
(2) 针对一般对象,对每一个属性名 i ,调用callback( elems[ i ], i, arg ),并将其中非null的返回值添加到数组ret中
总结:
(1) 类数组不遍历非数字键值属性
(2) 一般对象不遍历enumerable为false的属性
(3) 便利过程中,某一次函数调用返回值为null时,结果不计入ret中(我们可以灵活控制callback方法的返回值来达到我们想要的效果)
(4) 整个jQuery.map的返回值为被遍历的对象被处理后所得到的数组ret
原文:https://www.cnblogs.com/peterzhangsnail/p/10011071.html