jQuery的事件、动画、AJAX和插件
认识事件(Event)
Web页面经常需要和用户之间进行交互,而交互的过程中我们可能想要捕捉这个交互的过程:
- 比如用户点击了某个按钮、用户在输入框里面输入了某个文本、用户鼠标经过了某个位置;
- 浏览器需要搭建一条JavaScript代码和事件之间的桥梁;
- 当某个事件发生时,让JavaScript执行某个函数,所以我们需要针对事件编写处理程序(handler);
原生事件监听方法:
- 事件监听方式一:在script中直接监听(很少使用)。
- 事件监听方式二:DOM属性,通过元素的on来监听事件。
- 事件监听方式三:通过EventTarget中的addEventListener来监听。
jQuery事件监听方法:
- 事件监听方式一:直接调用jQuery对象中的事件处理函数来监听,例如:click,mouseenter....。
- 事件监听方式二:调用jQuery对象中的on函数来监听,使用off函数来取消监听。
click和on的区别
- click和on的区别:
- click是on的简写。它们重复监听,不会出现覆盖情况,都支持事件委托,底层用的是addEventListener。
- 如果 on 没有使用 selector 的话,那么和使用click是一样的。
- on 函数可以接受一个 selector 参数,用于筛选 可触发事件 的后代元素。
- on 函数支持给事件添加命名空间。
click和on中this指向
- click和on的this指向:
- this都是指向原生的DOM Element
jQuery的事件冒泡
- 我们会发现默认情况下事件是从最内层(如下图span)向外依次传递的顺序,这个顺序我们称之为
- 事实上,还有另外一种监听事件流的方式就是从外层到内层(如:body -> span),这种称之为
- 为什么会产生两种不同的处理流呢?
- 这是因为早期在浏览器开发时,不管是IE还是Netscape公司都发现了这个问题;
- 但是他们采用了完全相反的事件流来对事件进行了传递;
- IE<9仅采用了事件冒泡的方式,Netscape采用了事件捕获的方式;
- IE9+和现在所有主流浏览器都已支持这两种方式。
事件冒泡(Event Bubble); 事件捕获(Event Capture);
- jQuery为了更好的兼容IE浏览器,底层并没有实现事件捕获。
jQuery的事件对象( Event Object)
- jQuery事件系统的规范是根据W3C的标准来制定jQuery事件对象。原始事件对象的大多数属性都被复制到新的jQuery事件 对象上。如,以下原生的事件属性被复制到jQuery事件对象中:
altKey, clientX, clientY, currentTarget, data, detail, key, keyCode, offsetX, offsetY, originalTarget, pageX, pageY, relatedTarget, screenX, screenY, target, ......
- jQuery事件对象通用的属性(以下属性已实现跨浏览器的兼容):
- target、relatedTarget、pageX、pageY、which、metaKey
- jQuery事件对象常用的方法:
- preventDefault() : 取消事件的默认行为(例如,a标签、表单事件等)。
- stopPropagation() : 阻止事件的进一步传递(例如,事件冒泡)。
- 要访问其它事件的属性,可以使用 event.originalEvent 获取原生对象。
jQuery的事件委托(event delegation)
- 事件冒泡在某种情况下可以帮助我们实现强大的事件处理模式 – 事件委托模式(也是一种设计模式)
- 那么这个模式是怎么样的呢?
- 因为当子元素被点击时,父元素可以通过冒泡监听到子元素的点击;
- 并且可以通过event.target获取到当前监听事件的元素(event.currentTarget获取到的是处理事件的元素);
- 案例:一个ul中存放多个li,使用事件委托的模式来监听li中子元素的点击事件。
jQuery常见的事件
- 鼠标事件(Mouse Events)
- .click() 、.dblclick()、.hover()、.mousedown() 、.mouseup()
- .mouseenter()、.mouseleave()、.mousemove()
- .mouseover()、.mouseout() 、.contextmenu()、.toggle()
- 键盘事件(Keyboard Events)
- .keydown() 、.keypress()、.keyup()
- 文档事件(Document Loading Events)
- load、ready()、.unload
- 表单事件(Form Events)
- .blur() 、.focus()、.change()、.submit()、.select()
- 浏览器事件(Browser Events)
- .resize()、.scroll()
mouseover和mouseenter的区别
- mouseenter()和mouseleave()
- 不支持冒泡
- 进入子元素依然属于在该元素内,没有任何反应
- mouseover()和mouseout()
- 支持冒泡
- 进入元素的子元素时
- 先调用父元素的mouseout
- 再调用子元素的mouseover
- 因为支持冒泡,所以会将mouseover传递到父元素中;
jQuery的键盘事件
- 事件的执行顺序是 keydown()、keypress()、keyup()
- keydown事件先发生;
- keypress发生在文本被输入;
- keyup发生在文本输入完成(抬起、松开);
- 我们可以通过key和code来区分按下的键:
- code:“按键代码”("KeyA","ArrowLeft" 等),特定于键盘上按键的物理位置。
- key:字符("A","a" 等),对于非字符(non-character)的按键,通常具有与 code 相同的值。)
jQuery的表单事件
- 表单事件(Form Events)
- .blur() - 元素失去焦点时触发
- .focus() - 元素获取焦点时触发
- change() - 该事件在表单元素的内容改变时触发(
<input>
,<keygen>
,<select>
, 和<textarea>
) - .submit() - 表单提交时触发
- ......
jQuery-选项卡切换
jQuery动画操作-animate
- .animate(): 执行一组 CSS属性的自定义动画,允许支持数字的
- .animate( properties [, duration ][, easing ] [, complete ] )
- .animate( properties, options )
- propertys参数的支持:
- 数值:number 、string
- 关键字:'show'、'hide'和'toggle'
- 相对值:+= 、 -=
- 支持 em 、% 单位(可能会进行单位转换)。
- 自定义修改宽高度动画
- height :100% -> 0
- width: 100% -> 0
- opacity: 1 - > 0
CSS属性上创建动画。
jQuery常见动画函数
- .显示和隐藏匹配的元素
- .hide() 、.hide( [duration ][, complete ] )、.hide( options ) - 隐藏元素
- .show() 、.show( [duration ][, complete ] )、.show( options ) - 显示元素
- .toggle() 、.toggle( [duration ][, complete ] )、.toggle( options ) -显示或者隐藏元素
- .hide() 、.hide( [duration ][, complete ] )、.hide( options ) - 隐藏元素
- 淡入淡出
- .fadeIn()、.fadeIn( [duration ][, complete ] )、.fadeIn( options ) - 淡入动画
- .fadeOut()、.fadeOut( [duration ][, complete ] )、.fadeOut( options ) -淡出动画
- .fadeToggle()、.fadeToggle( [duration ][, complete ] )、.fadeToggle( options ) - 淡入淡出的切换
- .fadeTo( duration, opacity [, complete ] ) - 渐变到
jQuery元素中的动画队列
- jQuery匹配元素中的animate和delay动画是通过一个
- .hide() 、 .show()
- .fadeIn() 、.fadeOut()
- .animate()、delay()
- ......
动画队列(queue)来维护的。例如执行下面的动画都会添加到动画队列中:
- .queue():查看当前选中元素中的动画队列。
- .stop( [clearQueue ][, jumpToEnd ] ):停止匹配元素上当前正在运行的动画。
- clearQueue :一个布尔值,指示是否也删除排队中的动画。默认为false
- jumpToEnd :一个布尔值,指示是否立即完成当前动画。默认为false
jQuery实现-隐藏侧边栏广告
jQuery中的遍历
- .each( function ): 遍历一个 jQuery 对象,为每个匹配的元素执行一个回调函数。
- function 参数:
- Function( Integer index, Element element ), 函数中返回false会终止循环。
- jQuery.each( array | object , callback ) : 一个通用的迭代器函数,可以用来无缝地迭代对象和数组。
- array参数:支持数组(array)或者类数组(array-like),底层使用for循环 。
- object参数: 支持普通的对象 object 和 JSON对象等,底层用for in循环。
- function 参数:
- Function( Integer index, Element element ), 函数中返回false会终止循环。
- .each() 和 jQuery.each()函数的区别:
- .each()是jQuery对象上的方法,用于遍历 jQuery对象。
- jQuery.each( ) 是jQuery函数上的方法,可以遍历对象、数组、类数组等,它是一个通用的工具函数。
jQuery的AJAX
- 在前端页面开发中,如果页面中的数据是需要动态获取或者更新的,这时我们需要向服务器发送异步的请求来获取数据,然后在无需刷新页面的情 况来更新页面。那么这个发起异步请求获取数据来更新页面的技术叫做AJAX。
- AJAX全称(Asynchronous JavaScript And XML),是异步的 JavaScript 和 XML,它描述了一组用于构建网站和Web应用程序的开发技术。
- 简单点说,就是使用 XMLHttpRequest 对象与服务器通信。它可以使用 JSON,XML,HTML 和 text 文本等格式发送和接收数据。
- AJAX 最吸引人的就是它的“异步”特性。也就是说它可以在不重新刷新页面的情况下与服务器通信,交换数据,或更新页面。
- AJAX请求方法(Method)
- GET、POST、PUT、PACTH、DELETE 等
- jQuery中也有AJAX模块,该模块是在XMLHttpRequest的基础上进行了封装,语法(Syntax)如下:
- $.ajax( [settings ] ) - 默认用 GET 请求从服务器加载数据, 会返回jQXHR对象,可以利用该对象的abort方法来取消请求。
- $.get( url [, data ][, success ] [, dataType ] ) - 发起GET请求,底层调用的还是$ajax()
- $.post( url [, data ][, success ] [, dataType ] ) - 发起POST请求,底层调用的还是$ajax()
- 初体验jQuery中的AJAX
- https://httpbin.org (是一个专门提供:免费测试http服务的网站)
AJAX请求参数(Parameters)
- 请求参数(Parameters)
- url - 指定发送请求的 URL。
- method / type - 用于指定请求的类型 (e.g. "POST", "GET", "PUT"),默认为GET
- data - 指定要发送到服务器的数据(PlainObject or String or Array)
- processData:当data是一个对象时,jQuery 从对象的键/值对生成数据字符串,除非该processData选项设置为false. 例如,{ a: "bc", d: "e,f" }被转换为字符串"a=bc&d=e%2Cf",默认为true。
- header - 请求头的内容(PlainObject)
- contentType - 默认值:application/x-www-form-urlencoded; charset=UTF-8,向服务器发送数据时指定内容类型。
- application/x-www-form-urlencoded; charset=UTF-8: 请求体的数据以查询字符串形式提交,如:a=bc&d=e%2Cf。
- application/json; charset=UTF-8 指定为json字符串类型
- 为时 false, 代表是 multipart/form-data 。表单类型,一般用于上传文件
- dataType - 期望服务器端发回的数据类型(json、xml、text...),默认会根据响应的类型来自动推断类型。
- timeout - 请求超时时间。它以毫秒为单位。
- beforeSend - 这是一个在发送请求之前运行的函数,返回false会取消网路请求。
- success - 请求成功回调的函数
- error - 请求失败回调的函数
jQuery插件(plugins)开发
- 在我们开发时,有时候jQuery提供的方法并不能满足我们的需求。如果我们想给jQuery扩展一些其它的方法,那这种情况下, 可能需要编写一个插件。
- jQuery插件其实就是:编写一些新增的方法,并将这些方法添加到jQuery的原型对象上。
- 编写jQuery 插件的步骤:
- 新建一个插件对应的JS文件(命名规范:jquery.插件名.js)
- 在立即执行函数中编写插件,这样可以避免插件中的变量与全局变量冲突。
- 在jQuery的原型对象上新增一些的方法。
- 最后在html中导入就可以像使用其他 jQuery对象方法一样使用了
- 到此就开发完一个jQuery的插件了。
- 案例:开发一个 jquery.showlinklocation.js 的插件。
- 功能:让网页上所有的a标签文本的后面追加对应的域名地址。
jQuery项目实战
- 项目的目录结构
- 项目的接口地址
- baseURL:http://123.207.32.32:9060/beike/api
- 首页数据(GET):baseURL + /homePageInfo
- 搜索接口(GET):baseURL + /sug/headerSearch?cityId=440100&cityName=广州&channel=site&keyword=白云山 &query=白云山
- 热门推荐(GET):baseURL + /site/rent
- 城市数(GET)据:baseURL + /city