‘壹’ 如何正确阅读jquery源码和jquery插件源码
1. jQuery 里面有很多东西是出于兼容性,历史遗留。
比如 .ready() 之类的函数,为什么会很scroll 有关,那是为了兼容某些ie。这种代码对于编程思想来说不仅没用,而且是杂音,你要筛选出来就得了解这段代码的变动,费心费力得不偿失。
2. jQuery 里面的代码不一定是最优的,例如事件委托,每一次事件触发都要调用选择器,实际上是效率很低的。但是我又比较懒,没有提交patch。
3. jQuery 实际上很容易写出来一个 barebone alternative,在使用的过程中多想,多思考多总结就可以了。
4. jQuery 这类框架里真正有思维挑战性的东西不多,一半以上是堆代码而已,剩下的一点价值在于架构、抽象、扩展能力。
5. 我有一句话与所有的同行分享:工程师让需求成为现实,优秀工程师化复杂为简单,顶尖工程师变不可能为可能;架构师掌握现在,优秀架构师展望未来,顶尖架构师创造时代。
jQuery 的设计目的是,让前端工程师的工作更简单更轻松,但它并不适合所有的前端工程师,假如你的目标是成为优秀架构师、顶尖架构师的话,你在jQuery里也看不清未来。
‘贰’ 使用$.noConflict()后,怎么让$重新指定window.jQuery
jQuery默认使用"$"操作符,$ 符号只是 window.jQuery 对象的一个引用,jQuery.noConflict() ,这个函数将变量$的控制权让渡给第一个实现它的那个库。这有助于确保jQuery不会与其他库的$对象发生冲突。在运行这个函数后,就只能使用jQuery变量访问jQuery对象。例如,在要用到$("div p")的地方,就必须换成jQuery("div p")。
一、"$"操作符
1、jQuery默认使用"$"操作符,prototype等其他框架也是是使用"$",于是,如果jQuery在其他库之后引入,那么jQuery将获得"$"使用权。这样的情况也很容易理解,毕竟JS是从上到下流式执行的。
2、如果在其他使用"$"的库之前引入jQuery,那么jQuery将不会占用"$"。
提示:在其他 javaScript 库为其函数使用 $ 时,该方法很有用。
我们在jquery中获取变量都会使用到$,但是还有很多插件都是可以使用$这个符号了,如果我们同时要引用就会导致出现问题了,jquery为了防止这种事情发生就引入了noconflict()
二、jQuery.noConflict的定义
jQuery.noConflict 方法包含一个可选的布尔参数,用以决定移交 $ 引用的同时是否移交 jQuery 对象本身:
jQuery.noConflict([removeAll])
函数的说明:
缺省情况下,执行 noConflict 会将变量 $ 的控制权移交给第一个产生 $ 的库;当 removeAll 设置为 true 时,执行 noConflict 则会将 $ 和 jQuery 对象本身的控制权全部移交给第一个产生他们的库。
三、jQuery.noConflict源码分析
jQuery 源码开头,首先做的一斗皮件事情是这样的:
// Map over jQuery in case of overwrite_jQuery = window.jQuery,// Map over the $ in case of overwrite_$ = window.$,
容易理解的是,jQuery 通过两个私有变量映射了 window 环境下的 jQuery 和 $ 两个对象,以防止变量被强行覆盖。一旦 noConflict 方法被调用,则通过 _jQuery, _$, jQuery, $ 四者之间的差异,来决定控制权的移交方式,具体的代码如下:
noConflict: function( deep ) { if ( window.$ === jQuery ) { window.$ = _$; } if ( deep && window.jQuery === jQuery ) { window.jQuery = _jQuery; } return jQuery;}
再来看上面所说的参数设定问题,如果 deep 没有设置,_$ 覆盖 window.$,此时 jQuery 别名 $ 失效,但 jQuery 本身完好无损。如果有其他类库或代码重新定义了 $ 变量,它的控制权就完全祥册交接出去了。反之如果 deep 设置为 true 的话,_jQuery 覆盖 window.jQuery,此时 $ 和 jQuery 都将失效。
这种操作的好处是,不管是框架混用还是 jQuery 多版本共存这种高度冲突的执行环境,由于 noConflict 方法提供的移交机制,以及本身返回未被覆盖的 jQuery 对象,完全能够通过变量映射的方式解决冲突。
四、jQuery.noConflict实例
1、将 $ 引用的对象映射回原始的对象:
jQuery.noConflict();jQuery("div p").hide(); // 使用 jQuery$("content").style.display = "none"; // 使用其他库的 $()
2、恢复使用别名 $,然后创建并执行一个函数,在这个函数的作用域中仍然将 $ 作为 jQuery 的别名来使用。在这个函数中,原来的 $ 对象是无效的。这个函数对于大多数不依赖于其他库的插件都十分有效:
jQuery.noConflict();(function($) { $(function() { // 使用 $ 作为 jQuery 别名的代码 });})(jQuery);... // 其他空宴差用 $ 作为别名的库的代码
3、可以将 jQuery.noConflict() 与简写的 ready 结合,使代码更紧凑:
jQuery.noConflict()(function(){ // 使用 jQuery 的代码});... // 其他库使用 $ 做别名的代码
4、创建一个新的别名用以在接下来的库中使用 jQuery 对象:
var j = jQuery.noConflict();j("div p").hide(); // 基于 jQuery 的代码$("content").style.display = "none";// 基于其他库的 $() 代码
5、完全将 jQuery 移到一个新的命名空间:var dom = {};dom.query = jQuery.noConflict(true);//结果:dom.query("div p").hide(); // 新 jQuery 的代码$("content").style.display = "none"; // 另一个库 $() 的代码jQuery("div > p").hide(); // 另一个版本 jQuery 的代码
‘叁’ 简单易懂的jQuery导航(三级菜单)源码
<!--三级操蛋导航-->
<divclass="nav_left">
<divclass="nav_leftlist">
<h2><b></b>用户系统</h2>
<dl>
<dt><b></b>用户管理</dt>
<dd>
<aclass="cur"href="">商户信息<b></b></a>
<ahref="">用户信息<b></b></a>
</dd>
</dl>
</div>
<divclass="nav_leftlist">
<h2><b></b>财务系统</h2>
<dl>
<dt><b></b>系统账务</dt>
<dd>
<ahref="">平台账单<b></b></a>
<ahref="">账单明细<b></b></a>
</dd>
</dl>
<dl>
<dt><b></b>商户账务</dt>
<dd>
<ahref="">商户账单<b></b></a>
<ahref="">提现管理<b></b></a>
</dd>
</dl>
<dl>
<dt><b></b>用户账务</dt>
<dd>
<ahref="">用户账单<b></b></a>
<ahref="">提现管理<b></b></a>
</dd>
</dl>
</div>
</div>
<style>
.nav_left{background:#232b35;height:100%;width:220px;min-height:600px;position:fixed;top:100px;left:0;}
.nav_leftlist{}
.nav_leftlisth2{height:50px;line-height:50px;padding-left:40px;font-size:16px;background:#3b444f;color:#999999;position:relative;cursor:pointer;}
.nav_leftlisth2b{position:absolute;top:20px;left:13px;width:16px;height:9px;background:url(../images/icon04.png)no-repeat;background-position:00;cursor:pointer;}
.nav_leftlisth2b.cur{background-position:-16px0;}
.nav_leftlistdl{}
.nav_leftlistdldt{height:50px;line-height:50px;background:#2c3643;font-size:16px;color:#ffffff;padding-left:60px;position:relative;cursor:pointer;}
.nav_leftlistdldtb{position:absolute;top:20px;left:34px;width:16px;height:9px;background:url(../images/icon04.png)no-repeat;background-position:0-10px;}
.nav_leftlistdldtb.cur{background-position:-16px-10px;}
.nav_leftlistdldd{}
.nav_leftlistdldda{display:block;height:50px;line-height:50px;color:#fff;padding-left:80px;font-size:16px;position:relative;}
.nav_leftlistdldda.cur{color:#ee581c;}
.nav_leftlistdldda.curb{display:block;position:absolute;top:16px;right:-1px;width:11px;height:18px;background:url(../images/icon04.png)no-repeat;background-position:0-20px;}
</style>
</body>
<scripttype="text/javascript"src="../js/jquery.js"></script>
<scripttype="text/javascript">
$(function(){
$('.nav_leftlist').on('click','h2',function(event){
$(this).siblings('dl').toggle();
if($(this).siblings('dl').css('display')=='none'){
$(this).find('b').addClass('cur');
}else{
$(this).find('b').removeClass('cur');
}
});
$('.nav_leftlist').on('click','dldt',function(event){
$(this).siblings('dd').toggle();
if($(this).siblings('dd').css('display')=='none'){
$(this).find('b').addClass('cur');
}else{
$(this).find('b').removeClass('cur');
}
});
})
</script>
效果图:
‘肆’ 如何通过JavaScript或者jQuery异步实现获取远程网页源码,例如按下按钮就显示某网站的源
js和jquery无法直接获取远程网站的原码,因为ajax无法跨域,如果你想引用,直接用iframe不就得了。如果想获取源码,用js访问php,让php去干这活,然后返回给页面
方法有了,自己动手
‘伍’ jquery源码中的var document=window.document是什么意思
jquery本高搜身就是面向对象的阿,window.document实际上被jquery包装成一个对象了。
可毕稿以手念孝调用很多方法。
实际上js中才是对dom元素的引用,jquery是作为对象的引用。
‘陆’ jquery中each 跳出为什么用return false
由于jQuery的each是通过循环调用回调函数的方式实现的,所以在函数内写的break只适用于函数内部的逻辑,并不能对函数外层的循环起到作用,所以break不管用。具体可以分析一下jQuery的源码,下面以jQuery2.1.4中的each方法举例:
each:function(obj,callback,args){
varvalue,
i=0,
length=obj.length,
isArray=isArraylike(obj);//如果obj是一个类似数组的结构(可用for遍历的),则为true
if(args){
if(isArray){
for(;i<length;i++){
value=callback.apply(obj[i],args);//循环调用
if(value===false){//如果返回值全等于(包括类型和值)false,就退出循环
break;
}
}
}else{
for(iinobj){//这种是对象的,需要用forin遍历
value=callback.apply(obj[i],args);
if(value===false){
break;
}
}
}
//Aspecial,fast,caseforthemostcommonuseofeach
}else{
if(isArray){
for(;i<length;i++){
value=callback.call(obj[i],i,obj[i]);
if(value===false){
break;
}
}
}else{
for(iinobj){
value=callback.call(obj[i],i,obj[i]);
if(value===false){
break;
}
}
}
}
returnobj;
}
由源码可以看出,只有回调函数返回的值为false时,才会退出循环
‘柒’ jquery 是如何通过 class 来获取元素的
jquery通过任哪陆何选择器取得的对象都是jquery对象而不是JavaScript的dom对象不能用js的方法进行操作 而需要使用jquery对象支李谨顷持的方法 如果是通过class的话取得的是jquery对象数组
ps 如果想把jquery对象装换为js对象可晌败以用以下方法
1 var obj = $('#xx')[0] 获得dom对象
2 对于数组
var obj = $('.xx').each(function(){
alert(this)//这里 this获得的就是每一个dom对象 如果需要jquery对象 需要写成$(this)
});
‘捌’ jQuery 是如何判断HTML页面加载完毕的它的原理是什么
jquery是一个轻量级的JS框架,这点相信大部分人都听过,而jquery之所以有这样一个称呼,就是因为它悄悄披了一件外衣,将自己给隐藏了起来。
//以下截取自jquery源码片段(function( window, undefined ) { /* 源码内容 */})( window );
上面这一小段代码来自于1.9.0当中jquery的源码,它是一个无污染的JS插件的标准写法,专业名词叫闭包。可以把它简单的看做是一个函数,与普通函数不同的是,这个函数没有名字,而且会立即执行,就像下面这样,会直接弹出字符串。
(function( window, undefined ) {
alert("Hello World!");
})( window );
可以看出来这样写的直接效果,就相当于我们直接弹出一个字符串。但是不同的是,我们将里面的变量变成了局域变量,这不仅可以提高运行速度,更重要的是我们在引用jquery的JS文件时,不会因为jquery当中的变量太多,而与其它的JS框架的变量命名产生冲突。对于这一点,我们拿以下这一小段代码来说明。
var temp = "Hello World!";
(function( window, undefined ) { var temp = "ByeBye World!";
})( window );
alert(temp);
这段代码的运行结果是Hello而不是ByeBye,也就是说闭包中的变量声明没有污染到外面的全局变量,倘若我们去掉闭包,则最终的结果会是ByeBye,就像下面这样。
var temp = "Hello World!";// (function( window, undefined ) {
var temp = "ByeBye World!";// })( window );
alert(temp);
由此就可以看出来,jquery的外衣就是这一层闭包,它是很重要的一个内容,是编写JS框架必须知道的知识,它可以帮助我们隐藏我们的临时变量,降低污染。
‘玖’ 急 求jquery完整视频教程
Jquery视频教程.zip网络网盘资源免费下载
链接:https://pan..com/s/1nIebXgAcvf8wuTWwXXyhrw