jQuery 对象本质是: 利用$对DOM 对象包装后产生的对象(伪数组形式存储)
jQuery里面对我们原生js代码进行了封装,这样我们可以快速高效的使用这些封装好的功能了。
jQuery 封装了 JavaScript 常用的功能代码,优化了 DOM 操作、事件处理、动画设计和 Ajax 交互。
jQuery的优点:
1. 轻量级。核心文件才几十kb,不会影响页面加载速度。
2. 跨浏览器兼容,基本兼容了现在主流的浏览器。
3. 链式编程、隐式迭代。
4. 对事件、样式、动画支持,大大简化了DOM操作。
5. 支持插件扩展开发。有着丰富的第三方的插件,例如:树形菜单、日期控件、轮播图等。
版本介绍:
1x :兼容 IE 678 等低版本浏览器, 官网不再
2x :不兼容 IE 678 等低版本浏览器, 官网不再更新
3x :不兼容 IE 678 等低版本浏览器, 是官方主要更新维护的版本
<!-- 1.引入jQuery文件 -->
<script src="jquery.min.js"></script>
<!-- 2.入口函数: -->
1. 等着 DOM 结构渲染完毕即可执行内部代码,不必等到所有外部资源加载完成,jQuery 帮我们完成了封装。
2. 相当于原生 js 中的 DOMContentLoaded。
$(function() {
$('div').hide(); // 此处是页面 DOM 加载完成的入口
})
// 第二种: 繁琐,但是也可以实现
$(document).ready(function(){
... // 此处是页面DOM加载完成的入口
});
<!-- jQuery中的顶级对象$ -->
1. $是 jQuery 的别称,在代码中可以使用 jQuery 代替,但一般为了方便,通常都直接使用 $ 。
2. $是jQuery的顶级对象,相当于原生JavaScript中的 window。把元素利用$包装成jQuery对象,就可以调用jQuery 的方法。
<!-- jQuery 对象和 DOM 对象 -->
1. jQuery 方法获取的元素就是 jQuery 对象。
2. jQuery 对象本质是: 利用$对DOM 对象包装后产生的对象(伪数组形式存储)。
DOM对象转换成jQuery对象:
var box = document.getElementById('box'); // 获取DOM对象
var jQueryObject = $(box); // 把DOM对象转换为 jQuery 对象
jQuery 对象转换为 DOM 对象有两种方法:
var domObject1 = $('div')[0] // 2.1 jQuery对象[索引值]
var domObject2 = $('div').get(0) // 2.2 jQuery对象.get(索引值)
<!-- 3.jQuery 选择器 -->
原生 JS 获取元素方式很多,很杂,而且兼容性情况不一致,因此 jQuery 给我们做了封装,使获取元素统一标准。
// 基础选择器:
$("选择器") // 里面选择器直接写 CSS 选择器即可,但是要加引号 //$(".nav")
//层级选择器:
后代选择器和子代选择器。 //$("ul li") $("ul>li")亲儿子
//筛选选择器:
$("ul li:first")
$("ul li:last") 获取最后一个li
$("ul li:eq(2)") 获取li中索引为2的元素,索引号index从0开始
$("ol li:odd") 获取到li元素,选择索引号为奇数的元素
$("ol li:even") 获取到li元素,选择索引号为偶数的元素
$("li").parent() 查找父级
$("ul").children("li") 亲儿子
$("ul").find("li") 后代选择器
$(".first").siblings("li") 查找兄弟节点
$(".first").nextAll() 查找当前元素之后所有同辈元素
$(".first").preAll() 查找当前元素之前所有同辈元素
$("div").hasClass("protected") 检查当前元素是否包含某个特定的类.protected 如果有返回true
<ul>
<li>我是ol 的li</li>
<li>我是ol 的li</li>
</ul>
<div class="current">俺有current</div>
<script>
$(function() {
$("ol .item").siblings("li").css("color", "red"); // 1. 兄弟元素siblings 除了自身元素之外的所有亲兄弟
// $("ul li:eq(2)").css("color", "blue"); // (1) 我们可以利用选择器的方式选择
// $("ul li").eq(2).css("color", "blue"); // (2) 更推荐这种写法
console.log($("div:first").hasClass("current")); // 判断是否有某个类名
});
</script>
<!-- 4.jQuery 设置样式css -->
$('div').css('属性', '值')
//A:操作 css 方法:
1.参数只写属性名,则是返回属性值
//var strColor = $(this).css('color');
2.参数是属性名,属性值,逗号分隔,是设置一组样式,属性必须加引号,值如果是数字可以不用跟单位和引号
$(this).css(''color'', ''red'');
3.参数可以是对象形式,方便设置多组样式。属性名和属性值用冒号隔开, 属性可以不用加引号
$(this).css({ "color":"white","font-size":"20px"});
//B:设置类样式方法:
1.jQuery 里面类操作只是对指定类进行操作,不影响原先的类名。
$("div").addClass("current"); // 1.添加类
$("div").removeClass("current"); // 2.删除类
$("div").toggleClass("current"); // 3.切换类
<script>
$(function() {
$("div").click(function() {
$(this).toggleClass("current"); // 切换类 toggleClass()
});
})
</script>
<!--5. jQuery 里面的排他思想 -->
// 想要多选一的效果,排他思想:当前元素设置样式,其余的兄弟元素清除样式。
$(this).css(“color”,”red”);
$(this).siblings(). css(“color”,””);
<!-- 6.隐式迭代 -->
// 遍历内部 DOM 元素(伪数组形式存储)的过程就叫做隐式迭代。
$('div').hide(); // 页面中所有的div全部隐藏,不用循环操作
<script>
$("ul li").css("color", "red"); // 隐式迭代就是把匹配的所有元素内部进行遍历循环,给每一个元素添加css这个方法
</script>
<!-- 7.链式编程 -->
// 链式编程是为了节省代码量,看起来更优雅。
$(this).css('color', 'red').sibling().css('color', '');
####################操作################################################
<!--1. jQuery 属性操作 -->
jQuery 常用属性操作有三种:prop() / attr() / data()
<!-- A 元素固有属性值 prop() -->
prop() 除了普通属性操作,更适合操作表单属性:disabled / checked / selected 等。
prop("属性") //获取 prop("属性","属性值")
<a href="http://www.taobao.com" title="都挺好">都挺好</a>
设置元素本生自带属性:$("a").prop("title", "我们都挺好");
<!-- B 元素自定义属性值 attr() -->
自定义属性。 比如给 div 添加 index =“1”
attr("属性") //获取属性
attr("属性","属性值")
<div index="1" data-index="2">我是div</div>
设置元素自定义属性: $("div").attr("index", 4);
<!-- C 数据缓存 data() -->
data() 方法可以在指定的元素上存取数据,并不会修改 DOM 元素结构。一旦页面刷新,之前存放的数据都将被移除
注意:同时,还可以读取 HTML5 自定义属性 data-index ,得到的是数字型
data("name", "value") //向被选元素附加数据
date("name") //向被选元素获取数据
<script>
$("span").data("uname", "andy"); //给span添加一个 uname = "andy" 属性
</script>
<!--2. jQuery内容文本值 -->
html() / text() / val() ; 分别对应JS中的 innerHTML 、innerText 和 value 属性,主要针对元素的内容还有表单的值操作。
<div>
<span>我是内容</span>
</div>
<input type="text" value="请输入内容">
<!-- A. 获取设置元素内容 html() -->
html() //获取元素内容 //$("div").html() //结果:<span>我是内容</span>
html("内容") //设置元素内容 //$("div").html("123")
<!-- B.获取设置元素文本内容 text() -->
$("div").text() //获取元素文本内容 //结果:我是内容
$("div").text("123"); //设置元素文本内容
<!-- C.获取设置表单值 val() -->
$("input").val() //获取设置表单值 //结果:请输入内容
$("input").val("123"); //设置表单值
<!-- D.outerHTML -->
利用jQuery.prop("outerHTML")获取包含自身在内的HTML元素的HTML代码
jQuery.html() 是获取当前节点下的html代码,并不包含当前节点本身的代码,
然而我们有时候的确需要,可以通过jQuery.prop("outerHTML")的方式设置。
1.jquery获取outerhtml
<div class="test"><p>hello,你好!</p></div>
<script>
$(".test").prop("outerHTML");
</script>
2.jquery设置outerhtml
$('.test').prop('outerHTML', '<input>');
<!-- 3.jQuery 元素操作 -->
A. 遍历元素 .each()
给同一类元素做不同操作,就需要用到遍历。
$("div").each(function (index,domEle) {})
1.each()方法遍历匹配每一个元素,主要用DOM处理
2.index是每个元素索引,domEle是每个Dom元素对象,不是jquery对象
3.想要使用jquery方法,需转换$(domEle)
$.each(object,function (index,element) {})
1.$.each()方法可用于遍历任何对象,主要处理数据,数组.对象
2.index索引,element遍历内容
<div>1</div>
<div>2</div>
<script>
$(function() {
// 如果针对于同一类元素做不同操作,需要用到遍历元素(类似for,但是比for强大)
var arr = ["red", "green", "blue"];
// 1. each() 方法遍历元素
$("div").each(function(i, domEle) {
// 回调函数第一个参数一定是索引号 可以自己指定索引号号名称
// 回调函数第二个参数一定是 dom 元素对象,也是自己命名
// 使用jQuery方法需要转换 $(domEle)
$(domEle).css("color", arr[i]);
})
// 2. $.each() 方法遍历元素 主要用于遍历数据,处理数据
// $.each($("div"), function(i, ele) {
// console.log(i);
// console.log(ele) });
$.each({
name: "andy",
age: 18
}, function(i, ele) {
console.log(i); // 输出的是 name age 属性名
console.log(ele); // 输出的是 andy 18 属性值
})
})
</script>
<!-- 4. 创建、添加、删除 -->
A. 动态创建:
$("<li></li>")
B. 内部添加: 父子关系
element.append("内容") //追加元素最后面
element.prepend("内容") //放在最前面
C. 外部添加: 兄弟关系
element.after("内容") //把内容放入目标元素后面
element.before("内容") //把内容放入目标元素前面
D. 删除元素:
element.remove() //删除匹配的元素(本身)
element.empty() //删除匹配的元素集合中所有子节点
element.html("") //清空匹配的内容
<ul> <li>原先的li</li> </ul>
<div class="test">我是原先的div</div>
<script>
$(function() {
var li = $("<li>我是后来创建的li</li>"); // 1. 创建元素
// 2.1 内部添加
// $("ul").append(li); 内部添加并且放到内容的最后面
$("ul").prepend(li); // 内部添加并且放到内容的最前面
// 2.2 外部添加
var div = $("<div>我是后妈生的</div>");
// $(".test").after(div);
$(".test").before(div);
// 3. 删除元素
// $("ul").remove(); 可以删除匹配的元素 自杀
// $("ul").empty(); // 可以删除匹配的元素里面的子节点 孩子
$("ul").html(""); // 可以删除匹配的元素里面的子节点 孩子
})
</script>
<!-- 5.jQuery 尺寸操作 -->
jQuery 尺寸操作包括元素宽高的获取和设置,且不一样的API对应不一样的盒子模型。
可以快速获取和子的宽高,至于其他属性想要获取和设置,还要使用 css() 等方法配合。
A. width() / height() 获取设置元素 width和height大小
$("div").width()
$("div").width(300);
B. innerWidth() / innerHeight() 获取设置元素 width和height + padding 大小
$("div").innerWidth()
C. outerWidth() / outerHeight() 获取设置元素 width和height + padding + border 大小
$("div").outerWidth()
D. outerWidth(true) / outerHeight(true) 获取设置 width和height + padding + border + margin
$("div").outerWidth(true)
<!-- 6.jQuery 位置操作 -->
jQuery的位置操作主要有三个:
A. offset()
$(".son").offset() //1. 获取设置距离文档的位置(偏移
$(".son").offset().top
$(".son").offset({top: 200,left: 200});
B. position()
获取距离带有定位父级位置(偏移) position 如果没有带有定位的父级,则以文档为准, 这个方法只能获取不能设置偏移
$(".son").position() //position().left 和 position().top 获取到左侧,顶部距离
C. scrollTop()/scrollLeft()
设置或获取元素被卷去的头部和左侧
$(document).scrollTop()
<!-- 7,$(window).height() 和 $(document).height()的区别 -->
$(window).height()代表了当前可见区域的大小,
$(document).height()则代表了整个文档的高度,可视具体情况使用.
当浏览器窗口大小改变时(如最大化或拉大窗口后) ,
$(window).height() 随之改变,但是 $(document).height()是不变的。
##############################事件###########################################
- 优点: 操作简单,且不用担心事件覆盖等问题。
- 缺点: 普通的事件注册不能做事件委托,且无法实现事件解绑,需要借助其他方法。
<!-- 1.jQuery 事件注册 -->
element.事件(function(){})
$("div").click(function() {事件处理程序} //其它事件同原生
$("div").click(function() {
$(this).css("background", "purple");
});
<!-- 2. jQuery 事件处理 -->
因为普通注册事件方法的不足,jQuery又开发了多个处理方法:
- on(): 用于事件绑定,目前最好用的事件绑定方法
- off(): 事件解绑
- trigger() / triggerHandler(): 事件触发
<!-- A.事件处理 on() 绑定事件 -->
on()方法优势1: 可以绑定多个事件
$("div").on({
mouseover: function(){},
mouseout: function(){}
})
如果事件处理程序相同
$("div").on("mouseover mouseout",function(){
$(this).toggleClass("current")
})
on()方法优势2: 可以事件委派,把原来加给子元素事件绑定在父元素上
$('ul').on('click','li',function(){
alert('abc')
})
on()方法优势3: 可以给动态生成的元素绑定事件
$("div").append($("<p>我是动态创建的p</p>"))
$('div').on("click","p",function(){
console.log(123)
})
<!-- B. 事件处理 off() 解绑事件 -->
当某个事件上面的逻辑,在特定需求下不需要的时候,可以把该事件上的逻辑移除,这个过程我们称为事件解绑
off()方法可以移除on()方法添加的事件处理程序
$("p").off() //解绑p元素所有事件处理程序
$("p").off("click") //解绑p元素上面的点击事件
$("ul").off("click","li") //解绑事件委托
<!-- C. one()方法 只能触发事件一次 -->
$("p").one("click", function() {
alert(11);
})
<!-- D.trigger() 自动触发事件 -->
jQuery 为我们提供了两个自动触发事件 trigger() 和 triggerHandler()
第一种:
element.click() //自调用,立即执行 会触发元素的默认行为 // $("div").click();会触发元素的默认行为
第二种:
element. trigger("type") //$("input").trigger("focus"); 自动获取焦点
第三种:
element.triggerHandler(type) //不会触发元素默认行为 input框不能自动获取焦点 // $("div").triggerHandler("click");
<!-- 3.jQuery 事件对象 -->
jQuery 对DOM中的事件对象 event 进行了封装,兼容性更好,获取更方便,使用变化不大。事件被触发,就会有事件对象的产生。
element.on(events,[selector],function(event){})
阻止默认行为: event.preventDefault(); 或者return false
阻止冒泡: event.stopPropagation()
<body>
<div></div>
<script>
$(function () {
$(document).on("click", function () {
console.log("点击了document");
})
$("div").on("click", function (event) {
// console.log(event); 事件对象e
console.log("点击了div");
event.stopPropagation(); //阻止了冒泡行为,只弹出一次
})
})
</script>
</body>
<!-- 4.jQuery 拷贝对象 -->
把一个对象(合并)拷贝给另一个对象使用
$.extend([deep],target,obj1,[objN])
1.deep:为true深拷贝,false浅拷贝
2.target:要拷贝的目标对象
3.obj1待拷贝到的对象, objN待拷贝到的N个对象
4.浅拷贝修改目标对象会影响被拷贝对象,深拷贝则不会
// 1.合并数据
var targetObj = {};
var obj = {
id: 1,
name: "andy"
};
$.extend(targetObj, obj);
<!-- jQuery 插件 -->
jQuery 功能比较有限,想要更复杂的特效效果,可以借助于 jQuery 插件完成。 这些插件也是依赖于jQuery来完成的,所以必须要先引入
1. jQuery 插件库 http://www.jq22.com/
2. jQuery 之家 http://www.htmleaf.com/
jQuery 插件使用步骤:
1. 引入相关文件。(jQuery 文件 和 插件文件)
2. 复制相关html、css、js (调用插件)。
注意:实际开发,一般复制文件,然后在文件中进行修改和添加功能。
图片懒加载插件: 当页面滑动到有图片的位置,图片才进行加载,用以提升页面打开的速度及用户体验。
全屏滚动插件: 全屏滚动插件比较大,所以,一般大型插件都会有帮助文档,或者网站
<!-- dom动态生成的html代码操作 -->
$(document).on("click",".test",function(){//修改成这样的写法
$(".test").css("background-color","pink");
});
<!-- js比较年月日或者日期年月日时分秒大小 -->
// 直接传进开始时间很结束时间
function compareTime(startTime,endTime) {
// var start_time=startTime.replace(/-|s|:|//g,'').replace(' ', ''); //用这个加强版也可以
var start_time = startTime.replace(/-|s|:|//g,'');
var end_time = endTime.replace(/-|s|:|//g,'');
if (start_time < end_time) { return true; } else { return false; }
#################################效果################################################
<!-- jQuery 给我们封装了很多动画效果,最为常见的如下: -->
- 显示隐藏:show() / hide() / toggle() ;
- 划入画出:slideDown() / slideUp() / slideToggle() ;
- 淡入淡出:fadeIn() / fadeOut() / fadeToggle() / fadeTo() ;
- 自定义动画:animate() ;
动画或者效果一旦触发就会执行,如果多次触发,就造成多个动画或者效果排队执行。
jQuery为我们提供另一个方法,可以停止动画排队:stop() ;
<!-- 1. 显示隐藏 -->
show([speed,[easing],[fn]])
hide([speed,[easing],[fn]])
toggle([speed,[easing],[fn]])
1.参数都可以省略,无动画直接显示
2.speed可以是 "slow","normal","fast",或者动画时长毫秒数 1000
3.easing是切换效果,默认 "swing",可选 "linear"
4. fn回调函数,动画完成时执行,每个元素执行一次
5.一般情况下,不带参数直接显示与隐藏
$("button").eq(0).click(function() {
$("div").show(1000, function() {
alert(1);
});
})
<!-- 2. 滑入滑出 -->
下滑/上滑 用法同上
slideDown([speed,[easing],[fn]])
slideUp([speed,[easing],[fn]])
slideToggle([speed,[easing],[fn]])
$("div").stop().slideToggle(500); //阻止上一个动画,防止动画队列
$("button").eq(2).click(function() {
// 滑动切换 slideToggle()
$("div").slideToggle(500);
});
<!-- 3. 淡入淡出 -->
用法同上
fadeTo([speed],opacity,[easing],[fn])
//opacity 透明度必须写,取值0~1之间
<!-- 4.自定义动画animate() -->
自定义动画非常强大,通过参数的传递可以模拟以上所有动画
slideDown(params,[speed],[easing],[fn])
params想要更改的样式属性,以对象形式传递,必须写. 属性名可以不用 "" 驼峰命名式 其余参数可省
$(function() {
$("button").click(function() {
$("div").animate({
left: 500,
top: 300,
opacity: .4,
500
}, 500);
})
})
<!-- 5 停止动画排队 -->
总结: 每次使用动画之前,先调用 stop() ,在调用动画。
<!--6. 事件切换 hover() -->
事件切换 hover() 就是鼠标经过和离开的复合写法 //功能类似 css 中的伪类 :hover