青训营笔记创作活动 —— jquery | 青训营

62 阅读3分钟

Jquery

jquery是一个大型的简单的第三方类库,其是对dom操作的封装,也包括ajax操作。

1、基本使用。

// 引入jquery
<script src="jquery/jquery.js"></script>
// 当引入jquery后会在全局暴露两个变量名:$ jQuery
注意:$=jQuery

2、选择器。

ul>li*10{$}  // 创建10li 内容依次为1~10
$('选择器')

注意:不管使用任何选择器,获取到的元素都是一个元素集合。

$('选择器').筛选器名称()
// 常用筛选器
first() // 第一个
last()  // 最后一个
eq(索引) // 第几个
next()  // 下一个
nextAll()  // 后面所有
prev()   // 前一个
prevAll()  // 前面所有
parent()   // 父亲
parents()  // 祖先 直至html
siblings()  // 所有兄弟
find('选择器')  // 该元素的所有后代元素中满足选择器要求的元素

3、操作文本内容。

首先获取元素,然后再操作元素文本内容。其中操作文本内容又分为获取和设置。

// 等价于innerHTML 获取的是元素的内部的html内容
html()  // 获取
html('你要设置的内容') // 设置 可以识别并解析html结构// 等价于innerText 获取的是元素的内部的text文本内容
text()   // 获取
text('你要设置的内容') // 设置 不可以识别并解析html结构// 等价于value属性 主要用于表单元素处理
val()   // 获取
val('你要设置的内容') // 设置

4、操作元素类名。

// addClass('你要增加的类名') 增加类名
$('div').addClass('e')
​
// removeClass('你要删除的类名')  删除类名
$('div').removeClass('a')
​
​
// toggleClass('你要切换的类名')   切换类名
$('div').toggleClass('b')
// 切换即如果本身有则删除 反之如果本身没有则增加// hasClass('你要判断的类名')  判断是否包含该类名
$('div').hasClass('c')

5、操作元素样式。

元素集合.css('你要获取的css样式名称')  // 返回样式值 
​
注意:其既可以获取行内样式 又可以获取非行内样式
​
元素集合.css('你要设置的css样式名称','你要设置的css样式值')
​
注意:当你需要给一个元素设置样式值为px单位的时候 可以省略单位px不写
​
// 批量设置样式
元素集合.css({
    '':'',
    ......
})

6、操作元素属性。

// 可以进行设置和获取元素的属性 一般用于操作元素的自定义属性 
attr('你要获取的属性名')  // 获取
attr('你要设置的属性名','你要设置的属性值')  // 设置// 对元素的属性进行删除操作
removeAttr('你要删除的属性名')  // 删除
​
注意:上述两个对元素属性的操作对原生属性和自定义属性均可生效,且会直接响应在元素标签身上。
​
// 可以进行设置和获取元素的属性 
// 当prop设置元素的原生属性,会直接响应在元素标签身上
// 当prop设置元素的自定义属性,不会直接响应在元素标签身上,会响应在元素对象身上
// 注意:prop方法不能获取元素标签身上的自定义属性,只能获取prop方法自己设置的自定义属性
prop('你要设置的属性名','你要设置的属性值')   // 设置
prop('你要获取的属性名')  // 获取// 对元素的属性进行删除操作 注意其不能删除原生属性 只能删除由prop方法设置的自定义属性
removeProp('你要删除的属性名')  // 删除

7、获取元素尺寸。

background-clipcontent-box/padding-box/border-box //背景被裁减到什么区域
width()  //content的宽
height() //content的高innerWidth() //padding及content的宽
innerHeight() //padding及content的高outerWidth()  //border、padding及content的宽
outerHeight() //border、padding及content的高outerWidth(true)  //margin、border、padding及content的宽
outerHeight(true) //margin、border、padding及content的高

注意:不管该元素是否隐藏,都能拿到值;不管盒子是什么状态,拿到的区域不变。

8、元素偏移量。

offset() //相对于页面左上角的距离 返回值是对象形式 {top:xxx,left:xxx}
position() //返回的是元素的定位位置 返回值是对象形式 {top:xxx,left:xxx}
注意:如果设置的定位是rightbottom会自动帮忙换算成topleft

9、事件绑定。

// on()方法绑定事件// 基础绑定事件
元素集合.on('事件类型',事件处理函数)
$('div').on('click',function(){console.log('我是div的点击事件')})
​
// 事件委托绑定事件
元素集合.on('事件类型','选择器',事件处理函数)
// 事件委托绑定事件的含义是将子元素的事件绑定给父元素 只有触发子元素才能触发事件
$('div').on('click','p',function(){console.log('我是p的点击事件')})
​
// 批量绑定事件
元素集合.on({'事件类型1':事件处理函数1,'事件类型2':事件处理函数2,'事件类型3':事件处理函数3})
// 注意该方法不能处理事件委托类型事件绑定
$('div').on({
    'click':function(){console.log('我是点击事件')},
    'mouseover':function(){console.log('我是移入事件')},
    'mouseout':function(){console.log('我是移出事件')}
})
// one()方法绑定事件
​
注意,one()方法和on()方法是一样的,区别是只能触发一次事件。
// hover()方法绑定事件
​
元素集合.hover(移入时触发的函数,移出时触发的函数)
​
注意:当你只传递一个参数时,其会在移入和移出时均触发。
// 常用事件函数
​
元素集合.click(事件处理函数) ... 
​
$('div').click(function(){console.log('我是div的点击事件')})
// 给一个元素绑定多个事件
​
$('div').click(handleA)
        .click(handleB)
        .click(handleC)
​
注意:传递的是函数名,而不是函数名(),那样就执行啦。

10、事件解绑。

// off()事件解绑// 解绑全部事件处理函数
元素集合.off('事件类型')
$('div').off('click')
​
注意:其会把该元素所有该事件类型的事件均解绑
​
// 解绑指定的事件处理函数
元素集合.off('事件类型',需要解绑的函数名)
$('div').off('click',handleB)

11、事件触发。

// trigger()事件触发
​
元素集合.trigger('事件类型')
$('div').trigger('click')
​
注意:其是使用代码的方式触发事件,而不需要我们人为手动的去触发。

12、动画函数。

基本动画:

// 三个共同参数
1、第一个参数是运动时间
2、第二个参数是运动曲线
3、第三个参数是运动结束的回调函数
注意:可以将函数放在事件内,并且搭配按钮一起使用!
// show() 显示函数
// hide() 隐藏函数
// toggle() 切换函数 原来显示则隐藏 原来隐藏则显示
$('button:nth-child(1)').click(function(){
    // show
    $('.box').show(1000,'linear',function(){console.log('show结束了')})
})
$('button:nth-child(2)').click(function(){
    // hide
    $('.box').hide(1000,'linear',function(){console.log('hide结束了')})
})
$('button:nth-child(3)').click(function(){
    // toggle
    $('.box').toggle(1000,'linear',function(){console.log('toggle结束了')})
})

折叠动画:

slideDown      //向下
slideUp        //向上
slideToggle    //切换
​
注意:使用方法同上,只是改变了动画效果,其只改变元素的高度。

渐隐渐现:

fadeIn        //显示
fadeOut       //隐藏
fadeToggle    //切换
fadeTo        //多一个参数 第二个参数为指定的透明度 运动到指定的透明度

综合动画:

// animate()函数1、第一个参数是运动样式 以一个对象数据类型传递
2、第二个参数是运动时间
3、第三个参数是运动曲线
4、第四个参数是运动结束的回调函数
$('button').click(function(){
     $('.box').animate({width:'500px',height:'500px','background-color':'orange'},1000,'linear',function(){console.log('animate结束了')})
})

注意:颜色相关的不能运动,transform相关的也不能运动。

结束动画:

stop() // 会立即结束当前的所有运动 
​
比如你连续点击n次 当你停止点击 其仍会按照指定速度执行n次 当前第3stop()后马上停下来
​
注意:一般将其写在执行动画之前,即在执行新动画前,停止之前的动画。
finish() // 会立即完成之前的所有运动 
​
比如你连续点击n次 当你停止点击 其仍会按照指定速度执行n次 当前第3finish()后马上执行到结束处
​
注意:一般将其写在执行动画之前,即在执行新动画前,瞬间完成之前的动画。

13、Ajax。

注意:因为发送ajax请求不是操作DOM,所以不需要依赖选择器去获取元素,而是直接依赖JQuery或者$变量来使用。
$.ajax({本次发送ajax的配置项})
配置项:
1、url:必填,表示请求地址;
2、method:选填,默认是GET,表示请求方式;
3、data:选填,默认是'',表示携带给后端的参数;
4async:选填,默认是true,表示是否异步;
5、success:选填,表示请求成功的回调函数;
6error:选填,表示请求失败的回调函数;
$.post(url,data,callback,type) // 只有url必选 其他可选 type表示data的类型 

14、链式操作。

链式操作:指的是使用多个.对某一对象按照顺序进行先后操作。

$("#Test").addClass('style').find("div").eq(0).fadeOut(200);

注意:上述代码的含义是,选中id为Test的元素,首先为其加上类名style,接着找到其子元素中的所有div元素,然后找到这些div元素中的第一个div元素,最后使其以200毫秒的时间隐出。

15、其他。

表单数据获取:(一般将表单数据通过ajax发送给后端就用serialize)

$('form').serialize()  // 序列化表单值 返回值是&连接起来的key=value字符串
比如:username=123456&password=wxm&rpassword=wxm&nickname=wxm

location:(一般在js中刷新页面或者跳转页面就用window.location)

window.location.href='self.html'  // 当前页面打开self.html页面
window.location.reload()  // 刷新页面

16、localStorage。

localStorage:(一般同一网站的不同页面之间传递信息就用localStorage)

window.localStorage.setItem('token',res.token)  // 设置
window.localStorage.getItem('token')  // 获取

17、cookie。

cookie:( sessionID 钥匙 本地存储)

document.cookie="username=Kerwin"   // key=value形式的字符串// 设置路径
document.cookie="password=123456;Path=/"
var date=new Date() //当前日期
date.setHours(date.getHours()+1) //一小时过期
// 设置过期时间
document.cookie=`nickname=xiaohuilang;expires=${date}`

cookie可以通过浏览器检查工具Application的Storage的Cookies来查看。

// 获取 
console.log(document.cookie)  // 如果设置了HttpOnly则不可获取
// 输出:username=Kerwin; nickname=xiaohuilang; password=123456

注意:localStorage是挂在window身上的,而cookie是挂在document身上的;localStorage是永久存储,而cookie是关闭浏览器就没有啦。

18、jsonp。

同源策略:同域名、同端口号、同协议。如果不符合同源策略,浏览器为了安全,会阻止请求。

jsonp可以让网页从别的域名(网站)获取资料,即跨域获取。

注意:一个页面中可以编写多个script,当你页面中的script的src属性指向的是一个txt文件,其中写的是js代码,其仍然可以被正常执行。

jsonp的原理是:动态创建script标签,src属性指向没有跨域限制。其指向一个接口,接口返回格式一定是****()函数表达式。

http://www.runoob.com/try/ajax/jsonp.php?jsoncallback=callbackFunction //jsonp接口
​
注意:上述接口会返回一个***()函数表达式,在script中编写函数表达式对应的函数即可。
​
myscript.src="http://www.runoob.com/try/ajax/jsonp.php?jsoncallback=test" //函数名可更改
​
注意:callbackFunction返回callbackFunction用callbackFunction函数,test返回testtest函数。

缺点1:执行一次就创建一次script,这样会多余很多无用的标签。

//每点击一次就创建一个script
//等到script加载完成就删除
myscript.onload=function(){
     myscript.remove()
}

缺点2:只能执行get请求。(无法解决)

19、深浅拷贝。

赋值操作=:
①基本类型:将=右边元素值赋值给左边
②复杂类型:将=右边地址赋值给左边
​
复杂类型一级嵌套:(浅拷贝)
①for循环
②...解构赋值

一级嵌套可以循环,但是多级嵌套该怎么办呢?递归!当当前元素为复杂类型则递归循环!(深拷贝)

var myobj1={name:"wxm",location:{city:"wuhan",province:"hubei"},a:{b:{c:1}}}
// console.log(myobj1.toString())
// [object Object]
var myobj2={}
function deepCopy(o2,o1)
{
   for(var i in o1)
   {
        //if(o1[i]?.toString()==='[object Object]')  // 复杂类型 ?表示如果不为空则执行
        if(Object.prototype.toString.call(o1[i])==='[object Object]')
        {
             o2[i]={}
             deepCopy(o2[i],o1[i]) //递归
        }
        else if(Object.prototype.toString.call(o1[i])==='[object Array]') // 复杂类型 数组
        {
              o2[i]=[]
              deepCopy(o2[i],o1[i]) //递归
        }
        else  // 简单类型
             o2[i]=o1[i]
   }
}
deepCopy(myobj2,myobj1)

深拷贝还可以使用JSON!(唯一的缺点是字段不能有undefined)

var myobj3=JSON.parse(JSON.stringify(myobj1))

Jquery中的深浅拷贝:(唯一的缺点也是字段不能有undefined)

$.extend(true,myobj2,myobj1,{m:1,n:2})  //将myobj1和{m:1,n:2}深复制给myobj2 true表示深拷贝

20、多库并存。

多库并存主要解决我们自己的库与jquery库的$变量重名问题。

var $ = {name:"wxm"}  // $.js
<script src="./$.js"></script>
<script src="./jquery/jquery.js"></script>   // 注意jquery在后面 
<script>
   $.noConflict()  //表明把$交出去了 Jquery使用jQuery替代$
   console.log($,jQuery)  // {name:"wxm"}  ƒ ( selector, context )
</script>
var $ = {name:"wxm"}  var jQuery = {name:"hx"} // $.js
<script src="./$.js"></script>
<script src="./jquery/jquery.js"></script>  
<script>
   $.noConflict(true)  //表明把$和jQuery都交出去了
   console.log($,jQuery)  // {name:"wxm"}  {name:"hx"}
</script>
<script src="./$.js"></script>
<script src="./jquery/jquery.js"></script>
<script>
    var wxm = $.noConflict(true)  //表明使用wxm替代$
    console.log($,jQuery)
    console.log(wxm)  //ƒ ( selector, context )
</script>

21、扩展机制。

使用.extend()方法,给其传递一个对象,编写key:value,然后就可以实现.extend()方法,给其传递一个对象,编写key:value,然后就可以实现.key()自定义方法来扩展jquery。

<script>
   $.extend({  // 可以在该对象上挂多个函数
      wxm:function(){console.log("wxm")}
   })
   $.wxm();
</script>

注意:$.extend()方法在深浅拷贝中是传递多个对象,而在扩展机制中只是传递一个对象。

<script>
   $.extend({
       wxm:function(){console.log("wxm")}
   })
   $.wxm();
   console.log($.prototype===$.fn)
   $.fn.extend({    // 也可以在其原型上挂多个函数
       hx:function(){console.log("hx")}
   })
   $.prototype.hx();  //然后通过链式调用
   $.fn.hx();  // 如果直接$.hx()会报错
</script>

22、封装成库。

1、dom结构满足要求;(即引用别人的库需要按照别人规定的dom结构编写)
2、引入css样式文件;(即别人在编写库时会把功能的css文件封装起来)
3、引入js事件文件;(即别人在编写库时会把功能的js文件封装起来)

下载:owlcarousel2.github.io/OwlCarousel…

文档:www.htmleaf.com/jQuery/Slid…

引入jquery:
<script src="./jquery/jquery.js"></script>
​
引入css:
<link rel="stylesheet" href="./OwlCarousel2-2.3.4/dist/assets/owl.carousel.css">
<link rel="stylesheet" href="./OwlCarousel2-2.3.4/dist/assets/owl.theme.default.css">
​
引入js:
<script src="./OwlCarousel2-2.3.4/dist/owl.carousel.js"></script>
​
编写dom:
<div class="owl-carousel owl-theme">  //外层div类名为owl-carousel 插件主题类名owl-theme
   <div><img src="./imgs/01.jpg" alt=""></div>
   <div><img src="./imgs/02.jpg" alt=""></div>
   <div><img src="./imgs/03.jpg" alt=""></div>
   <div><img src="./imgs/04.jpg" alt=""></div>
</div>
​
初始化:
<script>
   $(document).ready(function(){
      $(".owl-carousel").owlCarousel();
   });
</script>
​
传参数:
<script>
   $(document).ready(function(){
      $(".owl-carousel").owlCarousel({
         items:1,       //显示一个项
         loop:true,     //循环播放
         autoplay:true  //自动播放
       });
   });
</script>

23、swiper。

下载:www.swiper.com.cn/download/in…

文档:www.swiper.com.cn/usage/index…

网站:www.swiper.com.cn/

演示:www.swiper.com.cn/demo/index.…

swiper:我们可以在演示中选择我们想要的样式,然后在新窗口中打开,并且查看源码,接着查看script中的参数并且插入到我们的代码中,最后查看效果。swiper基于原生js的库,不依赖于任何库。

24、jquery项目总结。

1、项目结构:一般分为css文件夹、js文件夹、img文件夹以及众多html文件,其中一般一个页面对应一个js文件以及css文件,所有页面会共有一个base.css文件。
2、布局结构:根据设计图稿,首先编写html内容文件,即该页面由哪些部分组成,然后对比原始样式与期望样式,编写css样式文件,即将原始结构内容的默认样式转换为效果样式,接着根据页面的交互事件,编写js事件文件,即为页面元素增加交互效果,最后根据页面之间的逻辑关系,更改html或者js文件。
3、选择结构:当某一部分两个元素结构之间是选择关系,即在某条件满足时则是1出现,反之不满足则是2出现,这时我们可以将12放在同一个元素内,然后将其中之一的class设置为active,然后在js中判断某一条件是否满足,如果是则将2移除active并将1添加active,反之则将1移除active并将2添加active。
4、水平结构:一般水平结构的多个元素,将其放在同一个元素内,然后使用flex布局。
5、分块结构:一般分块结构的多个元素,将其放在同一个元素内,然后使用定位(或者其他)布局。
6、筛选结构:一般类似于淘宝购物,涉及到很多筛选需求,不同的需求对应的页面的展示也会不同,其中会涉及到很多参数,这时我们可以将这些参数,诸如当前页、页面大小、搜索内容、分类、筛选、折扣、排序等,封装为一个对象,然后使用ajax传递给后端。如果页面的渲染需要使用后端传递过来的数据,也可以将前端原本写好的静态html放入js中进行动态的渲染,因为``模板字符串中可以使用${}嵌入变量。如果给后端发送请求时需要携带数据,而我们又无法获取,那么可以在渲染的时候加在元素身上。如果需要给某一元素的多个相同结构的子元素身上添加某一事件,那么可以通过给该元素添加委托事件来实现。