jQuery 开发经验库
jQuery是一套跨浏览器的JavaScript库,简化HTML与JavaScript之间的操作。全球前10000个访问最高的网站中,有59%使用了jQuery,是目前最受欢迎的JavaScript库。本文我们就全方位探讨一下 jQuery 开发经验库。
前言
时候我在想jQuery为什么可以直接$操作,可以拥有比原生js更便利的DOM操作,而且只要你想就可以直接链式操作下去
核心框架
揭开一万多行代码的jQuery核心代码:
<span style="font-size: 14px;">(function(window, undefined) {<br> function jQuery(selector){<br> return new jQuery.fn.init(selector)<br> }<br> jQuery.fn = jQuery.prototype = {<br> init: function () {<br><br> }<br> }<br> jQuery.fn.init.prototype = jQuery.fn;<br> window.jQuery = window.$ = jQuery;<br>})(window)<br></span>
闭包结构传参window
减少内部每次引用window的查询时间
方便压缩代码
闭包结构传入实参window,然后里面用形参接收
形参undefined
因为ie低版本的浏览器可以给undefined赋值成功,所以为了保证undefined的纯洁给它一个形参的位置而没有实参,保证了它一定是undefined
jQuery传参selector
selector可以是一对标签,可以是id、类、后代、子代等等,可以是jQuery对象,
jQuery原型对象赋值
方便扩展jQuery的原型方法
return 实例化原型方法init
其实就是为了我们每次使用$不用new $();
为什么jQuery要new自己的原型方法呢,因为不new自己的就要new其他的函数返回,那干嘛不自己利用自己
jQuery原型对象赋值给jQuery原型方法init的原型
因为内部给jQuery原型每扩展一个方法init也会有该方法,是不是很酷炫,init有了那么$()出来的jQuery对象是不是也有啦
给window暴露可利用成员jQuery,$
给window暴露后那么全局都可以直接使用了jQuery和$了
至于为什么有$,因为短啊,当然你也可以每次jQuery()来使用
御用选择器-Sizzle
Sizzle也是jQuery的根本,当然了你也单独使用Sizzle
上面说过$(selector)的参数selector可以是id、类、后代、子代等等,可以是jQuery对象,那么咱们每次$一下就可以心想事成的得到我们想要的jQuery对象是怎么办到的呢,没错,就是因为Sizzle,Sizzle封装了获取各种dom对象的方法,并且会把他们包装成jQuery对象
浏览器能力测试
Sizzle内部有个support对象,support对象存储着正则测试浏览器能力的结果
对于有能力问题的选择器使用通用兼容方案解决(繁琐的判断代码)
正则
正则表达式在jQuery中使用的还是比较多的,正则的使用可以很大的提交我们对数据的处理效率
判断
列如可能是个html标签,那么直接create一个selector标签的DOM对象包装成jQuery对象return出去
列如可能是个id名、类名、标签名等等,那么直接通过Sizzle获取到DOM对象包装成jQuery对象return出去
判断是在init内部判断selector的类型,
包装
我已经说了很多次的包装了,没错,jQuery对象其实也是个伪数组,这也是它的设计巧妙之处,因为用数组存储数据方便我们去进行更多的数据处理,比如 $("p").css("color": "red") ,那么jQuery会自动帮我们隐式迭代、再给页面上所有p包含的文字颜色设置为red,简单粗暴的一行代码搞定简直是程序猿的最爱
对外扩展-extend
jQuery核心的结构处理完毕之后基本上就可以对外使用了,但是我们知道我们是可以基于jQuery来实现插件的,包括jQuery自己可扩展性也必须要求他要对外提供一个接口方便进行二次开发,所以有了extend方法
简单的extend就是混入,列子:
<span style="font-size: 14px;">function extend(obj) {<br> var k;<br> for(k in obj) {<br> this[k] = obj[k];<br> }<br> }<br><br> Baiya.extend = extend;<br> Baiya.fn.extend = extend;<br></span>
对静态方法的和实例方法的扩展都要有,比如each方法,可以$.each来使用,也可以是$("p").each来使用
之后jQuery一些方法都是基于extend来扩展的,当然我们自己也可以基于jQuery扩展方法
DOM操作
DOM操作也是jQuery的一大特点,因为它太好用了,包含了我们所能想到的所有使用场景,完善了增删查改常用的方法
jQuery获取和设置类的方法如html()/css()/val()等等这些传参是设置值不传参是获取值
##链式编程
jQuery是支持链式编程的,只要你想你就可以一行代码写完所有的功能,这是怎么做到的呢
每一个改变原型链的方法都会把当前的this对象保存成他自己的属性,然后可以调用end方法找到上一级链从而方便我们可以进行链式操作
事件操作
jQuery的事件操作一般可以通过click类(mouseover/mouseleave等等)和on来使用,但是click类的实现是调用on的
on的实现是对原生的onclick类的处理,因为相同的原生的事件在同一个DOM对象上只能被绑定一次,如果再次绑定会覆盖掉上一次的,所以jQuery帮我们封装了事件的存储,把相同的事件分成一个数组存储在一个对象里面,然后对数组进行遍历,依次调用数组里存储的每个方法
on实现之后会把所有的事件处理字符串处理一下用on来改造一下,如下:
<span style="font-size: 14px;">Baiya.each(("onclick,onmousedown,onmouseenter,onmouseleave," +<br> "onmousemove,onmouseout,onmouseover,onmouseup,onfocus," +<br> "onmousewheel,onkeydown,onkeypress,onkeyup,onblur").split(","), function (i, v) {<br> var event = v.slice(2);<br> Baiya.fn[event] = function (callback) {<br> return this.on(event, callback);<br> }<br> });<br></span>
属性操作
jQuery也提供给了我们方便的属性操作,底层就是对原生方法的包装,处理兼容性问题,如果jQuery不对IE浏览器的兼容处理的话,那么它的代码量可能会缩一半,当然锅不能全部甩给IE,比如innerText方法火狐是不支持的,但是支持textContent方法,所以jQuery会尽可能的处理这种浏览器带来的差异
样式操作
基本思想如上
Ajax操作
Ajax可以说是前端的跨越性进步,毫不夸张的说如果没有Ajax的发展,那么今天的前端可能不叫前端,可能是美工……
Ajax是什么?
在我的理解来看Ajax就是一个方法,这个方法遵循着http协议的规范,我们可以使用这个方法来向服务器请求少量的数据,有了数据之后我们就可以操作DOM来达到局部更新网页的目的,这是一个非常酷的事情
jQuery的Ajax是基于XMLHttpRequest的封装,当然了他也有兼容性问题,具体的封装见我之前的文章 简单的ajax封装
具体就是区别get和post请求的区别,get请求的传参是直接拼接在url结尾,而post请求需要在send()里面传递,并且post请求还要设置请求头setRequestHeader("content-type", "application/x-www-form-urlencoded")
请求后对json或者text或者xml的数据进行处理就可以渲染到页面了
提到Ajax就不得不提到跨域了
跨域简单的来说限制了非同源(ip/域名/端口/协议)的数据交互,当然这肯定是极好的,因为如果不限制那么你的网页别人也可以操作是不是很恐怖
但是有些情况下我们需要调用别人的服务器数据,而且别人也愿意怎么办呢,程序员是很聪明的,html标签中img,script,link等一些带有src属性的标签是可以请求外部资源的,img和link得到的数据是不可用的,只有script标签请求的数据我们可以通过函数来接收,函数的参数传递可以是任何类型,所以创建一个函数,来接收,参数就是请求到的数据,而对方的数据也要用该函数来调用就可以实现跨域了
简单封装jsonp实现
<span style="font-size: 14px;">// url是请求的接口<br>// params是传递的参数<br>// fn是回调函数<br>function jsonp(url, params, fn){<br> // cbName实现给url加上哈希,防止同一个地址请求出现缓存<br> var cbName = `jsonp_${(Math.random() * Math.random()).toString().substr(2)}`;<br> window[cbName] = function (data) {<br> fn(data);<br> // 获取数据后移除script标签<br> window.document.body.removeChild(scriptElement);<br> };<br><br> // 组合最终请求的url地址<br> var querystring = '';<br> for (var key in params) {<br> querystring += `${key}=${params[key]}&`;<br> }<br> // 告诉服务端我的回调叫什么<br> querystring += `callback=${cbName}`;<br><br> url = `${url}?${querystring}`;<br><br> // 创建一个script标签,并将src设置为url地址<br> var scriptElement = window.document.createElement('script');<br> scriptElement.src = url;<br> // appendChild(执行)<br> window.document.body.appendChild(scriptElement);<br> }<br></span>
Animate
很抱歉的是jQuery的动画源码我并没有阅读,但是我自己封装了一个动画函数,之后的源码阅读会补上的
封装的代码
<span style="font-size: 14px;">// element设置动画的DOM对象<br>// attrs设置动画的属性 object<br>// fn是回调函数<br>function animate(element, attrs, fn) {<br> //清除定时器<br> if(element.timerId) {<br> clearInterval(element.timerId);<br> }<br> element.timerId = setInterval(function () {<br> //设置开关<br> var stop = true;<br> //遍历attrs对象,获取所有属性<br> for(var k in attrs) {<br> //获取样式属性 对应的目标值<br> var target = parseInt(attrs[k]);<br> var current = 0;<br> var step = 0;<br> //判断是否是要修改透明度的属性<br> if(k === "opacity") {<br> current = parseFloat( getStyle(element, k)) * 100 || 0;<br> target = target * 100;<br> step = (target - current) / 10;<br> step = step > 0 ? Math.ceil(step) : Math.floor(step);<br> current += step;<br> element.style[k] = current / 100;<br> //兼容ie<br> element.style["filter"] = "alpha(opacity="+ current +")";<br> }else if(k === "zIndex") {<br> element.style[k] = target;<br> } else {<br> //获取任意样式属性的值,如果转换数字失败,返回为0<br> current = parseInt(getStyle(element, k)) || 0;<br> step = (target - current) / 10;<br> console.log("current:" + current + " step:" + step);<br> step = step > 0 ? Math.ceil(step) : Math.floor(step);<br> current += step;<br> //设置任意样式属性的值<br> element.style[k] = current + "px";<br> }<br> if(step !== 0) {<br> //如果有一个属性的值没有到达target ,设置为false<br> stop = false;<br> }<br><br> }<br> //如果所有属性值都到达target 停止定时器<br> if(stop) {<br> clearInterval(element.timerId);<br> //动画执行完毕 回调函数<br> if(fn) {<br> fn();<br> }<br> }<br> },30);<br> }<br><br> //获取计算后的样式的值<br> function getStyle(element, attr) {<br> //能力检测<br> if(window.getComputedStyle) {<br> return window.getComputedStyle(element, null)[attr];<br> }else{<br> return element.currentStyle[attr];<br> }<br> }<br></span>
以上内容就是 jQuery 开发经验库的分享,希望能帮助到大家。
相关推荐:
以上是 jQuery 开发经验库的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

这个AI辅助编程工具在这个AI迅速发展的阶段,挖掘出了一大批好用的AI辅助编程工具。AI辅助编程工具能够提高开发效率、改善代码质量、降低bug率,是现代软件开发过程中的重要助手。今天大姚给大家分享4款AI辅助编程工具(并且都支持C#语言),希望对大家有所帮助。https://github.com/YSGStudyHards/DotNetGuide1.GitHubCopilotGitHubCopilot是一款AI编码助手,可帮助你更快、更省力地编写代码,从而将更多精力集中在问题解决和协作上。Git

2022年3月3日,距世界首个AI程序员Devin诞生不足一个月,普林斯顿大学的NLP团队开发了一个开源AI程序员SWE-agent。它利用GPT-4模型在GitHub存储库中自动解决问题。SWE-agent在SWE-bench测试集上的表现与Devin相似,平均耗时93秒,解决了12.29%的问题。SWE-agent通过与专用终端交互,可以打开、搜索文件内容,使用自动语法检查、编辑特定行,以及编写和执行测试。(注:以上内容为原内容微调,但保留了原文中的关键信息,未超过指定字数限制。)SWE-A

Go语言开发移动应用程序教程随着移动应用市场的不断蓬勃发展,越来越多的开发者开始探索如何利用Go语言开发移动应用程序。作为一种简洁高效的编程语言,Go语言在移动应用开发中也展现出了强大的潜力。本文将详细介绍如何利用Go语言开发移动应用程序,并附上具体的代码示例,帮助读者快速入门并开始开发自己的移动应用。一、准备工作在开始之前,我们需要准备好开发环境和工具。首

Go语言作为一种快速、高效的编程语言,在后端开发领域广受欢迎。然而,很少有人将Go语言与前端开发联系起来。事实上,使用Go语言进行前端开发不仅可以提高效率,还能为开发者带来全新的视野。本文将探讨使用Go语言进行前端开发的可能性,并提供具体的代码示例,帮助读者更好地了解这一领域。在传统的前端开发中,通常会使用JavaScript、HTML和CSS来构建用户界面

Android开发是一项繁忙而又令人兴奋的工作,而选择一个适合的Linux发行版来进行开发则显得尤为重要。在众多的Linux发行版中,究竟哪一个最适合Android开发呢?本文将从几个方面来探讨这一问题,并给出具体的代码示例。首先,我们来看一下目前流行的几个Linux发行版:Ubuntu、Fedora、Debian、CentOS等,它们都有各自的优点和特点。

1.分支与合并分支允许您在不影响主分支的情况下试验代码更改。使用gitcheckout创建新分支,并在尝试新功能或修复错误时使用它。完成后,使用gitmerge将更改合并回主分支。示例代码:gitcheckout-bnew-feature//在new-feature分支上进行更改gitcheckoutmaingitmergenew-feature2.暂存工作使用gitadd将您要跟踪的更改添加到暂存区。这使您可以选择性地提交更改,而无需提交所有修改。示例代码:gitaddMyFile.java3

VSCode是一款功能强大、灵活性高、易于扩展的开源代码编辑器,广受开发者青睐。它支持众多编程语言和框架,能够满足不同项目需求。但是,针对不同的框架,VSCode的优势可能有所不同。本文将讨论VSCode在不同框架开发中的适用性,并提供具体的代码示例。1.ReactReact是一款流行的JavaScript库,用于构建用户界面。在使用React开发项目时,

《了解VSCode:这款工具到底是用来干什么的?》作为一个程序员,无论是初学者还是资深开发者,都离不开代码编辑工具的使用。在众多编辑工具中,VisualStudioCode(简称VSCode)作为一款开源、轻量级、强大的代码编辑器备受开发者欢迎。那么,VSCode到底是用来干什么的?本文将深入探讨VSCode的功能和用途,并提供具体的代码示例,以帮助读者
