javaScript库:即 library ,是一个封装好的特定集合(方法和函数)。从封装一大堆函数的角度理解库,就是在这个库中,封装了很多预先定义好的函数在里面,比如动画animate、hide、show,比如获取元素等。
简单理解:就是一个JS文件,里面对我们原生js代码进行了封装,存放到里面。我们可以快速高效的使用这些封装好的功能了。
比如jQuery,就是为了快速方便的操作DOM,里面基本都是函数(方法)。
常见的JavaScript 库:jQuery、Prototype、YUI、Dojo、Ext JS、移动端的zepto等,这些库都是对原生 JavaScript 的封装,内部都是用 JavaScript 实现的,我们主要学习的是 jQuery。
jQuery总体概况如下:
● jQuery 是一个快速、简洁的 JavaScript 库,其设计的宗旨是“write Less,Do More”,即倡导写更少的代码,做更多的事情。
● j 就是 JavaScript; Query 查询; 意思就是查询js,把js中的DOM操作做了封装,我们可以快速的查询使用里面的功能。
● jQuery 封装了 JavaScript 常用的功能代码,优化了 DOM 操作、事件处理、动画设计和 Ajax 交互。
● 学习jQuery本质: 就是学习调用这些函数(方法)。
● jQuery 出现的目的是加快前端人员的开发速度,我们可以非常方便的调用和使用它,从而提高开发效率
● 轻量级。核心文件才几十kb,不会影响页面加载速度。
● 跨浏览器兼容,基本兼容了现在主流的浏览器。
● 链式编程、隐式迭代。
● 对事件、样式、动画支持,大大简化了DOM操作。
● 支持插件扩展开发。有着丰富的第三方的插件,例如:树形菜单、日期控件、轮播图等。
● 免费、开源。
jQuery的官网地址: https://jquery.com/,官网即可下载最新版本。
各个版本得下载: https://code.jquery.com/
版本介绍:
1x :兼容 IE 678 等低版本浏览器, 官网不再更新
2x :不兼容 IE 678 等低版本浏览器, 官网不再更新
3x :不兼容 IE 678 等低版本浏览器, 是官方主要更新维护的版本
步骤:
● 引入jQuery文件。
● 在文档最末尾插入 script 标签,书写体验代码。
● $(‘div’).hide() 可以隐藏盒子。
jQuery种常见的两种入口函数:
// 第一种: 简单易用。
$(function () {
... // 此处是页面 DOM 加载完成的入口
}) ;
// 第二种: 繁琐,但是也可以实现
$(document).ready(function(){
... // 此处是页面DOM加载完成的入口
});
总结:
● 等着 DOM 结构渲染完毕即可执行内部代码,不必等到所有外部资源加载完成,jQuery 帮我们完成了封装。
● 相当于原生 js 中的 DOMContentLoaded。
● 不同于原生 js 中的 load 事件是等页面文档、外部的 js 文件、css文件、图片加载完毕才执行内部代码。
● 更推荐使用第一种方式。
● $是 jQuery 的别称,在代码中可以使用 jQuery 代替,但一般为了方便,通常都直接使用 $。
● 是jQuery的顶级对象,相当于原生JavaScript中的 window。把元素利用$包装成jQuery对象,就可以调用jQuery 的方法。
使用 jQuery 方法和原生JS获取的元素是不一样的,总结如下 :
注意:
只有 jQuery 对象才能使用 jQuery 方法,DOM 对象则使用原生的 JavaScirpt 方法。
DOM 对象与 jQuery 对象之间是可以相互转换的。因为原生js 比 jQuery 更大,原生的一些属性和方法 jQuery没有给我们封装. 要想使用这些属性和方法需要把jQuery对象转换为DOM对象才能使用。
// 1.DOM对象转换成jQuery对象,方法只有一种
var box = document.getElementById('box'); // 获取DOM对象
var jQueryObject = $(box); // 把DOM对象转换为 jQuery 对象
// 2.jQuery 对象转换为 DOM 对象有两种方法:
// 2.1 jQuery对象[索引值]
var domObject1 = $('div')[0]
// 2.2 jQuery对象.get(索引值)
var domObject2 = $('div').get(0)
总结:实际开发比较常用的是把DOM对象转换为 jQuery对象,这样能够调用功能更加强大的jQuery中的方法。
原生 JS 获取元素方式很多,很杂,而且兼容情况不一致,因此 jQuery 给我们做了封装,使获取元素统一标准。
$"(选择器)" //里面选择器直接写 CSS 选择器即可,但是要加引号
层级选择器最常用的两个分别为:后代选择器和子代选择器。
基础选择器和层级选择器案例代码
<body>
<div>我是div</div>
<div class="nav">我是nav div</div>
<p>我是p</p>
<ul>
<li>我是ul 的</li>
<li>我是ul 的</li>
<li>我是ul 的</li>
</ul>
<script>
$(function() {
console.log($(".nav"));
console.log($("ul li"));
})
</script>
</body>
● 遍历内部 DOM 元素(伪数组形式存储)的过程就叫做隐式迭代。
● 简单理解:给匹配到的所有元素进行循环遍历,执行相应的方法,而不用我们再进行循环,简化我们的操作,方便我们调用。
$('div').css("width","100px") 所有的div
$('li').eq(n):找到第n个
$('li').first():找到所有元素中的第一个
$('li').last():找到所有元素中的最后一个
$('li:eq(3)').next():找到某一个元素的下一个兄弟元素
$('li:eq(3)').prev():找到某一个元素的上一个兄弟元素
$('li:eq(3)').nextAll():找到某一个元素的后面的所有兄弟元素
$('li:eq(3)').prevAll():找到某一个元素的前面的所有兄弟元素
$('li:eq(3)').parent(): 找到某一个元素的父元素
$('li:eq(3)').parents():找到某一个元素的所有结构父级,一直到 html
找到一组元素中的某一个:
// 在 li 的所有父级里面找到所有 body 标签 $('li').parents().find('body')
// 找到 div 标签下所有后代元素中所有类名为 box 的元素 $('div').find('.box')
筛选选择器,顾名思义就是在所有的选项中选择满足条件的进行筛选选择。常见如下:
案例代码
<body>
<ul>
<li>多个里面筛选几个</li>
<li>多个里面筛选几个</li>
<li>多个里面筛选几个</li>
<li>多个里面筛选几个</li>
<li>多个里面筛选几个</li>
<li>多个里面筛选几个</li>
</ul>
<ol>
<li>多个里面筛选几个</li>
<li>多个里面筛选几个</li>
<li>多个里面筛选几个</li>
<li>多个里面筛选几个</li>
<li>多个里面筛选几个</li>
<li>多个里面筛选几个</li>
</ol>
<script>
$(function() {
$("ul li:first").css("color", "red");
$("ul li:eq(2)").css("color", "blue");
$("ol li:odd").css("color", "skyblue");
$("ol li:even").css("color", "pink");
})
</script>
</body>
另:jQuery中还有一些筛选方法,类似DOM中的通过一个节点找另一个节点,父、子、兄以外有所加强。
想要多选一的效果,排他思想:当前元素设置样式,其余的兄弟元素清除样式。
$(this).css(“color”,”red”);
$(this).siblings(). css(“color”,””);
链式编程是为了节省代码量,看起来更优雅
$(this).css('color', 'red').sibling().css('color', '');
jQuery中常用的样式操作有两种:css() 和设置类样式方法
jQuery 可以使用css方法来修改简单元素样式;也可以操作类,修改多个样式
常用以下三种形式:
// 1.参数只写属性名,则是返回属性值
var strColor = $(this).css('color');
// 2. 参数是属性名,属性值,逗号分隔,是设置一组样式,属性必须加引号,值如果是数字可以不用跟单位和引号
$(this).css('color', 'red');
// 3. 参数可以是对象形式,方便设置多组样式。属性名和属性值用冒号隔开, 属性可以不用加引号
$(this).css({ "color":"white","font-size":"20px"});
注意:css() 多用于样式少时操作,多了则不太方便。
作用等同于以前的 classList,可以操作类样式,注意操作类里面的参数不要加点。
常用的三种设置类样式的方法:
// 1.添加类
$("div").addClass("current");
// 2.删除类
$("div").removeClass("current");
// 3.切换类
$("div").toggleClass("current");
// 4. 包含类
$("div").hasClass("current");
注意:
● 设置类样式方法比较适合样式多时操作,可以弥补css()的不足。
● 原生 JS 中 className 会覆盖元素原先里面的类名,jQuery 里面类操作只是对指定类进行操作,不影响原先的类名。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.active{
background-color: yellow;
color: #fff;
font-size: 30px;
}
#box{
width: 400px;
height: 80px;
background-color: pink;
}
</style>
</head>
<body>
<div>
<button>娱乐</button>
<button>美食</button>
<button>体育</button>
</div>
<div id="box">
</div>
</body>
</html>
<script src="./jquery.js"></script>
<!--
jsDOM操作: jq操作
获取元素 选择器获取元素
设置样式 设置样式
oDiv.style.属性 $div.css('属性','属性值')
oDiv.className $div.css({'属性':'属性值','属性':'属性值'。。。})
oDiv.classList.add() $div.addClass('类名')、 $div.removeClass('类名')、 $div.toggleClass('类名')
设置内容 /获取内容 设置内容/获取内容
oDiv.innerHTML = ''/oDiv.innerHTML $div.html('哈哈')/$('div').html()
oDiv.innerText = ''/oDiv.innerText $div.text('哈哈')/$('div').text()
oDiv.value = '' $div.val('哈哈')/$('div').val()
设置属性
-->
<script>
let arr = ["娱乐内容","美食内容","体育内容"]
$('button').on('click',function(){
$(this).addClass('active').siblings('button').removeClass('active');
$('#box').html(arr[$(this).index()]);
})
</script>
● 原生的js中className会覆盖元素原先里面的类名
● addClass相当于追加类名 不影响以前的类名
jQuery 常用属性操作有三种:prop() / attr() / data();
所谓元素固有属性就是元素本身自代的属性,比如< a > 元素里面的 href, 比如< input > 元素里面的 type。
语法:
注意:porp() 除了普通属性操作,更适合操作表单属性:disabled / checked / selected 等
用户自己给元素添加的属性,我们称为自定义属性。比如给 div 添加 index = “1”。
语法:
1. 获取属性语法attr("属性") // 类似原生的getAttribute
2. 设置属性语法attr("属性", "属性值") // 类似原生的setAttribute
注意:attr() 除了普通属性操作,更适合操作自定义属性。(该方法也可以获取 H5 自定义属性)
移除元素的自定义属性:$('div').removeAttr('index')
jQuery的文本属性值常见操作有三种:html() / text() / val();
分别对应JS中的 innerHTML、innerText 和 value 属性
jQuery的文本属性值常见操作有三种:html() / text() / val() ;
分别对应JS中的 innerHTML 、innerText 和 value 属性
常见操作有三种:html() / text() / val() ;
分别对应JS中的 innerHTML 、innerText 和 value 属性,
主要针对元素的内容还有表单的值操作。
语法:
var div = $('')
// 向 div 元素中插入一个 p 元素,放在最后
$('div').append($(''))
// 把 p 元素插入到 div 中去,放在最后
$('hello
').appendTo($('div'))
// 向 div 元素中插入一个 p 元素,放在最前
$('div').prepend($(''))
// 把 p 元素插入到 div 中去,放在最前
$('hello
').prependTo($('div'))
// 在 div 的后面插入一个元素 p
$('div').after($(''))
// 在 div 的前面插入一个元素 p
$('div').before($(''))
// 把 p 元素插入到 div 元素的后面
$('div').insertAfter($(''))
// 把 p 元素插入到 div 元素的前面
$('div').insertBefore($(''))
// 把 div 元素替换成 p 元素
$('div').replaceWith($(''))
// 用 p 元素替换掉 div 元素
$('').replaceAll($('div'))
// 删除元素下的所有子节点
$('div').empty()
// 把自己从页面中移除
$('div').remove()
// 克隆一个 li 元素
// 接受两个参数
// 参数1: 自己身上的事件要不要复制,默认是 false
// 参数2: 所有子节点身上的事件要不要复制,默认是 true
$('li').clone()
var arr = ["red","yellow","pink"]
$('div').each((index,item)=>{
$(item).css("background",arr[index])
})
因为普通注册事件方法的不足,jQuery又开发了多个处理方法,重点讲解如下:
● on(): 用于事件绑定,目前最好用的事件绑定方法
● off(): 事件解绑
● trigger() / triggerHandler(): 事件触发
● one():事件触发一次
// 给 button 按钮绑定一个点击事件
$('button').on('click', function () {
console.log('我被点击了')
})
// 给 button 按钮绑定一个 点击事件,执行 handler 函数
$('button').on('click', handler)
// 移除事件使用 off
$('button').off('click', handler)
// 这个事件绑定再 button 按钮身上
// 当执行过一次以后就不会再执行了
$('button').one('click', function(){})
// 当代码执行到这里的时候,会自动触发一下 button 的 click 事件
$('button').trigger('click')
$('button').triggerHandler('click')
区别:triggerHandler只会触发JQ对象集合中第一个元素的事件处理函数,也不会产生事件冒泡。
而trigger触发JQ对象集合中所有元素的事件处理函数,而且会产生事件冒泡
// 获取 div 元素内容位置的高,不包含 padding 和 border
$('div').height()
// 设置 div 内容位置的高为 200px
$('div').height(200)
// 获取 div 元素内容位置的宽,不包含 padding 和 border
$('div').width()
// 设置 div 内容位置的宽为 200px
$('div').width(200)
// 获取 div 元素内容位置的高,包含 padding 不包含 border
$('div').innerHeight()
// 获取 div 元素内容位置的宽,包含 padding 不包含 border
$('div').innerWidth()
// 获取 div 元素内容位置的高,包含 padding 和 border
$('div').outerHeight()
// 获取 div 元素内容位置的高,包含 padding 和 border 和 margin
$('div').outerHeight(true)
// 获取 div 元素内容位置的宽,包含 padding 和 border
$('div').outerWidth()
// 获取 div 元素内容位置的高,包含 padding 和 border 和 margin
$('div').outerWidth(true)
// 获取 div 相对页面的位置
$('div').offset() // 得到的是以一个对象 { left: 值, top: 值 }
// 给 div 设置相对页面的位置
$('div').offset({ left: 100, top: 100 })
// 获取定位到一个距离页面左上角 100 100 的位置
案例:物体运动
let lf = $('div').offset().left;
lf = lf + 10;
$('div').offset({ 'left':lf })
// 只能获取 div 相对于父元素的偏移量(定位的值)
$('div').position()
window.onscroll = function () {
// 获取浏览器卷去的高度
console.log($(window).scrollTop())
}
window.onscroll = function () {
// 获取浏览器卷去的宽度
console.log($(window).scrollLeft())
}
显示:
方式一:
$('div').show() // 如果元素本身是 display none 的状态可以显示出来
方式二:
$('div').show('毫秒', '速度', '回调函数')
$('div').show(1000, 'linear', function () {
console.log('我显示完毕')
})
隐藏:
方式一:
$('div').hide('毫秒', '速度', '回调函数')
方式二:
$('div').hide(1000, 'linear', function () {
console.log('我隐藏完毕')
})
切换:
方式一:
$('div').toggle()
方式二:
$('div').toggle(1000, 'linear', function () { console.log('动画执行完毕') })
fadeIn([s],[e],[fn])
fadeOut([s,[e],[fn]])
slideDown([s],[e],[fn])
slideUp([s,[e],[fn]])
slideToggle([s],[e],[fn])
$('.show').click(function () {
$('div').animate(
{ width: 500, height: 300 },
1000,
'linear',
function () {
console.log('动画运动完毕')
})
})
立刻停止动画 $('div').stop() ---> 就停止再当前状态
$.get("test.cgi", { name: "John", time: "2pm" },
function(data){
alert("Data Loaded: " + data);
});
$.post("test.php", { name: "John", time: "2pm" },
function(data){
alert("Data Loaded: " + data);
});
$.ajax({
url: "page.php",
processData: false,
data: {},
success: function(data){
alert("Data Loaded: " + data);
}
});
我们一直在使用 jQuery ,都没有什么问题 。但是如果有一天,我们需要引入一个别的插件或者库的时候
人家也向外暴露的是 $ 获取 jQuery ,那么,我们的 jQuery 就不能用了 。那么这个时候, jQuery 为我们提供了一个多库并存的方法
下面这个方法可以交还 jQuery 命名的控制权
jQuery.noConflict()
上面代码执行完毕以后 $ 这个变量就不能用了 。但是 jQuery 可以使用
console.log($) // undefined
console.log(jQuery) // 可以使用
下面 这个方法可以交并且传递一个 true 的时候,会完全交出控制权
jQuery.noConflict(true)
面代码执行完毕以后 $ 这个变量就不能用了 ,jQuery 这个变量也不能用了
console.log($) // undefined
console.log(jQuery) // undefined
可以用一个变量来接受返回值,这个变量就是新的控制权
var aa = jQuery.noConflict(true)
接下来就可以把 aa 当作 jQuery 向外暴露的接口使用了
aa('div').click(function () { console.log('我被点击了') })