4. jQuery
前端之jQuery
"""
jQuery内部封装了原生的js代码(还额外添加了很多的功能)
能够让你通过书写更少的代码 完成js操作
类似于python里面的模块 在前端叫 “类库”
jQuery的时候就不需要考虑浏览器兼容问题
jQuery的宗旨
write less do more
让你用更少的代码完成更多的事情
"""
# jQuery在使用之前 一定要确保已经导入了
导入
# 1 文件下载到了本地 如何解决多个文件反复书写引入语句的代码
可以借助于pycharm自动初始化代码功能完成自动添加
配置——编辑——file and code template
# 2 直接引入jQuery提供的CDN服务(基于网络直接请求加载)
CDN:内容分发网络
CDN有免费的也有收费的
前端免费的cdn网站:
bootcdn
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
"""优点是不用下载文件,节省空间,缺点是必须有网络"""
# jQuery基本语法
jQuery(选择器).action()
jQuery可以简写成$
jQuery() === $()
# jQuery与js代码对比
eg:将p标签内部的文本颜色改为红色
// 原生js代码操作标签
let pEle = document.getElementById('d1')
pEle.style.color = 'red'
// jQuery操作标签
$('p').css('color','blue')
查找标签——基本选择器
// id选择器
$('#d1')
w.fn.init [div#d1]0: div#d1length: 1__proto__: Object(0)
// class选择器
$('.c1')
w.fn.init [p.c1, prevObject: w.fn.init(1)]0: p.c1length: 1prevObject: w.fn.init [document]__proto__: Object(0)
// 标签选择器
$('span')
w.fn.init(3) [span, span, span, prevObject: w.fn.init(1)]
"""标签对象与jQuery对象之间的转换(重点)"""
// jQuery对象如何变成标签对象
undefined
$('#d1')[0] // $('#d1')返回的是一个jQuery对象,本质上是一个数组,对其进行索引取值就得到了标签对象
<div id="d1">…</div>
document.getElementById('d1')
<div id="d1">…</div>
// 标签对象如何转jQuery对象
undefined
$(document.getElementById('d1'))
w.fn.init [div#d1]
组合选择器/分组与嵌套
$('div')
w.fn.init(2) [div#d1, div.c1, prevObject: w.fn.init(1)]
$('div.c1')
w.fn.init [div.c1, prevObject: w.fn.init(1)]0: div.c1length: 1prevObject: w.fn.init [document]__proto__: Object(0)
$('div#d1')
w.fn.init [div#d1, prevObject: w.fn.init(1)]
$('*')
w.fn.init(19) [html, head, meta, title, meta, link, script, script, body, span, span, div#d1, span, p#d2, span, span, div.c1, span, span, prevObject: w.fn.init(1)]
$('#d1,.c1,p') # 并列+混用
w.fn.init(3) [div#d1, p#d2, div.c1, prevObject: w.fn.init(1)]
$('div span') # 后代
w.fn.init(3) [span, span, span, prevObject: w.fn.init(1)]
$('div>span') # 儿子
w.fn.init(2) [span, span, prevObject: w.fn.init(1)]
$('div+span') # 毗邻
w.fn.init [span, prevObject: w.fn.init(1)]
$('div~span') # 弟弟
w.fn.init(2) [span, span, prevObject: w.fn.init(1)]
基本筛选器
$('ul li')
w.fn.init(10) [li, li, li, li, li, li, li.c1, li, li#d1, li, prevObject: w.fn.init(1)]
$('ul li:first') # 大儿子
w.fn.init [li, prevObject: w.fn.init(1)]0: lilength: 1prevObject: w.fn.init [document]__proto__: Object(0)
$('ul li:last') # 小儿子
w.fn.init [li, prevObject: w.fn.init(1)]0: lilength: 1prevObject: w.fn.init [document]__proto__: Object(0)
$('ul li:eq(2)') # 放索引
w.fn.init [li, prevObject: w.fn.init(1)]0: lilength: 1prevObject: w.fn.init [document]__proto__: Object(0)
$('ul li:even') # 偶数索引 0包含在内
w.fn.init(5) [li, li, li, li.c1, li#d1, prevObject: w.fn.init(1)]0: li1: li2: li3: li.c14: li#d1length: 5prevObject: w.fn.init [document]__proto__: Object(0)
$('ul li:odd') # 奇数索引
w.fn.init(5) [li, li, li, li, li, prevObject: w.fn.init(1)]0: li1: li2: li3: li4: lilength: 5prevObject: w.fn.init [document]__proto__: Object(0)
$('ul li:gt(2)') # 大于索引
w.fn.init(7) [li, li, li, li.c1, li, li#d1, li, prevObject: w.fn.init(1)]0: li1: li2: li3: li.c14: li5: li#d16: lilength: 7prevObject: w.fn.init [document]__proto__: Object(0)
$('ul li:lt(2)') # 小于索引
w.fn.init(2) [li, li, prevObject: w.fn.init(1)]0: li1: lilength: 2prevObject: w.fn.init [document]__proto__: Object(0)
$('ul li:not("#d1")') # 移除满足条件的标签
w.fn.init(9) [li, li, li, li, li, li, li.c1, li, li, prevObject: w.fn.init(1)]
$('div')
w.fn.init(2) [div, div, prevObject: w.fn.init(1)]
$('div:has("p")') # 选取出div标签里面包含一个或多个p标签在内的标签
w.fn.init [div, prevObject: w.fn.init(1)]
属性选择器
$('[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"]')
w.fn.init [input, prevObject: w.fn.init(1)]0: inputlength: 1prevObject: w.fn.init [document]__proto__: Object(0)
$('input[type="password"]')
w.fn.init [input, prevObject: w.fn.init(1)]
$(':text') # 等价于上面第一个
w.fn.init [input, prevObject: w.fn.init(1)]0: inputlength: 1prevObject: w.fn.init [document]__proto__: Object(0)
$(':password') # 等价于上面第二个
w.fn.init [input, prevObject: w.fn.init(1)]
:text
:password
:file
:radio
:checkbox
:submit
:reset
:button
...
表单对象属性
:enabled
:disabled
:checked
:selected
"""特殊情况"""
$(':checked') # 它会将checked和selected都拿到
w.fn.init(2) [input, option, prevObject: w.fn.init(1)]0: input1: optionlength: 2prevObject: w.fn.init [document]__proto__: Object(0)
$(':selected') # 只拿selected
w.fn.init [option, prevObject: w.fn.init(1)]
$('input:checked') # 在使用checked的时候自己加一个限制条件
w.fn.init [input, prevObject: w.fn.init(1)]
筛选器方法
$('#d1').next() # 同级别下一个
w.fn.init [span, prevObject: w.fn.init(1)]0: spanlength: 1prevObject: w.fn.init [span#d1]__proto__: Object(0)
$('#d1').nextAll()
w.fn.init(5) [span, div#d2, span, span, span.c1, prevObject: w.fn.init(1)]0: span1: div#d22: span3: span4: span.c1length: 5prevObject: w.fn.init [span#d1]__proto__: Object(0)
$('#d1').nextUntil('.c1') # 不包括最后一个
w.fn.init(4) [span, div#d2, span, span, prevObject: w.fn.init(1)]0: span1: div#d22: span3: spanlength: 4prevObject: w.fn.init [span#d1]__proto__: Object(0)
$('.c1').prev() # 上一个
w.fn.init [span, prevObject: w.fn.init(1)]0: spanlength: 1prevObject: w.fn.init [span.c1, prevObject: w.fn.init(1)]__proto__: Object(0)
$('.c1').prevAll()
w.fn.init(5) [span, span, div#d2, span, span#d1, prevObject: w.fn.init(1)]
$('.c1').prevUntil('#d2')
w.fn.init(2) [span, span, prevObject: w.fn.init(1)]
$('#d3').parent() # 第一级父标签
w.fn.init [p, prevObject: w.fn.init(1)]0: plength: 1prevObject: w.fn.init [span#d3]__proto__: Object(0)
$('#d3').parent().parent()
w.fn.init [div#d2, prevObject: w.fn.init(1)]
$('#d3').parent().parent().parent()
w.fn.init [body, prevObject: w.fn.init(1)]
$('#d3').parentsUntil('body')
w.fn.init(2) [p, div#d2, prevObject: w.fn.init(1)]
$('#d2').children() # 儿子
$('#d2').siblings() # 同级别上下所有
$('div p')
# 等价
$('div').find('p') # find从某个区域内筛选出想要的标签
"""下述两两等价"""
$('div span:first')
w.fn.init [span, prevObject: w.fn.init(1)]
$('div span').first()
w.fn.init [span, prevObject: w.fn.init(3)]0: spanlength: 1prevObject: w.fn.init(3) [span, span#d3, span, prevObject: w.fn.init(1)]__proto__: Object(0)
$('div span:last')
w.fn.init [span, prevObject: w.fn.init(1)]
$('div span').last()
$('div span:not("#d3")')
w.fn.init(2) [span, span, prevObject: w.fn.init(1)]
$('div span').not('#d3')
w.fn.init(2) [span, span, prevObject: w.fn.init(3)]
操作标签
# js与jQuery的操作类对比"""js版本 jQuery版本classList.add() addClass()classList.remove() removeClass()classList.contains() hasClass()classList.toggle() toggleClass()"""# css操作<p>111</p><p>222</p>"""一行代码将第一个p标签变成红色第二个p标签变成绿色"""$('p').first().css('color','red').next().css('color','green')# jQuery的链式操作 使用jQuery可以做到一行代码操作很多标签# jQuery对象调用jQuery方法之后返回的还是当前jQuery对象 也就可以继续调用其他方法class MyClass(object): def func1(self): print('func1') return self def func2(self): print('func2') return selfobj = MyClass()obj.func1().func2()# 位置操作offset() # 相对于浏览器窗口position() # 相对于父标签$(window).scrollTop() # 括号内不加参数就是获取 1733$(window).scrollTop(500) # 加了参数就是设置 n.fn.init [Window]scrollLeft()scrollRight()scrollBottom()# 尺寸$('p').height() # 文本的高度(详见盒子模型)20$('p').width() # 文本的宽度1670$('p').innerHeight() # 文本+padding26$('p').innerWidth()1674$('p').outerHeight() # 文本+padding+border26$('p').outerWidth()1674# 文本操作"""操作标签内部文本的比较js jQueryinnerText text() 括号内不加参数就是获取加了就是设置innerHTML html()$('div').text() # 下面是返回的结果" 有些话听听就过去了,不要在意,都是成年人! "$('div').html() # 下面是返回的结果" <p> 有些话听听就过去了,不要在意,都是成年人! </p>"$('div').text('你们都是我的大宝贝')w.fn.init [div, prevObject: w.fn.init(1)]$('div').html('你个臭妹妹')w.fn.init [div, prevObject: w.fn.init(1)]$('div').text('<h1>你们都是我的大宝贝</h1>')w.fn.init [div, prevObject: w.fn.init(1)]$('div').html('<h1>你个臭妹妹</h1>')w.fn.init [div, prevObject: w.fn.init(1)]"""# 获取值操作"""js jQuery.value .val()"""$('#d1').val()"sasdasdsadsadad"$('#d1').val('520快乐') # 括号内不加参数就是查看加了就是设置$('#d2').val()"C:\fakepath\01_测试路由.png"$('#d2')[0].files[0] # 牢记两个对象之间的转换File {name: "01_测试路由.png", lastModified: 1557043083000, lastModifiedDate: Sun May 05 2019 15:58:03 GMT+0800 (中国标准时间), webkitRelativePath: "", size: 28733, …}# 属性操作"""js中 jQuerysetAttribute() attr(name,value)getAttribute() attr(name)removeAttribute() removeAttr(name)在用变量存储对象的时候 js中推荐使用 XXXEle 标签对象jQuery中推荐使用 $XXXEle jQuery对象"""let $pEle = $('p')undefined$pEle.attr('id')"d1"$pEle.attr('class')undefined$pEle.attr('class','c1')w.fn.init [p#d1.c1, prevObject: w.fn.init(1)]$pEle.attr('id','id666')w.fn.init [p#id666.c1, prevObject: w.fn.init(1)]$pEle.attr('password','jason123')w.fn.init [p#id666.c1, prevObject: w.fn.init(1)]$pEle.removeAttr('password')w.fn.init [p#id666.c1, prevObject: w.fn.init(1)] """对于标签上有的能够看到的属性和自定义属性用attr对于返回布尔值比如checkbox radio option是否被选中用prop""" $('#d3').attr('checked')"checked"$('#d2').attr('checked')undefined$('#d2').attr('checked')undefined$('#d4').attr('checked')undefined$('#d3').attr('checked')"checked"$('#d3').attr('checked','checked') # 无效w.fn.init [input#d3]# 实际上我们检验checked的时候是希望能够返回直观的能够判断的结果,最好是true和false,这样可以使用结果进行一些判断和操作,座椅一般使用prop更好 $('#d2').prop('checked')false$('#d2').prop('checked')true$('#d3').prop('checked',true)w.fn.init [input#d3]$('#d3').prop('checked',false)w.fn.init [input#d3] # 文档处理"""js jQuerycreateElement('p') $('<p>')appendChild() append()"""let $pEle = $('<p>')$pEle.text('你好啊 草莓要不要来几个?')$pEle.attr('id','d1') $('#d1').append($pEle) # 内部尾部追加$pEle.appendTo($('#d1')) # 就是顺序不一样,效果是一样的 $('#d1').prepend($pEle) # 内部头部追加$pEle.prependTo($('#d1')) $('#d2').after($pEle) # 放在某个标签后面$pEle.insertAfter($('#d1')) $('#d1').before($pEle) # 放在某个标签前面$pEle.insertBefore($('#d2'))$('#d1').remove() # 将标签从DOM树中删除w.fn.init [div#d1] $('#d1').empty() # 清空标签内部所有的内容w.fn.init [div#d1]
事件
// 第一种 $('#d1').click(function () { alert('别说话 吻我') }); // 第二种(功能更加强大 还支持事件委托) $('#d2').on('click',function () { alert('借我钱买草莓 后面还你') })
-
克隆事件
<button id="d1">屠龙宝刀,点击就送</button><script> $('#d1').on('click',function () { // console.log(this) // this指代是当前被操作的标签对象 // $(this).clone().insertAfter($('body')) // clone默认情况下只克隆html和css 不克隆事件 $(this).clone(true).insertAfter($('body')) // 括号内加true即可克隆事件 })</script> -
自定义模态框
"""模态框内部本质就是给标签移除或者添加上hide属性""" -
左侧菜单
<script> $('.title').click(function () { // 先给所有的items加hide $('.items').addClass('hide') // 然后将被点击标签内部的hide移除 $(this).children().removeClass('hide') })</script><!--尝试用一行代码搞定上面的操作--> -
返回顶部
<script> $(window).scroll(function () { if($(window).scrollTop() > 300){ $('#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="text" id="password"> <span style="color: red"></span></p><button id="d1">提交</button><script> let $userName = $('#username') let $passWord = $('#password') $('#d1').click(function () { // 获取用户输入的用户名和密码 做校验 let userName = $userName.val() let passWord = $passWord.val() if (!userName){ $userName.next().text("用户名不能为空") } if (!passWord){ $passWord.next().text('密码不能为空') } }) $('input').focus(function () { $(this).next().text('') })</script> -
input实时监控
<input type="text" id="d1"><script> $('#d1').on('input',function () { console.log(this.value) })</script> -
hover事件
<script> // $("#d1").hover(function () { // 鼠标悬浮 + 鼠标移开 // alert(123) // }) $('#d1').hover( function () { alert('我来了') // 悬浮 }, function () { alert('我溜了') // 移开 } )</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>
阻止事件冒泡
<script> $('#d1').click(function () { alert('div') }) $('#d2').click(function () { alert('p') }) $('#d3').click(function (e) { alert('span') // 阻止事件冒泡的方式1 // return false // 阻止事件冒泡的方式2 // e.stopPropagation() })</script>
事件委托
<button>是兄弟,就来砍我!!!</button><script> // 给页面上所有的button标签绑定点击事件 // $('button').click(function () { // 无法影响到动态创建的标签 // alert(123) // }) // 事件委托 $('body').on('click','button',function () { alert(123) // 在指定的范围内 将事件委托给某个标签 无论该标签是事先写好的还是后面动态创建的 })</script>
页面加载
# 等待页面加载完毕再执行代码window.onload = function(){ // js代码}"""jQuery中等待页面加载完毕"""# 第一种$(document).ready(function(){ // js代码})# 第二种$(function(){ // js代码})# 第三种"""直接写在body内部最下方"""
动画效果
$('#d1').hide(5000)w.fn.init [div#d1]$('#d1').show(5000)w.fn.init [div#d1]$('#d1').slideUp(5000)w.fn.init [div#d1]$('#d1').slideDown(5000)w.fn.init [div#d1]$('#d1').fadeOut(5000)w.fn.init [div#d1]$('#d1').fadeIn(5000)w.fn.init [div#d1]$('#d1').fadeTo(5000,0.4)w.fn.init [div#d1]
补充
# each()# 第一种方式$('div')w.fn.init(10) [div, div, div, div, div, div, div, div, div, div, prevObject: w.fn.init(1)]$('div').each(function(index){console.log(index)})VM181:1 0VM181:1 1VM181:1 2VM181:1 3VM181:1 4VM181:1 5VM181:1 6VM181:1 7VM181:1 8VM181:1 9$('div').each(function(index,obj){console.log(index,obj)})VM243:1 0 <div>1</div>VM243:1 1 <div>2</div>VM243:1 2 <div>3</div>VM243:1 3 <div>4</div>VM243:1 4 <div>5</div>VM243:1 5 <div>6</div>VM243:1 6 <div>7</div>VM243:1 7 <div>8</div>VM243:1 8 <div>9</div>VM243:1 9 <div>10</div># 第二种方式$.each([111,222,333],function(index,obj){console.log(index,obj)})VM484:1 0 111VM484:1 1 222VM484:1 2 333(3) [111, 222, 333]"""有了each之后 就无需自己写for循环了 用它更加的方便"""# data()"""能够让标签帮我们存储数据 并且用户肉眼看不见"""$('div').data('info','回来吧,我原谅你了!')w.fn.init(10) [div#d1, div, div, div, div, div, div, div, div, div, prevObject: w.fn.init(1)] $('div').first().data('info')"回来吧,我原谅你了!"$('div').last().data('info')"回来吧,我原谅你了!" $('div').first().data('xxx')undefined$('div').first().removeData('info')w.fn.init [div#d1, prevObject: w.fn.init(10)] $('div').first().data('info')undefined$('div').last().data('info')"回来吧,我原谅你了!"
前端框架Bootstrap
该框架已经帮你写好了很多页面样式,你如果需要使用,只需要下载它对应文件,之后直接cv拷贝即可
在使用Bootstrap的时候所有的页面样式都只需要你通过class来调节即可
版本选择建议使用v3版本:https://v3.bootcss.com/
登录网站的时候有中文文档介绍,可以自己学习
注意:bootstrap的js代码是依赖于jQuery的,也就意味着你在使用Bootstrap动态效果的时候,一定要导入jQuery
布局容器
<div class="container"> 左右两侧有留白</div><div class="container-fluid"> 左右两侧没有留白</div># 后续在使用bootstrap做页面的时候 上来先写一个div class=container,之后在div内部书写页面
栅格系统
<div class="row"></div>写一个row就是将所在的区域划分成12份<div class="col-md-6 "> 获取你所要的份数# 在使用bootstrap的时候 脑子里面一定要做12的加减法
栅格参数
.col-xs- .col-sm- .col-md- .col-lg-# 针对不同的显示器 bootstrap会自动选择对应的参数# 如果你想要兼容所有的显示器 你就全部加上即可# 在一行如何移动位置<div class="col-md-8 c1 col-md-offset-2"></div>
排版
bootstrap将所有原生的HTML标签的文本字体统一设置成了肉眼可以接受的样式
效果一样,但是标签表达的意思不一样(语义)
表格
<table class="table table-hover table-striped table-bordered"> <tr class="success"> <td>1</td> <td>jason</td> <td>123</td> <td>study</td></tr><tr class="active">...</tr><tr class="success">...</tr><tr class="warning">...</tr><tr class="danger">...</tr><tr class="info">...</tr>
表单
<div class="container"> <div class="col-md-8 col-md-offset-2"> <h2 class="text-center">登陆页面</h2> <form action=""> <p>username:<input type="text" class="form-control"></p> <p>password:<input type="text" class="form-control"></p> <p> <select name="" id="" class="form-control"> <option value="">111</option> <option value="">222</option> <option value="">333</option> </select> </p> <textarea name="" id="" cols="30" rows="10" class="form-control"></textarea> <input type="submit"> </form> </div></div># 针对表单标签 加样式就用form-control class="form-control""""<input type="checkbox">222<input type="radio">333checkbox和radio我们一般不会给它加form-control,直接使用原生的即可"""# 针对报错信息 可以加has-error(input的父标签加)<p class="has-error"> username: <input type="text" class="form-control"></p>
按钮
<a href="https://www.mzitu.com/" class="btn btn-primary">点我</a><button class="btn btn-danger">按我</button><button class="btn btn-default">按我</button><button class="btn btn-success">按我</button><button class="btn btn-info">按我</button><button class="btn btn-warning">按我</button><button class="btn btn-warning btn-lg">按我</button><button class="btn btn-warning btn-sm">按我</button><button class="btn btn-warning btn-xs">按我</button><input type="submit" class="btn btn-primary btn-block"> 通过给按钮添加 .btn-block 类可以将其拉伸至父元素100%的宽度,而且按钮也变为了块级(block)元素。
图表
<h2 class="text-center">登陆页面 <span class="glyphicon glyphicon-user"></span></h2> <style> span { color: greenyellow; } </style># 扩展
导航条
<nav class="navbar navbar-inverse"><nav class="navbar navbar-default">
分页器
<nav aria-label="Page navigation"> <ul class="pagination"> <li> <a href="#" aria-label="Previous"> <span aria-hidden="true">«</span> </a> </li> <li class="active"><a href="#">1</a></li> <li><a href="#">2</a></li> <li><a href="#">3</a></li> <li><a href="#">4</a></li> <li><a href="#">5</a></li> <li> <a href="#" aria-label="Next"> <span aria-hidden="true">»</span> </a> </li> </ul></nav>
弹框
https://lipis.github.io/bootstrap-sweetalert/ swal('你还好吗?')undefinedswal('你还好吗?')undefinedswal('你还好吗?','我不好,想你了!')undefinedswal('你还好吗?','我不好,想你了!','success')undefinedswal('你还好吗?','我不好,想你了!','warning')undefinedswal('你还好吗?','我不好,想你了!','error')undefinedswal('你还好吗?','我不好,想你了!','info')undefined# 我们在后面的课程中 还会涉及到该部分内容

浙公网安备 33010602011771号