介绍:JQuery是继prototype之后又一个优秀的Javascript库。它是轻量级的js库 ,它兼容CSS3,还兼容各种浏览器(IE 6.0+, FF1.5+, Safari 2.0+, Opera 9.0+),jQuery2.0及后续版本将不再支持IE6/7/8浏览器。jQuery使用户能更方便地处理HTML、events、实现动画效果,并且方便地为网站提供AJAX交互。jQuery还有一个比较大的优势是,它的文档说明很全,而且各种应用也说得很详细,同时还有许多成熟的插件可供选择。jQuery能够使用户的html页面保持代码和html内容分离,也就是说,不用再在html里面插入一堆js来调用命令了,只需要定义id即可。

jQuery是一个兼容多浏览器的javascript库,核心理念是write less,do more(写得更少,做得更多)。
jQuery是免费、开源的,使用MIT许可协议。jQuery的语法设计可以使开发更加便捷,例如操作文档对象、选择DOM元素、制作动画效果、事件处理、使用Ajax以及其他功能。除此以外,jQuery提供API让开发者编写插件。其模块化的使用方式使开发者可以很轻松的开发出功能强大的静态或动态网页

1.$.each函数 原生js实现 

 var gt={
each:function (object,callback)
{
var type=(function () {
//分为不同的几个类型
switch (object.constructor){
case Object:
return 'Object';
break;
case Array:
return 'Array';
break;
case NodeList:
return 'NodeList';
break;
case HTMLCollection:
return 'HTMLCollection'
default:
return 'null';
break;
}
})()
//为数组或者类数组 的情况下
if(type==="Array" || type==='NodeList' || type==='HTMLCollection'){
//由于存在类数组的nodelist和HTMLCollection,所以不能直接调用every方法
//every() 方法用于检测数组所有元素是否都符合指定条件(使用指定函数检测数组中的所有元素)。
//如果数组中检测到有一个元素不满足,则整个表达式返回 false ,且剩余的元素不会再进行检测,当且仅当所有元素都满足条件,则返回 true。
//注意: every() 不会对空数组进行检测,不会改变原始数组。
//用法 array.every(function(currentValue,index,arr), thisValue)
/*
* function(currentValue, index,arr) 必须。函数,数组中的每个元素都会执行这个函数
函数参数:
参数 描述
currentValue 必须。当前元素的值
index 可选。当前元素的索引值
arr 可选。当前元素属于的数组对象
thisValue 可选。对象作为该执行回调时使用,传递给函数,用作 "this" 的值。
如果省略了 thisValue ,"this" 的值为 "undefined"
*/
[].every.call(object,function (v,i) {
return callback.call(v,i,v) === false?false:true;
})
//为对象的情况下
}else if(type==="Object"){
for(var i in object){
if(callback.call(object[i],i,object[i])===false){
break;
}
}
}
}
}

  调用执行

   //数组调用
gt.each([1,2,3,4],function (i, v) {
console.log(v)
})
//对象调用
gt.each([{name:"GT",age:10},{name:"Alice",age:11},{name:"Mike",age:12},{name:"Joe",age:13}],function (i, v) {
console.log(v.name +'今天'+v.age+'岁了')
})
//元素集调用 两种元素集类型
var ele=document.getElementsByClassName('eachListLi') //HTMLCollection
var ele2= document.querySelectorAll('.eachListLi'); //NodeList
gt.each(ele,function (i, v) {
console.log(v)
})
gt.each(ele2,function (i, v) {
console.log(i+':'+v)
})

   执行结果:

      对于两个js方法的解释:

    (1)   every方法   如果数组中检测到有一个元素不满足,则整个表达式返回 false ,且剩余的元素不会再进行检测 当且仅当 所有元素都满足条件的时候 返回true

   

    (2)  call方法    

    call 和 apply 两个方法的第一个实参 是要调用函数的母对象 ,他是调用上下文 ,在函数提内通过this的来获取对他的引用。要想以对象 o的方法 来调用函数f(),可以这样使用call 和apply

  f.call(o)
f.apply(o)
//上面两个实现功能和下面的类似 假设o对象中不存在m方法
o.m=f;//将f存储为o的临时方法
o.m();//执行方法 不传参数
delete o.m //删除临时方法

  在es5严格模式中,call 和apply 的第一个实参会变成this的值,哪怕传入的实参的原始值是null 或者undefined ,在非严格模式中,传入的null和undefined 会被全局对象代替 ,而其他原始值则会被相应的包装对象代替

  call 、bind 、 apply 这三个函数的第一个参数都是 this 的指向对象,第二个参数差别如下:

  call 的参数是直接放进去的,第二第三第 n 个参数全都用逗号分隔,直接放到后面 function.call(obj1,参数1, ... ,参数n )

  apply 的所有参数都必须放在一个数组里面传进去 function.apply(obj1,[参数1, ..., 参数n])

  bind 除了返回是函数以外,它的参数形式和 call 一样。

当然,三者的参数不限定是 string 类型,允许是各种类型,包括函数 、 object 等等!

在看 jq是如何实现的

 //jq定义的each方法
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;
}
}
} else {
//对象类型
for ( i in obj ) {
if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
break;
}
}
} return obj;
},

  检验是否为类数组的方法

 //类数组
function isArrayLike( obj ) { // Support: real iOS 8.2 only (not reproducible in simulator)
// `in` check used to prevent JIT error (gh-2145)
// hasOwn isn't used here due to false negatives
// regarding Nodelist length in IE
//支持:仅限真正的iOS 8.2(在模拟器中不可重现)
//`in`检查用于防止JIT错误(gh-2145)
// 此处未使用hasOwn
//关于IE中的Nodelist长度 这一点不知道会有什么影响 可能是为了兼容
var length = !!obj && "length" in obj && obj.length,
type = toType( obj );
//当对象 是 方法和window对象的时候 直接 返回false
if ( isFunction( obj ) || isWindow( obj ) ) {
return false;
}
//只有 1.类型为数组 2.长度为0 3.为数字类型 且长度大于1 ( length - 1 ) in obj的情况下 返回ture
return type === "array" || length === 0 ||
typeof length === "number" && length > 0 && ( length - 1 ) in obj;
}

  初步判断类型的方法 声明了两个变量

var class2type = {};

var toString = class2type.toString;

 toType的方法

//toType的方法  初步判断类型的方法
function toType( obj ) {
//当obj为null 是 返回null 类型字符串
if ( obj == null ) {
return obj + "";
} // Support: Android <=2.3 only (functionish RegExp)
//支持:Android <= 2.3(功能RegExp)
//当为 对象和方法的时候 取class2type对象中的toString.call( obj )             这一块没看懂
//或者直接返回object类型 当不为对象 方法 null的情况下 使用typeof 判断后返回类型
return typeof obj === "object" || typeof obj === "function" ?
class2type[ toString.call( obj ) ] || "object" :
typeof obj;
}

  总结 $.each的方法实现 首先要 分开类型 数组 和对象 然后 数组用for 循环 对象用 for in 循环完成

2.元素事件列表说明
注:不带参数的函数,其参数为可选的 fn。jQuery不支持form元素的reset事件。
事件 描述 支持元素或对象

blur( )                             元素失去焦点 a, input, textarea, button, select, label, map, area
change( )                       用户改变域的内容 input, textarea, select
click( )                             鼠标点击某个对象 几乎所有元素
dblclick( )                        鼠标双击某个对象 几乎所有元素
error( )                          当加载文档或图像时发生某个错误 window, img
focus( )                         元素获得焦点 a, input, textarea, button, select, label, map, area
keydown( )                   某个键盘的键被按下 几乎所有元素
keypress( )                   某个键盘的键被按下或按住 几乎所有元素
keyup( )                       某个键盘的键被松开 几乎所有元素
load( fn )                        某个页面或图像被完成加载 window, img
mousedown( fn )          某个鼠标按键被按下 几乎所有元素
mousemove( fn )           鼠标被移动 几乎所有元素
mouseout( fn )              鼠标从某元素移开 几乎所有元素
mouseover( fn )            鼠标被移到某元素之上 几乎所有元素
mouseup( fn )              某个鼠标按键被松开 几乎所有元素
resize( fn )                  窗口或框架被调整尺寸 window, iframe, frame
scroll( fn )                      滚动文档的可视部分时 window
select( )                      文本被选定 document, input, textarea
submit( )                    提交按钮被点击 form
unload( fn )                    用户退出页面 window

jquery源码解析日常的更多相关文章

  1. JQuery源码解析(一)

    写在前面:本<JQuery源码解析>系列是基于一些前辈们的文章进行进一步的分析.细化.修改而写出来的,在这边感谢那些慷慨提供科普文档的技术大拿们. 要查阅JQ的源文件请下载开发版的JQ.j ...

  2. jQuery 源码解析二:jQuery.fn.extend=jQuery.extend 方法探究

    终于动笔开始 jQuery 源码解析第二篇,写文章还真是有难度,要把自已懂的表述清楚,要让别人听懂真的不是一见易事. 在 jQuery 源码解析一:jQuery 类库整体架构设计解析 一文,大致描述了 ...

  3. jquery源码解析:代码结构分析

    本系列是针对jquery2.0.3版本进行的讲解.此版本不支持IE8及以下版本. (function(){ (21, 94)     定义了一些变量和函数,   jQuery = function() ...

  4. jquery 源码解析

    静态与实力方法共享设计 遍历方法 $(".a").each() //作为实例方法存在 $.each() //作为静态方法存在 Jquery源码 jQuery.prototype = ...

  5. jQuery源码解析资源便签

    最近开始解读jQuery源码,下面的链接都是搜过来的,当然妙味课堂 有相关的一系列视频,长达100多期,就像一只蜗牛慢慢爬, 至少品读三个框架,以后可以打打怪,自己造造轮子. 完全理解jQuery源代 ...

  6. 三.jQuery源码解析之jQuery的框架图

    这张图片是对jQuery源码截图,一点一点拼出来的. 现在根据这张图片来对jQuery框架做一些说明. 一.16~9404行可以发现,最外层是一个自调用函数.当jQuery初始化时,这个自调用函数包含 ...

  7. jquery源码解析:addClass,toggleClass,hasClass详解

    这一课,我们将继续讲解jQuery对元素属性操作的方法. 首先,我们先看一下这几个方法是如何使用的: $("#div1").addClass("box1 box2&quo ...

  8. jquery源码解析:jQuery数据缓存机制详解2

    上一课主要讲了jQuery中的缓存机制Data构造方法的源码解析,这一课主要讲jQuery是如何利用Data对象实现有关缓存机制的静态方法和实例方法的.我们接下来,来看这几个静态方法和实例方法的源码解 ...

  9. jquery源码解析:jQuery数据缓存机制详解1

    jQuery中有三种添加数据的方法,$().attr(),$().prop(),$().data().但是前面两种是用来在元素上添加属性值的,只适合少量的数据,比如:title,class,name等 ...

随机推荐

  1. python之反射和内置函数__str__、__repr__

    一.反射 反射类中的变量 反射对象中的变量 反射模块中的变量 反射本文件中的变量 .定义:使用字符串数据类型的变量名 来获取这个变量的值 例如: name = 'xiaoming' print(nam ...

  2. Android Error:Execution failed for task ':app:preDebugAndroidTestBuild'. > Conflict with dependency

    错误内容: Error:Execution failed for task ':app:preDebugAndroidTestBuild'.> Conflict with dependency ...

  3. Django ORM操作补充

    操作补充 only 只取某些去除其他 defer 去除某些取其他 # 需求: 只取某n列 queryset=[ {},{}] models.User.objects.all().values( 'id ...

  4. 51nod 1318 最大公约数与最小公倍数方程组(2-SAT)

    题意 给你 \(n\) 个元素,\(m\) 个方程. 每个方程形如 \[ \begin{align} \gcd(x_i, y_i)=c_i\\ \mathrm{lcm}(x_i,y_i) = d_i ...

  5. [ML]机器学习书单

    https://anvaka.github.io/greview/hands-on-ml/1/

  6. (转)Spring事务管理详解

    背景:之前一直在学习数据库中的相关事务,而忽略了spring中的事务配置,在阿里面试时候基本是惨败,这里做一个总结. 可能是最漂亮的Spring事务管理详解 https://github.com/Sn ...

  7. 【gdoi2018 day2】第二题 滑稽子图(subgraph)(性质DP+多项式)

    题目大意 [gdoi2018 day2]第二题 滑稽子图(subgraph) 给你一颗树\(T\),以及一个常数\(K\),对于\(T\)的点集\(V\)的子集\(S\). 定义\(f(S)\)为点集 ...

  8. JS学习笔记Day10

    一.设置或获取元素对象中(标签中)的属性和自定义属性 对象.属性 对象['属性'] 对象.getAttribute('属性名') 对象.setAttribute('属性名','属性值'); 对象.re ...

  9. go interface接口

    一:接口概要 接口是一种重要的类型,他是一组确定的方法集合. 一个接口变量可以存储任何实现了接口方法的具体值.一个重要的例子就是io.Reader和io.Writer type Reader inte ...

  10. Fiddler--Filters

    本篇主要介绍Fiddler中Filters(过滤器)选项功能. 先看看Filters的界面: 一.模块一 当勾选“Use Filters”,Filters才开始工作:否则Filters中的设置内容将无 ...