JQuery

jQuery

jQuery介绍

jQuery说明

  • jQuery内部封装了原生的JS代码(还额外添加了很多功能)

  • 能让我们通过书写更少的代码来完成js操作

  • 类似于Python里面的模块,在前端不叫模块,称为“类库”

  • 兼容多个浏览器,在使用jQuery的时候不需要考虑浏览器兼容问题

  • jQuery的宗旨

    • write less do more
    • 让你用更少的代码完成更多的事

jQuery导入

  1. 下载到本地,借助pycharm的辅助功能完成自动添加
  • 配置 --> 编辑 --> file and code template
  1. 直接引入jQuery提供的CDN服务(基于网络直接请求加载)

    • CDN:内容分发网络
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
    

jQuery基本语法

jQuery(选择器).action()
秉持着jQuery的宗旨 jQuery简写	$
jQuery()  === $()

# jQuery与js代码对比
eg:将p标签内部的文本颜色改为红色
// 原生js代码操作标签
let pEle = document.getElementById('d1')
pEle.style.color = 'red'

// jQuery操作标签
$('p').css('color','blue')

@选择器筛选器@

基本选择器

$("#d1")     // id选择器 找到所有id为d1的标签
$('.c1')     // 类选择器 找到所有类为c1的标签
$('div')     // 标签选择器 找到所有的div标签
$('div.c1')  // 配合使用 找到所有class为c1的div标签
$('div#d1')  // 配合使用 找到所有id为d1的div标签
$('*')       // 所有元素选择器 找到所有的标签
$('div, .c1, #d1')  // 组合选择器  找到所有的的div标签,类为c1的,id为d1的标签

#一定要区分开(重点)
// jQuery对象如何变成标签对象
$('#d1')[0] // <div id="d1"></div>
document.getElementById('d1') // <div id="d1"></div>
// 标签对象如何转jQuery对象
$(document.getElementById('d1')) // w.fn.init [div#d1]

层级选择器

$("x y");// x的所有后代y(子子孙孙)
$("x > y");// x的所有儿子y(儿子)
$("x + y")// 找到所有紧挨在x后面的y
$("x ~ y")// x之后所有的兄弟y

基本筛选器

:first  // 第一个
:last   // 最后一个
:eq(index)// 索引等于index的那个元素
:even // 匹配所有索引值为偶数的元素,从 0 开始计数
:odd // 匹配所有索引值为奇数的元素,从 0 开始计数
:gt(index)// 匹配所有大于给定索引值的元素
:lt(index)// 匹配所有小于给定索引值的元素
:not(元素选择器)// 移除所有满足not条件的标签
:has(元素选择器)// 选取所有包含一个或多个标签在其内的标签(指的是从后代元素找)

例子
$("div:has(h1)")// 找到所有后代中有h1标签的div标签
$("div:has(.c1)")// 找到所有后代中有c1样式类的div标签
$("li:not(.c1)")// 找到所有不包含c1样式类的li标签
$("li:not(:has(a))")// 找到所有后代中不含a标签的li标签

属性选择器

$('[username]')
w.fn.init(3) [input, input, p, prevObject: w.fn.init(1)]
$('[username="jason"]')
w.fn.init [input, prevObject: w.fn.init(1)]
$('p[username="egon"]')
w.fn.init [p, prevObject: w.fn.init(1)]

# 内置的属性
$('[type]')
w.fn.init(2) [input, input, prevObject: w.fn.init(1)]
$('[type="text"]')
w.fn.init(2) [input, input, prevObject: w.fn.init(1)]

表单筛选器

$('input[type="text"]')
$('input[type="password"]')
$(':text')  // 与第一个等价
$(':password')  //与第二个等价

:text
:password
:file
:radio
:checkbox
:submit
:reset
:button
...

# 表单对象属性
:enabled   // 找到可用的标签
:disabled
:checked
:selected   // 找到所有被选中的option

# 特殊情况
$(':checked')  // 它会将checked和selected都拿到
$(':selected')  // 它不会 只拿selected
$('input:checked')  // 自己加一个限制条件

筛选器方法

# 下一个
$("#d1").next()   // 返回同级别下 d1 后面的一个标签
$("#d1").nextAll()  // 返回同级别下 d1 后面所有的标签
$("#d1").nextUntil("#i2")   // 返回同级别下 d1 之后,d2 之前的所有标签
# 上一个
$("#d1").prev()   // 返回同级别下 d1 前面面的一个标签
$("#d1").prevAll()  // 返回同级别下 d1 前面所有的标签)
$("#d1").prevUntil("#i2")   // 返回同级别下 d1 之前,d2 之后的所有标签
# 父类
$("#d1").parent()    // 查找 d1 的父元素(一个)
$("#d1").parents()  // 查找 d1 的所有的父辈(祖先)元素
$("#d1").parentsUntil("#d2") // 返回介于 d1 与 d2 之间的所有祖先元素
# 子类和兄弟类
$("#id").children();// 儿子们(下面一个级别的所有,不包括下下级别的)
$("#id").siblings();// 兄弟们 同级别的所有,不包括自己
# 查找
$("div").find("p")  //找到div内的所有p标签   等价于$("div p")
# 筛选
$("div").filter(".c1")  // 从结果集中过滤出有c1样式类的,等价于 $("div.c1")

# 其他
.first() // 获取匹配的第一个元素
.last() // 获取匹配的最后一个元素
.not() // 从匹配元素的集合中删除与指定表达式匹配的元素
.has() // 保留包含特定后代的元素,去掉那些不含有指定后代的元素。
.eq() // 索引值等于指定值的元素

# 下述两两等价
$('div span:first')
$('div span').first()

$('div span:last')
$('div span').last()

操作标签

样式操作

# 操作class
.addClass();      // 添加指定的类名
.removeClass();   // 移除类
.hasClass();      // 判断是否存在
.toggleClass();   // 有则删除,无责添加

# 操作css样式
.css('color',red)  // 将文本颜色设置为红色  等同于js中的 .style.color='red'

位置操作

# 位置
.offset()  //相对于浏览器窗口的位置
.position()  //相对于父标签的位置
.scrollTop()  //相对页面顶部的偏移,可用于添加返回顶部按钮上
.scrollLeft()  // 相对于页面左侧的偏移

# 尺寸
.height()  // 单单内容的高度
.width()
.innerHeight()  // 内容 + padding 
.innerWidth()
.outerHeight()  // 内容 + padding + border
.outerWidth()

文本操作

# 文本内容
.text()  // 传值代表设置,不传值代表获取
# 文本+标签
.heml()
# 值
.val()

属性操作

.attr(name)  // 返回标签属性为name的值
.attr(name,value)  // 为标签设置 name = value 一个属性值
.attr(k1:v1, k2:v2) // 为标签设置多个属性值
.removeAttr(name)  //删除一个属性
# 用于checkbox和radio
prop() // 获取属性
removeProp() // 移除属性

在1.x及2.x版本的jQuery中使用attr对checkbox进行赋值操作时会出bug,在3.x版本的jQuery中则没有这个问题。为了兼容性,我们在处理checkbox和radio的时候尽量使用特定的prop(),不要使用attr("checked", "checked")。

$(":checkbox[value='1']").prop("checked", true);
$(":radio[value='2']").prop("checked", true);

文档处理

# 内部尾部追加
$(A).append(B)// 把B追加到A
$(A).appendTo(B)// 把A追加到B
# 内部首部追加
$(A).prepend(B)// 把B前置到A
$(A).prependTo(B)// 把A前置到B
# 追加到后面
$(A).after(B)// 把B放到A的后面
$(A).insertAfter(B)// 把A放到B的后面
# 追加到前面
$(A).before(B)// 把B放到A的前面
$(A).insertBefore(B)// 把A放到B的前面
# 移除和清空
remove()// 从DOM中删除所有匹配的元素。
empty()// 删除匹配的元素集合中所有的子节点。
# 替换
replaceWith() 
replaceAll()

事件

// 事件的两种书写方式
# 第一种
$('#d1').click(function(){
    alert('点击')
});
# 第二种(功能更强大,还支持事件委托)
$('#d1').on('click',function*(){
    alert('点击')
});

克隆事件

<!-- .clone()  将标签克隆一份 -->
<button id="d1" style="height: 50px;width: 70px">屠龙宝刀 点击就送</button>
<script>
    $('#d1').on('click',function () {
       // $(this).clone().insertAfter($(this))  // 默认不克隆事件,只克隆html和css
       $(this).clone(true).insertAfter($(this))
    });
</script>

左侧菜单

<!--编写说明:写一个将标签隐藏的类,点击菜单后将所有的子菜单添加上标签隐藏类,再将所点击的菜单的子菜单的标签隐藏属性删除-->

<script>
    $('.title').click(function () {
        // 先给所有的items加hide
        $('.items').addClass('hide')
        // 然后将被点击标签内部的hide移除
        $(this).children().removeClass('hide')
    });
</script>

返回顶部

<script>
    $(window).scroll(function () {
        if ($(window).scrollTop()>window.innerHeight){
            $('#d1').removeClass('hide')
        }else{
            $('#d1').addClass('hide')
        }
    })
</script>

自定义登录校验

<p>username:<input type="text" id="username"><span style="color: red"></span></p>
<p>password:<input type="password" id="password"><span style="color: red"></span></p>
<button id="btn1">登录</button>
<script>
    // 点击按钮时获取并判断输入的内容
    $('#btn1').on('click',function () {
        let username = $('#username').val()
        let password = $('#password').val()
        console.log(username)
        console.log(password)
        if (!username){
            $('#username+span').text('密码不能为空')
        }
        if (!password){
            $('#password+span').text('密码不能为空')
        }
    })
    // 当输入框获得焦点时去除提示
    $('input').focus(function (){
        $(this).next().text('')
    })
</script>

input内容实时监控

<input type="text" id="i1">
<script>
    $('#i1').on('input',function () {
        console.log(this.value)
    })

</script>

hover事件

<input type="text" id="i1">
<script>
    $('#i1').hover(function () {
        console.log('悬浮')
    },function () {
        console.log('移走')
    })
    /*$('#i1').on('mouseenter mouseleave',function (e) {
        if (e.type == 'mouseenter'){
            console.log('悬浮')
        }else if (e.type == 'mouseleave'){
            console.log('移走')
        }
    });*/
</script>

监听键盘按键

<script>
    $(window).keydown(function (event) {
        console.log(event.keyCode)  // 得到的是编码
        if (event.keyCode === 16){
            alert('你按了shift键')
        }
    })
</script>

阻止后续事件执行

<script>
    $('#d2').click(function (e) {
        $('#d1').text('宝贝 你能看到我吗?')
        // 阻止标签后续事件的执行 方式1
        // return false
        // 阻止标签后续事件的执行 方式2
        // e.preventDefault()
    })
</script>

### 阻止事件冒泡

​```html
<!--事件冒泡:执行当前标签的点击事件后会查看父级标签是否也有点击事件,如果有就相当于同时点击了父标签-->
<div id="d1">div
<p id="d2">p
    <span id="d3">span</span>
</p>
</div>
<script>
        $('#d1').click(function () {
            alert('div')
        })
        $('#d2').click(function () {
            alert('p')
        })
        $('#d3').click(function (e) {
            alert('span')
            // 阻止事件冒泡的方式1
            // return false
            // 阻止事件冒泡的方式2
            // e.stopPropagation()
        })
</script>

### 事件委托

​```html
<button>是兄弟,就来砍我!!!</button>

<script>
    // 给页面上所有的button标签绑定点击事件
    // $('button').click(function () {  // 无法影响到动态创建的标签
    //     alert(123)
    // })

    // 事件委托     
    $('body').on('click','button',function () {
        alert(123)  // 在指定的范围内 将事件委托给某个标签 无论该标签是事先写好的还是后面动态创建的
    })
</script>

### 页面加载

 ```js
 # 等待页面加载完毕再执行代码
 window.onload = function(){
   // js代码
 }
 
 """jQuery中等待页面加载完毕"""
 # 第一种
 $(document).ready(function(){
   // js代码
 })
 
 # 第二种
 $(function(){
   // js代码
 })
 
 # 第三种
 直接写在body内部最下方

动画效果

$('#d1').hide(5000)
$('#d1').show(5000)
$('#d1').slideUp(5000)
$('#d1').slideDown(5000)
$('#d1').fadeOut(5000)
$('#d1').fadeIn(5000)
$('#d1').fadeTo(5000,0.4)

each、data

# each()  建议版本的for循环,
# 第一个参数是索引,第二个参数是对应的对象

# 第一种用法
$('div').each(function(index){console.log(index)})
$('div').each(function(index,obj){console.log(index,obj)})
0 <div>1</div>
1 <div>2</div>
2 <div>3</div>
3 <div>4</div>

# 第二种用法
$.each([111,222,333],function(index,obj){console.log(index,obj)})
0 111
1 222
2 333
# data() 能让标签帮我们存储数据,在浏览器里看不见的数据
$('div').data('info','回来吧,我原谅你了!')  
# 给前面的对象加上  'info'='回来吧,我原谅你了!'
$('div').first().data('info')  
# 取出前面对象列表第一个的info对应的值
$('div').last().data('info')
# 取出最后一个的值
$('div').first().removeData('info')
# 删除第一个的info对应的值
posted @ 2021-08-17 19:18  zheng-sn  阅读(20)  评论(0)    收藏  举报