本节目录
好处:
- 简化遍历文档
- 操作DOM
- 简化处理事件
- 简化处理动画
- 开发Ajax
- 链式操作
- 隐式迭代
HelloWorld!
$(): 调用 $方法, 核心函数
为$()传入一个function(){}做参数, 相当于使用windown.οnlοad=function(){代码}
//需要注意jquery的引入, /开头必须是绝对路径
$(function () {
//$()查找元素
//使用.click来绑定点击响应函数, 作为click的参数传入即可
$("#btn01").click(function () {
alert("Hello");
})
})
核心函数的本质就是一个方法, 如果使用
alert($);
我们可以看到:
核心函数的使用
-
传入参数为函数时, 文档加载完成后执行此方法
$(function(){})// 相当于window.onload = function(){}
-
传入参数为HTML字符串时, 根据字符串创建元素节点对象
$("<div>html</div")
-
传入参数为选择器字符串时, 根据选择器查找除元素节点对象
$("#id")
-
传入参数为dom对象时, 将dom对象包装为jQuery对象并返回
$(this)
DOM对象和jQuery对象
Dom对象: 使用原生的js查找或创建的元素
jQuery对象: 使用jQuery查找(包装了的)或创建的元素
dom和jq对象不能操作别个的方法, 所以必要的时候需要互相转换
-
由dom对象转化为jQuery对象:
使用$进行包装即可;
-
由jquery对象转化为DOM对象:
jquery对象是由DOM对象组成的数组, 尽管可能只有一个元素或对象, 也会封装成数组. 我们可以通过数组下标的方式获取jQuery对象中的dom对象
例子如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="../lib/jquery-1.7.2.js"></script>
<script type="text/javascript">
$(function () {
//1. 使用dom设置红色字体
var btn01 = document.getElementById("dom2dom");
btn01.onclick = function () {
var text = document.getElementById("testDiv");
text.style.color = "red";
}
//2. dom对象转化为jquery再使用jQuery的方法
var btn02 = document.getElementById("dom2jQuery");
btn02.onclick = function () {
var text = document.getElementById("testDiv");
$(text).css("color", "blue");
}
//3. 调用jquery方法
$("#jQuery2jQuery").click(function () {
$("#testDiv").css("color", "green");
})
//4.jQuery对象转化为dom对象调用dom方法
$("#jQuery2dom").click(function () {
$("#testDiv")[0].style.color = "yellow";
})
});
</script>
</head>
<body>
<div id="testDiv">Atguigu is Very Good!</div>
<button id="dom2dom">使用DOM对象调用DOM方法</button>
<button id="dom2jQuery">使用DOM对象调用jQuery方法</button>
<button id="jQuery2jQuery">使用jQuery对象调用jQuery方法</button>
<button id="jQuery2dom">使用jQuery对象调用DOM方法</button>
</body>
</html>
jQuery选择器
基本选择器
选择器 | 示例 | 作用 |
---|---|---|
#id | id选择器 | #btn01, 选择id为btn01的元素 |
.class | 类别选择器 | .mini, 选择class为mini的元素 |
标签名 | 标签选择器 | div, 选择所有div元素 |
* | 选择全部元素 | |
, | 有多个元素需要选择时 引号内以逗号隔开 | span,#two 选择以span标签和id为two的标签 |
层次选择器
选择器 | 作用 | 说明 |
---|---|---|
ancestor descendant | 给定的祖先元素下的所有后代元素 | 空格隔开 |
parent>child | 选择子元素 | |
prev+next | 紧接在prev后的兄弟元素 | |
prev~siblings | prev之后的所有兄弟 |
过滤选择器
:first 获取第一个元素
:last 获取最后一个
:not(selector)
按照解析顺序, 解析一个就是一个, 不论父子
:even
:odd
:eq(index)
:gt(index)
:lt(index)
header: 标题标签
:animated: 正在执行动画的元素
如果冒号之前没写东西, 就是从最大的dom对象开始找, :first 找到的就是html对象(因为是第一个元素节点)
内容过滤选择器
:contain(text): 包含指定文本的元素
:empty空元素
:has(selector): 与not(selector)相反
:parent:查找有子元素或文本的元素
可见性过滤选择器
:visible
:hidden
不可见:display属性设置为none,或visible设置为hidden
属性过滤选择器
[attribute]
[attribute=value]
[attribute!=value]
[attribute^=value]
[attribute$=value]
[attribute*=value]
[attrSel1][attrSel2][attrSelN]
选择器 | 作用 |
---|---|
[attribute] | 选择有attribute属性的元素节点 |
[attribute=value] | 选择attribute属性值等于value的元素节点 |
[attribute!=value] | 选择attribute属性值不为value的元素节点, 没有该属性也算入其中 |
[attribute^=value] | 选择attribute属性以value为开始的元素 |
[attribute$=value] | 选择attribute属性以value为结尾的元素 |
[attribute*=value] | 选择attribute属性包含value的元素节点 |
[attrSel1][attrSel2][attrSelN] | 选择满足多个属性过滤选择器的交集的元素节点 |
子元素选择器
选择器 | 作用 |
---|---|
:nth-child | 父元素下第n个父元素, 元素从1开始计算, 可以传入表达式 |
:first-child | 选第一个子元素 |
:last-child | 最后一个子元素 |
:only-child | 选择只有一个子元素的对象并返回他的子元素 |
子元素都要使用父元素[空格]子元素的方式, 因为选的是子元素, 所以按照基本选择器中后代元素的写法;
即是说 要先选出子元素, 再去用上面表格的这些去选第几个
div.one :first-child
: class为one的div的第一个子元素
标准表述:ul li:nth-child(2)
: ul下的li子元素中的第二个
按理来说<ul>
应当有三个子元素, 但因为jQuery中可能出现的状况是把下图中的两种情况所包含的节点全部不考虑, 只认为有一个li元素
nth-child()用法示例: #ulID :nth-child(2n)
空格定位到后代, nth-child()
只找子代,不会管b标签; 所以这里用``#ulID>:nth-child(2n)`右尖括号可能更高好一些
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="../lib/jquery-1.7.2.js"></script>
<script type="text/javascript">
$(function () {
$("#ulID :nth-child(2n)").css("color","red");
})
</script>
</head>
<body>
<ul id="ulID">
<!--b标签是后来加的, 与运行结果不一致-->
<li><b>你好1</b></li>
<li><b>你好2</b></li>
<li>你好3</li>
<li>你好4</li>
</ul>
</body>
</html>
结果如下:
jQuery查找元素的机制: 只找元素节点(标签)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="../lib/jquery-1.7.2.js"></script>
<script type="text/javascript">
$(function () {
//找到9个
var domEle = document.getElementById("ulID").childNodes;
alert(domEle.length);
//找到4个
alert($("#ulID>*").length);
})
</script>
</head>
<body>
<ul id="ulID">
<li>你好1</li>
<li>你好2</li>
<li>你好3</li>
<li>你好4</li>
</ul>
</body>
</html>
表单选择器
选择器 | 作用 |
---|---|
:input | 匹配所有input/textarea/select/(定义在表单内的)button元素 |
:text | 匹配所有单行文本框 |
:password | 选中密码框 |
:radio | 匹配所有单选框 |
:checkbox | 匹配所有复选框 |
:submit | |
:reset | |
:button | <button> 和<input type=button> |
:file | 匹配文件 |
:hidden | 选中 |
表单内的button会被认为和submit具有一样的作用
<textarea>
这样的起始标签和闭合标签之间尽量是挨着的, 如果空行, 会体现在浏览器端的
表单属性选择器
选择器 | 作用 |
---|---|
:enabled | 匹配所有可用元素 |
:disabled | 匹配所有不可用元素 |
:selected | 匹配下拉列表所有选中的option元素 |
:checked | 匹配所有选中项, 文档中说不包含下拉列表中选中的; 但实验中是包含的 |
//1.对表单内 可用input 赋值操作
$("#btn1").click(function(){
// val()可以操作表单项的value属性值
// 它可以设置和获取
$("input:enabled").val("我是万能的程序员");
});
//2.对表单内 不可用input 赋值操作
$("#btn2").click(function(){
$("input:disabled").val("管你可用不可用,反正我是万能的程序员");
});
//3.获取多选框选中的个数 使用size()方法获取选取到的元素集合的元素个数
$("#btn3").click(function(){
alert( $(":checkbox:checked").length);
});
//4.获取多选框,每个选中的value值
$("#btn4").click(function(){
// 获取全部选中的复选框标签对象
var checkboies = $(":checkbox:checked");
// 老式遍历
// checkboies是jQuery对象 是一个数组, 使用数组下标遍历即可获取dom对象
for (var i = 0; i < checkboies.length; i++){
// dom对象的属性值
alert( checkboies[i].value );
// 将dom对象包装为jQuery对象, 并调用其val()方法
alert($(checkboies[i]).val()); }
});
//5.获取下拉框选中的内容
$("#btn5").click(function(){
$(":selected").each(function () {
//this代表当前对象
alert(this.innerText)
})
});
需要注意的点:
- each循环中放入回调函数, 其中的this指向当前对象
var checkboies = $(":checkbox:checked");
可以省略然后写为var checkboies = $(":checked");
- dom对象和jQuery对象的相互转化
元素筛选方法
jQuery对象的元素筛选方法
- 过滤
方法 | 作用 | 说明 |
---|---|---|
eq(index|-index) | 查找指定索引的元素, 负数表示倒着找 | |
first() | ||
last() | ||
filter(expr|obj|ele|fn) | 传入的是选择器字符串 | |
is(expr|obj|ele|fn) | 返回boolean | is(":empty")表示是否为空 |
has(expr|ele) | 是否含有选择器元素 | 传入选择器字符串$(div).has(".mini)" |
not(expr|ele|fn) | 选择不满足的元素 | 传入选择器字符串 |
- 查找
方法 | 作用 | 说明 |
---|---|---|
children([expr]) | 选出符合条件的子元素 | |
find(expr|obj|ele) | 选出符合条件的所有后代元素 | |
next([expr]) | 选择满足条件的下一个兄弟,紧邻的下一个 | $(div).next() 下一个兄弟$(div).next("span") 下一个span兄弟, 如果下一个不是span就gg |
nextall([expr]) | 选择后面所有的兄弟 | $(div).nextAll() 下一个兄弟$(div).nextAll("span") 后面所有的span |
nextUntil([exp|ele][,fil]) | $(#one).nextUntil("span")$ one与第一个span之间的所有元素 | |
parent([expr]) | 父元素 | $(.mini).parent() 选出所有mini的父元素, mini有多个, 父元素也对应的有多个 |
prev([expr]) | 上一个, 和next类似 | |
prevall([expr]) | ||
prevUntil([exp|ele][,fil]) | 找到之前多有兄弟元素, 直到fil停止 | $("span").nextUntil("#one")$ , span为全文档中最后一个span |
siblings([expr]) | 查找所有兄弟元素 | 前后的都可以找到 |
- 串联
方法 | 作用 | 说明 |
---|---|---|
add(expr|ele|html|obj[,con]) | 合并多个选择器的结果 | 并集 |
addSelf() | 包括自己 | $(#two).children(.mini).andSelf() , 选出子元素,和自己 |
end() | 回到上一步状态 | $(#two).children(.mini) 返回子mini元素;$(#two).children(.mini).end() 返回$(#two) |
- 补充
contents(): 计算上文本节点的子节点
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="../lib/jquery-1.7.2.js"></script>
<script type="text/javascript">
$(function () {
var domEle = document.getElementById("ulID").childNodes;
alert(domEle.length);//9
alert($("#ulID *").length);//4
alert($("#ulID").contents().length)//9
})
</script>
</head>
<body>
<ul id="ulID">
<li>你好1</li>
<li>你好2</li>
<li>你好3</li>
<li>你好4</li>
</ul>
</body>
</html>
dom属性操作
html() innerHTML 不传参:get 传参:set; 传入的字符串会被浏览器解析
text() innerText 不传参:get 传参:set; 传入的字符串只会被当作字符串,不=会被浏览器解析
val(): 获取去标签的value值
属性
-
attr(name|pro|key,val|fn)
- a.attr(‘name’)取出a的name值
- a.attr(“name”,“username”)把a的name值设置为username
-
prop(name|pro|key,val|fn)1.6+
- a.prop(‘id’) 取出a的id值
- a.prop(‘id’,“bj”) 设置a的id值为bj
-
removeProp(name)1.6+: a.removeProp(‘class’) 移除a的class属性
-
removeAttr(name)a.removeAttr(‘class’) 移除a的class属性
注意: checkbox中checked属性如果选用attr(“checked”)观察未选中框, 会返回undefined; prop(“checked”)观察未选中框会返回false
标签固定支持的属性叫原生属性, 标签也可以有自定义属性(使用自定义属性用attr, 使用原生属性时用prop)
练习
全选全不选
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="../../lib/jquery-1.7.2.js"></script>
<script type="text/javascript">
$(function () {
var items = $(":checkbox[name='items']");
//1. 全选
$("#checkedAllBtn").click(function () {
$(":checkbox[name='items'],#checkedAllBox").prop("checked", true)
})
//2. 全不选
$("#checkedNoBtn").click(function () {
$(":checkbox").add("#checkedAllBox").prop("checked", false)
})
//3. 反选
$("#checkedRevBtn").click(function () {
$(":checkbox[name='items']").each(function () {
// this代表当前遍历到的对象, 是dom对象
// this.checked = !$(this).prop("checked");
var status = $(this).prop("checked");
$(this).prop("checked", !status);
})
//获取四个框是不是都选中, 都选中就把全选框勾上
// items.filter(":checked").length;
// 判断选中的个数, 是不是全选
// var flag = items.filter(":checked").length == 4;
// $("#checkedAllBox").prop("checked", flag);
// 也可使用三元运算符
$("#checkedAllBox").prop("checked", items.filter(":checked").length == 4 ? true : false);
})
//4. 提交, 将选中的打印
$("#sendBtn").click(function () {
items.filter(":checked").each(function () {
alert(this.value);
})
});
//5. 全选/全不选
$("#checkedAllBox").click(function () {
//获取状态, 把状态同步给下面的选项
items.prop("checked", this.checked);
})
//6.状态同步
items.click(function () {
$("#checkedAllBox").prop("checked", items.filter(":checked").length == 4)
})
});
</script>
</head>
<body>
<form method="post" action="">
你爱好的运动是?<input type="checkbox" id="checkedAllBox"/>全选/全不选
<br/>
<input type="checkbox" name="items" value="足球"/>足球
<input type="checkbox" name="items" value="篮球"/>篮球
<input type="checkbox" name="items" value="羽毛球"/>羽毛球
<input type="checkbox" name="items" value="乒乓球"/>乒乓球
<br/>
<input type="button" id="checkedAllBtn" value="全 选"/>
<input type="button" id="checkedNoBtn" value="全不选"/>
<input type="button" id="checkedRevBtn" value="反 选"/>
<input type="button" id="sendBtn" value="提 交"/>
</form>
</body>
</html>
dom增删改
内部插入 | ||
append(content) | a.append((b); | 把b添加到a中 |
appendTo(content) | a.appendTo(b); | 把a加到b里面, 添加到最后面, b可以直接传入选择器字符串, 也可传入jQuery对象 |
prepend(content) | a.prependTo(b); | 父节点a中插入一个子节点b, 插入到最前面 |
prependTo(content) | a.prependTo(b); | 把子节点a添加到父节点b里面, 添加到最前面 |
外部插入 | ||
after(content) | a.after(b); | a之后插入b |
insertAfter(content) | a.insertAfter(b); | 把a插入到b的后面 |
before(content) | a.before(b); | a之前插入b |
insertBefore(content) | a.insertBefore(b); | 把a插入到b的前面 |
替换 | ||
replaceWith(content|fn) | a.replaceWith(b) | 把a用b替换 |
replaceAll(selector) | a.replaceAll(b) | 用a替换所有的b |
删除 | ||
empty() | a.empty() | 把a掏空,把a里面的所有元素都删除 |
remove([expr]) | a.remove(b) | 从a中删除符合的b a.remove()删除a |
节点包裹 | ||
wrap() | a.wrap(b) | 用b把a包裹起来 |
wrapAll() | a.wrapAll(b) | 用一个b把所有a包裹 |
wrapInner() | a.wrapInner(b) | a里面的东西被b包围 |
unwrap() | a.unwrap(b) | 解除包裹a删除父元素b |
CSS操作(不用写在window.onload中)
CSS
css(name|pro|[,val|fn])
读写匹配元素的样式属性。
a.css(‘color’)取出a元素的color
a.css(‘color’,“red”)设置a元素的color为red
height
: get/set元素的高度; 设置百分比时以父元素作为参照
width
: 宽度同上
CSS 类
addClass(class|fn)
为元素添加一个class值;<div class="mini big">
removeClass([class|fn])
删除元素的class值;传递一个具体的class值,就会删除具体的某个class
a.removeClass():移除所有的class值
hasClass
: 检查元素是否包含指定的class
toggleClass
: 对被选元素做取反操作
offset
: 返回第一个匹配元素相对于文档的位置, 返回一个top和height; 传值也可设置{top:50, left:10}
事件
文件加载
$(function){})
: dom载入就绪执行; 想写几个写几个; 相当于多次调用核心函数这个方法
window.onload
: 文档加载完后执行; 不能编写多个, 相当于重复赋值
事件绑定
常规方式
jquery对象.事件方法(回调函数(){ 触发事件执行的代码 }).
绑定事件可以链式操作
$(".head").click(function(){
$(".content").toggle();
}).mouseover(function(){
$(".content").toggle();
});
jQuery提供的绑定方式
-
bind(type,[data],fn)函数把元素和事件绑定起来
-
type表示要绑定的事件 [data]表示传入的数据 fn表示事件的处理方法
-
bind(事件字符串,回调函数),后来添加的元素不会绑定事件
-
使用bind()绑定多个事件 type可以接受多个事件类型,使用空格分割多个事件
$(".head").bind("mouseover mouseout",function(){ $(".content").toggle(); });
-
-
one()只绑定一次, 绑定的事件只会发生一次
- one(type,[data],fn)函数把元素和事件绑定起来
- type表示要绑定的事件 [data]表示传入的数据 fn表示事件的处理方法
$(".head").one("click mouseover",function(){ $(".content").toggle(); });
-
live方法会为现在及以后添加的元素都绑定上相应的事件
$(".head").live("click",function(){ $(".content").toggle(); }); //新添加元素 $("#panel").before("<h5 class='head'>什么是jQuery?</h5>");
-
解绑
unbind(): 删除元素所有已绑定事件
unbind(fn): 删除元素已绑定的指定事件
$(".head").unbind() $(".head").unbind("mouseout")
事件冒泡
事件由内向外层的传导, 直至document结束; 如何阻止向上传导?
return false能够取消默认行为, 能够阻止事件冒泡
$(function(){
//冒泡就是事件的向上传导,子元素的事件被触发,父元素的响应事件也会触发
//解决冒泡问题:return false;
//给span绑定一个单击响应函数
$("span").click(function(){
alert("我是span的单击响应函数");
return false;
});
//给id为content的div绑定一个单击响应函数
$("#content").click(function(){
alert("我是div的单击响应函数");
return false;
});
//给body绑定一个单击响应函数
$("body").click(function(){
//alert("我是body的单击响应函数");
});
//取消默认行为
$("a").click(function(){
return false;
}) ;
事件对象
获取事件的详细信息, 给函数一个参数, 浏览器机会将事件对象赋值给在这个参数
window.onload = function(){
//使用js获取事件对象
var areaDiv = document.getElementById("areaDiv");
var showMsg = document.getElementById("showMsg");
//将mousemove绑定给当前元素
areaDiv.onmousemove = function(event){
//获取事件的详细信息, 给函数一个参数, 浏览器机会将事件对象赋值给在这个参数
var x = event.pageX;//X
var y = event.pageY;//Y
showMsg.innerHTML = "x="+x+" y="+y;//把div中的html赋值
};
}
jQuery中, 与js类似
$(function(){
$("#areaDiv").mousemove(function(event){
$("#showMsg2").text("x="+event.screenX+" y="+event.screenY)
})
})
同时可以根据event.type的类型(到底是绑定的哪一个事件, 具体去确定绑定事件的行为)
$("#areaDiv").bind("click mousemove", function (event) {
//1. 当点击的时候弹出showMsg的文本值
if ("click" == event.type) {
alert($("#showMsg").text());
}
//2. mousemove的时候showMsg里面显示详细信息
if ("mousemove" == event.type) {
$("#showMsg").text("x="+event.screenX+" y="+event.screenY)
}
})
动画
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Untitled Document</title>
<link href="css/style.css" type="text/css" rel="stylesheet"/>
<script type="text/javascript" src="script/jquery-1.7.2.js"></script>
<script type="text/javascript">
/*
基本
show([speed,[easing],[fn]]), fn: 回调函数, 完成后调用的函数
hide([speed,[easing],[fn]])
toggle([speed],[easing],[fn])
滑动
slideDown([spe],[eas],[fn])
slideUp([speed,[easing],[fn]])
slideToggle([speed],[easing],[fn])
淡入淡出
fadeIn([speed],[eas],[fn])
fadeOut([speed],[eas],[fn])
fadeTo([[spe],opa,[eas],[fn]])
fadeToggle([speed,[eas],[fn]])
*/
$(function () {
//显示 show()
$("#btn1").click(function () {
$("#div1").show(2000, function () {
alert("show动画完成 ")
});
});
//隐藏 hide()
$("#btn2").click(function () {
$("#div1").hide(1000, function () {
alert("hide动画 执行完成 ")
});
});
//切换 toggle()
$("#btn3").click(function () {
$("#div1").toggle(1000, function () {
alert("toggle动画 完成 ")
});
});
// var abc = function(){
// $("#div1").toggle(1000,abc);
// }
// abc();
//淡入 fadeIn()
$("#btn4").click(function () {
$("#div1").fadeIn(2000, function () {
alert("fadeIn完成 ")
});
});
//淡出 fadeOut()
$("#btn5").click(function () {
$("#div1").fadeOut(2000, function () {
alert("fadeOut完成 ")
});
});
//淡化到 fadeTo()
$("#btn6").click(function () {
$("#div1").fadeTo(2000, 0.5, function () {
alert('fadeTo完成 ')
});
});
//淡化切换 fadeToggle()
$("#btn7").click(function () {
$("#div1").fadeToggle(1000, function () {
alert("fadeToggle完成 ")
});
});
$("#btn8").click(function () {
var param = {width: "200px", height: "200px", color: "red", borderWidth: "5px"}
$("#div1").animate(param, 2000);
});
})
</script>
</head>
<body>
<table style="float: left;">
<tr>
<td>
<button id="btn1">显示show()</button>
</td>
</tr>
<tr>
<td>
<button id="btn2">隐藏hide()</button>
</td>
</tr>
<tr>
<td>
<button id="btn3">显示/隐藏切换 toggle()</button>
</td>
</tr>
<tr>
<td>
<button id="btn4">淡入fadeIn()</button>
</td>
</tr>
<tr>
<td>
<button id="btn5">淡出fadeOut()</button>
</td>
</tr>
<tr>
<td>
<button id="btn6">淡化到fadeTo()</button>
</td>
</tr>
<tr>
<td>
<button id="btn7">淡化切换fadeToggle()</button>
</td>
</tr>
<tr>
<td>
<button id="btn8">自定义动画animate()</button>
</td>
</tr>
</table>
<div id="div1" style="float:left;border: 1px solid;background-color: #bcf;width: 300px;height: 200px;display: none">
jquery动画定义了很多种动画效果,可以很方便的使用这些动画效果
</div>
</body>
</html>