1. 自定义js框架
1.1 js框架概述
- 框架是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法。框架是完成某种功能的半成品,可将繁琐的代码进行抽取,并提供出更加简洁,功能更加强大的语法实现。框架是对底层的API进行封装,对外提供更加简单的语法来实现最终的功能,从而提高开发效率。
2. jQuery框架介绍
2.1 jQuery框架概述
- jQuery是一个优秀的javascript的轻量级框架之一,兼容css3和各大浏览器,提供了dom、events、animate、ajax等简易的操作。并且jquery的插件非常丰富,大多数功能都有相应的插件解决方案。
- 作用:简化js的DOM树的操作
- 本质是js数组
2.2 jQuery的版本及引入
2.2.1 版本
-
1.x:兼容IE678,使用最为广泛的,官方只做BUG维护,功能不再新增。
-
2.x:不兼容IE678,很少有人使用,官方只做BUG维护,功能不再新增。如果不考虑兼容低版本的浏览器可以使用2.x。
-
3.x:不兼容IE678,只支持最新的浏览器,老的jQuery插件不支持。
-
开发版本与生产版本,命名为jQuery-x.x.x.js为开发版本,命名为jQuery-x.x.x.min.js为生产版本。开发版有格式,方便查看源码,较大;生产版无缩进注释,体积小。
2.2.2 jQuery的引入
<script type="text/javascript" src="jquery-x.x.x.js>
3. jQuery对象和js的DOM对象的区别和转换
3.1 jQuery和js的区别
-
加载事件不同。
- js加载完成事件一个html只能有1个,后面的会覆盖前面的;
- jQuery加载完成事件一个html页面可以有多个,不会相互覆盖。
jQuery加载完成事件代码(重要)
$(function (){ //事件代码 })
-
jQuery对象与js的dom对象不同,不能相互调用对方的方法。需要相互转换。建议将js对象转换为jq对象进行调用。
3.2 jQuery和js的转换
- 使用jQuery属性和方法必须保证对象时jQuery对象而不是js的DOM对象。
- 转换语法:
- js的DOM对象转换成jQuery对象,语法:
$(js对象)
; - jQuery对象通过数组存储多个标签,转换成js对象的语法:
jquery对象[索引]
或jquery对象.get(索引)
- js的DOM对象转换成jQuery对象,语法:
3.3 示例代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>jQuery和js的区别</title>
<style type="text/css"></style>
<script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
<script type="text/javascript">
/*js加载完成事件*/
window.onload = function () {
alert("js1加载"); //无法运行出来
};
window.onload = function () {
alert("js2加载"); //覆盖上一个js加载事件
};
/*jq加载完成事件*/
$(function () {
alert("jq1加载"); //运行出来
});
$(function () {
alert("jq2加载"); //运行出来
});
$(function () {
//获得js对象
var jsObj = document.getElementById("my");
// 获得jQuery对象
var jqObj = $("#my");
//使用js对象弹出标签体内容
alert("使用js对象弹出标签体内容:" + jsObj.innerHTML);
//使用jq对象弹出标签体内容
alert("使用jq对象弹出标签体内容:" + jqObj.html());
//使用js对象调用jq成员弹出标签体内容
//alert("使用js对象调用jq成员弹出标签体内容:"+jsObj.html());//不能运行
//使用jq对象调用js成员弹出标签体内容
//alert("使用jq对象调用js成员弹出标签体内容:"+jqObj.innerHTML);//undefined
//相互转化
alert("使用js对象调用jq成员弹出标签体内容:"+$(jsObj).html());
alert("使用jq对象调用js成员弹出标签体内容:"+jqObj[0].innerHTML);
});
</script>
</head>
<body>
<div id="my">你好</div>
</body>
</html>
3.4 注意事项-何时使用加载完成事件
- 当给标签注册/绑定事件,且被注册的标签执行顺序在注册事件代码之后时,才需要使用加载完成事件。确保被注册标签先加载出来,后再注册事件。
- 如果被注册的标签先加载完,然后才到加载注册事件代码(即事件的注册script代码放在被注册标签后面),是不需要使用加载完成事件的;
- 如果在标签内已经用onclick等属性注册了事件,那么事件的具体代码即使写在标签前也不需要使用加载完成事件。
- 示例代码可以详见案例代码第二个(全选和全不选)
4. jQuery选择器
4.1 基本选择器
4.1.1 语法
选择器名称 | 语法 | 解释 |
---|---|---|
标签选择器(元素选择器) | $("html标签名") | 获得所有匹配标签名称的于元素 |
id选择器 | $("#id的属性值") | 获得与指定id属性值匹配的元素 |
类选择器 | $(".class的属性值") | 获得与指定的class属性值匹配的元素 |
注意
- 如果有多个条件,那么用
,
分隔
4.1.2 示例代码
// <input type="button" value="改变 id 为 one 的元素的背景色为 红色" id="b1"/>
$("#b1").click(function () {
$("#one").css("background-color","red");
});
// <input type="button" value=" 改变元素名为 <div> 的所有元素的背景色为 红色" id="b2"/>
$("#b2").click(function () {
$("div").css("background-color","red");
});
// <input type="button" value=" 改变 class 为 mini 的所有元素的背景色为 红色" id="b3"/>
$("#b3").click(function () {
$(".mini").css("background-color","red");
});
// <input type="button" value=" 改变所有的<span>元素和 id 为 two 的元素的背景色为红色" id="b4"/>
$("#b4").click(function () {
$("span,#two").css("background-color","red");
});
4.2 层级选择器
4.2.1 语法
选择器名称 | 语法 | 解释 |
---|---|---|
后代选择器 | $("A B") | 选择A元素内部的所有B元素 |
子选择器 | $("A > B") | 选择A元素内部的所有B子元素 |
4.2.2 示例代码
// <input type="button" value=" 改变 <body> 内所有 <div> 的背景色为红色" id="b1"/>
$("#b1").click(function () {
$("body div").css("background-color","red");
});
// <input type="button" value=" 改变 <body> 内子 <div> 的背景色为 红色" id="b2"/>
$("#b2").click(function () {
$("body > div").css("background-color","red");
});
/*扩展内容*/
// <input type="button" value=" 改变 id 为 one 的下一个 <div> 的背景色为 红色" id="b3"/>
$("#b3").click(function () {
$("#one + div").css("background-color","red");
});
// <input type="button" value=" 改变 id 为 two 的元素后面的所有兄弟<div>的元素的背景色为 红色" id="b4"/>
$("#b4").click(function () {
$("#two ~ div").css("background-color","red");
});
// <input type="button" value=" 改变 id 为 two 的元素所有 <div> 兄弟元素的背景色为红色" id="b5"/>
$("#b5").click(function () {
//$("#two").siblings(),获取id为two的所有兄弟元素。
$("#two").siblings("div").css("background-color","red");
});
4.3 属性选择器
4.3.1 语法
选择器名称 | 语法 | 解释 |
---|---|---|
属性选择器 | $("A[属性名]") | 包含指定属性的A元素 |
属性选择器 | $("A[属性名=值]") | 包含指定属性等于指定值的A元素 |
复合属性选择器 | $("A[属性名=值]...") | 包含多个属性条件的A元素 |
4.3.2 示例代码
// <input type="button" value=" 含有属性title 的div元素背景色为红色" id="b1"/>
$("#b1").click(function () {
$("div[title]").css("background-color","red");
});
// <input type="button" value=" 属性title值等于test的div元素背景色为红色" id="b2"/>
$("#b2").click(function () {
$("div[title='test']").css("background-color","red");
});
/*拓展内容,查API*/
// <input type="button" value=" 属性title值不等于test的div元素(没有属性title的也将被选中)背景色为红色" id="b3"/>
$("#b3").click(function () {
$("div[title!='test']").css("background-color","red");
});
// <input type="button" value=" 属性title值 以te开始 的div元素背景色为红色" id="b4"/>
$("#b4").click(function () {
$("div[title^='te']").css("background-color","red");
});
// <input type="button" value=" 属性title值 以est结束 的div元素背景色为红色" id="b5"/>
$("#b5").click(function () {
$("div[title$='est']").css("background-color","red");
});
// <input type="button" value="属性title值 含有es的div元素背景色为红色" id="b6"/>
$("#b6").click(function () {
$("div[title*='es']").css("background-color","red");
});
// <input type="button" value="选取有属性id的div元素,然后在结果中选取属性title值含有“es”的 div 元素背景色为红色" id="b7"/>
$("#b7").click(function () {
$("div[id][title*='es']").css("background-color","red");
});
4.4 基本过滤选择器
4.4.1 语法
选择器名称 | 语法 | 解释 |
---|---|---|
首元素选择器 | :first | 获得选择的元素中的第一个元素 |
尾元素选择器 | :last | 获得选择的元素中的最后一个元素 |
非元素选择器 | :not(selecter) | 不包括指定内容的元素,排除元素 |
偶数选择器 | :even | 索引值为偶数的元素,从 0 开始计数 |
奇数选择器 | :odd | 索引值为奇数的元素,从 0 开始计数 |
等于索引选择器 | :eq(index) | 指定索引元素 |
大于索引选择器 | :gt(index) | 大于指定索引元素 |
小于索引选择器 | :lt(index) | 小于指定索引元素 |
标题选择器 | :header | 获得标题(h标签)元素,固定写法 |
- 注意:其中的索引值是根据代码执行的顺序或者说加载顺序编排。
比方说有两个div,第一个div里面有两个小的div。那么索引值是第一个大的div为0,大div里面的第一个小div索引值为1,第二个小div为2,然后才到第二个大div为3。原因是第一个大div加载完成(包括里面的两个加载完成),才会去加载第二个大div
4.4.2 示例代码
// <input type="button" value=" 改变第一个 div 元素的背景色为 红色" id="b1"/>
$("#b1").click(function () {
$("div:first").css("background-color","red");
});
// <input type="button" value=" 改变最后一个 div 元素的背景色为 红色" id="b2"/>
$("#b2").click(function () {
$("div:last").css("background-color","red");
});
// <input type="button" value=" 改变class不为 one 的所有 div 元素的背景色为 红色" id="b3"/>
$("#b3").click(function () {
$("div:not(.one)").css("background-color","red");
});
// <input type="button" value=" 改变索引值为偶数的 div 元素的背景色为 红色" id="b4"/>
$("#b4").click(function () {
$("div:even").css("background-color","red");
});
// <input type="button" value=" 改变索引值为奇数的 div 元素的背景色为 红色" id="b5"/>
$("#b5").click(function () {
$("div:odd").css("background-color","red");
});
// <input type="button" value=" 改变索引值为大于 3 的 div 元素的背景色为 红色" id="b6"/>
$("#b6").click(function () {
$("div:gt(3)").css("background-color","red");
});
// <input type="button" value=" 改变索引值为等于 3 的 div 元素的背景色为 红色" id="b7"/>
$("#b7").click(function () {
$("div:eq(3)").css("background-color","red");
});
// <input type="button" value=" 改变索引值为小于 3 的 div 元素的背景色为 红色" id="b8"/>
$("#b8").click(function () {
$("div:lt(3)").css("background-color","red");
});
// <input type="button" value=" 改变所有的标题元素的背景色为 红色" id="b9"/>
$("#b9").click(function () {
$(":header").css("background-color","red");
});
// <input type="button" value=" 改变当前正在执行动画的所有元素的背景色为 红色" id="b10"/>
$("#b10").click(function () {
$(":animated").css("background-color","red");
});
4.5 表单属性选择器
4.5.1 语法
选择器名称 | 语法 | 解释 |
---|---|---|
可用元素选择器 | :enabled | 获得可用元素 |
不可用元素选择器 | :disabled | 获得不可用元素 |
选中选择器 | :checked | 获得单选/复选框选中的元素 |
选中选择器 | :selected | 获得下拉框选中的元素 |
-
格式:(以input元素为例)
var $inputs = $("input[type='text']:enabled");
-
上述代码可以简化为
var $inputs = $(":text:enabled");
注意事项
select下拉框中被选中的元素不是select,而是option!
4.5.2 示例代码
// <input type="button" value=" 利用 jQuery 对象的 val() 方法改变表单内可用 <input> 元素的值" id="b1"/>
$("#b1").click(function () {
$("input[type='text']:enabled").val("azure");
});
// <input type="button" value=" 利用 jQuery 对象的 val() 方法改变表单内不可用 <input> 元素的值" id="b2"/>
$("#b2").click(function () {
//代码优化
$(":text:disabled").val("azure");
});
// <input type="button" value=" 利用 jQuery 对象的 length 属性获取多选框选中的个数" id="b3"/>
$("#b3").click(function () {
//jq对象.length,获取数组元素的个数
alert($(":checkbox:checked").length);
});
// <input type="button" value=" 利用 jQuery 对象的 text() 方法获取下拉框选中的内容" id="b4"/>
$("#b4").click(function () {
//注意,下拉框选中不是select而是里面的option
alert($("option:selected").text());
});
5. jQuery的DOM操作
5.1 jQuery对DOM树中的文本和值进行操作
5.1.1 语法
语法 | 解释 |
---|---|
val([value]) | 获得/设置元素value属性相应的值 |
text([value]) | 获得/设置元素的文本内容 |
html([value]) | 获得/设置元素的标签体内容 |
- value是可填项,为空是获取,不为空是设置
5.2 jQuery对DOM树中的属性进行操作
5.2.1 语法
语法 | 解释 |
---|---|
attr(name[,value]) | 获得/设置属性的值 |
prop(name[,value]) | 获得/设置checked、selected属性的值 |
removeAttr(name) | 删除属性 |
- value是可填项,为空是获取,不为空是设置
5.2.2 attr与prop的注意事项
- prop是jQuery1.6才开始有,attr一直都有;
- 如果元素没有设置属性,用attr无法获取,返回undefined;而用prop可以获取没有设置的属性,此时返回false;
结论:
- 获取选中状态(checked 和 selected )使用prop获取
- 其他使用attr获取,只有获取不到换成prop
5.3 jQuery对class进行操作
5.3.1 语法
语法 | 解释 |
---|---|
css(name[,value]) | 获取/设置指定的CSS样式,本质是操作style属性 |
addClass(value) | addClass(类样式名) 给指定的对象追加指定的新的类样式,本质操作class属性 |
removeClass(value) | removeClass(类样式名) 删除指定的类样式 |
toggleClass(value) | toggleClass(类样式名) 切换样式,如果没有类样式,则添加,如果有类样式,则删除 |
attr(“style”,“样式值”) | 设置指定的CSS样式,覆盖原有的css样式 |
attr(“class”,“类选择器”) | 设置指定的class属性值(包括添加和移除),覆盖原有的class属性值 |
5.3.2 示例代码
// <input type="button" value="给id为one设置属性class的值为second" id="b1"/>
$("#b1").click(function () {
$("#one").attr("class","second");
});
// <input type="button" value=" addClass" id="b2"/>
$("#b2").click(function () {
$("#one").addClass("second");
});
// <input type="button" value="removeClass" id="b3"/>
$("#b3").click(function () {
$("#one").removeClass("second");
});
// <input type="button" value=" 切换样式" id="b4"/>
$("#b4").click(function () {
$("#one").toggleClass("second");
});
// <input type="button" value=" 通过css()获得id为one背景颜色" id="b5"/>
$("#b5").click(function () {
alert($("#one").css("background-color"));
});
// <input type="button" value=" 通过css()设置id为one背景颜色为绿色" id="b6"/>
$("#b6").click(function () {
$("#one").css("background-color","green");//操作style属性
});
5.4 jQuery创建插入对象
5.4.1 语法
语法 | 解释 |
---|---|
$(“元素”) | 创建元素对象,注意成对设置 |
父标签.append(子标签) | 添加成最后一个子元素,两者之间是父子关系 |
父标签.prepend(子标签) | 添加成第一个子元素,两者之间是父子关系 |
当前标签.before(兄弟标签) | 添加到当前元素的前面,两者之间是兄弟关系 |
当前标签.after(兄弟标签) | 添加到当前元素的后面,两者之间是兄弟关系 |
注意:
- 如果子标签或者兄弟标签在网页中已经存在,那么执行上述的append、prepend、before、after方法时,子标签或者兄弟标签将会从原有的位置移动到目标位置,而不是插入!!
- 如果需要在插入已存在的子标签或者兄弟标签保留原有的位置,需要使用clone()克隆当前的标签,具体详见qq表情案例。
5.5 jQuery删除对象
5.5.1 语法
语法 | 解释 |
---|---|
jQuery对象.remove() | 删除jQuery对象 |
jQuery对象.empty() | 清空jQuery的所有子元素 |
6. 综合案例
6.1 隔行换色及全选反选
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>隔行换色及全选反选</title>
<script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
<script type="text/javascript">
/*
给表格注册事件,对隔行进行换色
*/
$(function () {
/*
* 由于表从第三行开始显示表格的数据,第一行是按钮,第二行是表头,所以索引值是从2开始(包含2)
* */
//获取行索引位置2和以后的行,操作偶数行为粉红色
//因为:gt(index)是不包含index,所以要index要写1
$("tr:gt(1):even").css("background-color","pink");
//获取行索引位置2和以后的行,操作奇数行为黄色
$("tr:gt(1):odd").css("background-color","yellow");
});
/*
全选反选思路:
全选:点击全选按钮,全部选中/不选中;子选项全部选上/不选上,则全选按钮点上/不点上;
反选:点击反选按钮,子选项选上的就不选上,不选上的就选上
核心:触发子选项点击事件
*/
/*实现全选功能*/
//1. 点击全选按钮,全部选中/不选中
function checkedAll(obj) {
//注意obj是个js对象,要转换
$(".itemSelect").prop("checked",$(obj).prop("checked"));
}
//2. 子选项全部选上/不选上,则全选按钮点上/不点上
//由于每个子选项都没有用onclick注册事件,所以在这里注册事件时要使用加载完成事件
$(function () {
/*
思路:给每个子选项注册事件,如果子选项有一个以上没有勾上,那么全选框也不能勾上
子选项的点击事件触发全选框的点击事件,用this来指代当前触发点击事件的子选项
*/
//给所有子选项注册事件
$(".itemSelect").click(function () {
//this是个js对象,要转换
if ($(this).prop("checked")==false) { //当前子选项不选中
$("#checkAll").prop("checked",false); //全选框不勾上
} else {
//子选项全部选中,全选框选中
//子选项选中的个数与子选项的个数一致的时候,全选框勾上
if ($(".itemSelect").length == $(".itemSelect:checked").length) {
$("#checkAll").prop("checked",true);
}
}
});
});
/*
实现反选功能
思路:如果点击反选按钮,所有的子选项全都点击一次
*/
//注册反选点击事件
$(function () {
$("#reverse").click(function () {
$(".itemSelect").click();
})
});
</script>
</head>
<body>
<table id="tab1" border="1" width="800" align="center" >
<tr>
<td colspan="5"><input type="button" value="反选" id="reverse"></td>
</tr>
<tr style="background-color: #999999;">
<th><input type="checkbox" id="checkAll" onclick="checkedAll(this)"></th>
<th>分类ID</th>
<th>分类名称</th>
<th>分类描述</th>
<th>操作</th>
</tr>
<tr>
<td><input type="checkbox" class="itemSelect"></td>
<td>1</td>
<td>手机数码</td>
<td>手机数码类商品</td>
<td><a href="">修改</a>|<a href="">删除</a></td>
</tr>
<tr>
<td><input type="checkbox" class="itemSelect"></td>
<td>2</td>
<td>电脑办公</td>
<td>电脑办公类商品</td>
<td><a href="">修改</a>|<a href="">删除</a></td>
</tr>
<tr>
<td><input type="checkbox" class="itemSelect"></td>
<td>3</td>
<td>鞋靴箱包</td>
<td>鞋靴箱包类商品</td>
<td><a href="">修改</a>|<a href="">删除</a></td>
</tr>
<tr>
<td><input type="checkbox" class="itemSelect"></td>
<td>4</td>
<td>家居饰品</td>
<td>家居饰品类商品</td>
<td><a href="">修改</a>|<a href="">删除</a></td>
</tr>
</table>
</body>
</html>
6.2 qq表情案例
需求:点击上列的qq表情,在文本框中追加上去
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>QQ表情选择</title>
<style type="text/css">
*{margin: 0;padding: 0;list-style: none;}
.emoji{margin:50px;}
ul{overflow: hidden;}
li{float: left;width: 48px;height: 48px;cursor: pointer;}
.emoji img{ cursor: pointer; }
</style>
<script src="js/jquery-3.3.1.min.js" type="text/javascript"></script>
<script type="text/javascript">
/*
思路:注册点击事件,点击后克隆图片并追加到p元素内
*/
//给所有li的img属性注册事件
$(function () {
$("li img").click(function () {
//将当前img克隆并追加到p元素内
$(".word").append($(this).clone());
});
});
</script>
</head>
<body>
<div class="emoji">
<ul>
<li><img src="img/01.gif" height="22" width="22" alt="" /></li>
<li><img src="img/02.gif" height="22" width="22" alt="" /></li>
<li><img src="img/03.gif" height="22" width="22" alt="" /></li>
<li><img src="img/04.gif" height="22" width="22" alt="" /></li>
<li><img src="img/05.gif" height="22" width="22" alt="" /></li>
<li><img src="img/06.gif" height="22" width="22" alt="" /></li>
<li><img src="img/07.gif" height="22" width="22" alt="" /></li>
<li><img src="img/08.gif" height="22" width="22" alt="" /></li>
<li><img src="img/09.gif" height="22" width="22" alt="" /></li>
<li><img src="img/10.gif" height="22" width="22" alt="" /></li>
<li><img src="img/11.gif" height="22" width="22" alt="" /></li>
<li><img src="img/12.gif" height="22" width="22" alt="" /></li>
</ul>
<p class="word">
<strong>请发言:</strong>
</p>
</div>
</body>
</html>
7. 补充知识点
1、 文本框不可用的2种方式
方式1:设置disabled="disabled"属性,文本框背景是灰色,这个是无法提交给服务器的
方式2:设置readyonly="readyonly"属性,文本框背景色是白色,这个是只读但可以提交服务器的