complete files:jQuery

This commit is contained in:
qianguyihao 2018-02-06 14:18:23 +08:00
parent 6a105f5c23
commit 83da164058
5 changed files with 1541 additions and 44 deletions

View File

@ -4,9 +4,9 @@
- `document.write();` 不常用,因为容易覆盖原来的页面。
- `innerHTML;` 用的比较多。绑定属性和内容比较方便。(节点套节点)
- `innerHTML = ();` 用的比较多。绑定属性和内容比较方便。(节点套节点)
- `document.createElement;` 用得也比较多,指定数量的时候一般用它。
- `document.createElement();` 用得也比较多,指定数量的时候一般用它。
**1、方式一**

View File

@ -42,7 +42,7 @@ js库是把我们常用的功能放到一个单独的文件中我们用的时
- 官网API文档<http://api.jquery.com/>
- 汉化API文档<http://www.css88.com/jqapi-1.9/>
- 中文汉化API文档<http://www.css88.com/jqapi-1.9/>
### 学习jQuery主要是学什么
@ -122,9 +122,22 @@ js库是把我们常用的功能放到一个单独的文件中我们用的时
### jQuery 的两大特点
- 链式编程:比如`.show()`和`.html()`可以连写成`.show().html()`。
1**链式编程**:比如`.show()`和`.html()`可以连写成`.show().html()`。
链式编程原理return this。
通常情况下,只有设置操作才能把链式编程延续下去。因为获取操作的时候,会返回获取到的相应的值,无法返回 this。
2**隐式迭代**:隐式 对应的是 显式。隐式迭代的意思是:在方法的内部会为匹配到的所有元素进行循环遍历,执行相应的方法;而不用我们再进行循环,简化我们的操作,方便我们调用。
如果获取的是多元素的值,大部分情况下返回的是第一个元素的值。
- 隐式迭代:隐式 对应的是 显式。隐式迭代的意思是:在方法的内部进行循环遍历,而不用我们自己再进行循环,简化我们的操作,方便我们调用。
## jQuery 的使用

View File

@ -516,6 +516,82 @@ PS参数如果都不写默认两个都是false。实际工作中直接
注意如果元素动画还没有执行完此时调用sotp()方法,那么动画将会停止。并且动画没有执行完成,那么回调函数也不会被执行。
## 举例:右下角的弹出广告
代码实现:
```html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style type="text/css">
.ad {
position: fixed;
right: 0;
bottom: 0;
width: 230px;
height: 120px;
background-image: url(images/ad.jpg);
display: none;
}
.ad span {
position: absolute;
right: 0;
top: 0;
width: 40px;
height: 18px;
background-image: url(images/h.jpg);
cursor: pointer;
}
</style>
<script src="jquery-1.11.1.js"></script>
<script>
$(function () {
//需求然广告ad部分先滑入在滑出在淡入。然后绑定事件点击span弹出
//步骤:
$(".ad").slideDown(1000).slideUp(1000).fadeIn(1000).children("span").click(function () {
$(this).parent().fadeOut(1000);
});
//第二种写法
// $(".ad").slideDown(1000, function () {
// $(".ad").slideUp(1000, function () {
// $(".ad").fadeIn(1000, function () {
// $(".ad").children("span").click(function () {
// $(this).parent().fadeOut(1000, function () {
// alert("执行完毕!");
// });
// });
// });
// });
// })
})
</script>
</head>
<body>
<div class="ani">我是内容</div>
<div class="ad">
<span></span>
</div>
</body>
</html>
```
效果如下:
20180205_2000.gif
## 我的公众号
想学习<font color=#0000ff>**代码之外的软技能**</font>?不妨关注我的微信公众号:**生命团队**id`vitateam`)。

View File

@ -4,9 +4,7 @@
## 文本主要内容
- 样式和类操作
- jQuery 动画
- 节点操作
@ -322,30 +320,658 @@ $(selector).toggleClass(“liItem”); //为指定元素切换类 className
```javascript
## jQuery 的节点操作
### 动态创建元素
原生 js 有[三种动态创建元素](07-DOM操作练习innerHTML的方式创建元素.md)的方式。这里我们学一下 jQuery 动态创建元素。**注意,创建的是 jQuery 对象**。
方式一:
```javascript
var $spanNode1 = $("<span>我是一个span元素</span>"); // 返回的是 jQuery对象
```
此方法类似于 原生 js 中的`document.createElement("标签名");`
方式二:(推荐)
```javascript
var node = $("#box").html("<li>我是li</li>");
```
此方法类似于 原生 js 中的`innerHTML`。
举例:
```javascript
//方式一: $("标签") :类比于js中的document.createElement("li");
console.log($("<li class='aaa'>我是li标签</li>"));
//方式二: $("ul").html(""); :类比innerHTML属性。因为此属性识别标签。
$("ul").html("<li>我是html方法穿件出来的li标签</li>")
```
### 添加元素
jQuery 添加元素的方法非常多,最重要的方法是`append()`。格式如下:
```javascript
// 方式一:在$(selector)中追加$node
$(selector).append($node); //参数是 jQuery对象
// 方式二:在$(selector)中追加div元素
$(selector).append('<div></div>'); //参数是 htmlString
```
作用:在被选元素内部的最后一个子元素(或内容)后面插入内容(存在或者创建出来的元素都可以)。
通俗的解释:**在盒子里的最末尾添加元素**。
- 如果是页面中存在的元素那调用append()后,会把这个元素放到相应的目标元素里面去;但是,原来的这个元素,就不存在了。
- 如果是给多个目标追加元素,那么方法的内部会复制多份这个元素,然后追加到多个目标里面去。
举例:
```html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<script src="jquery-1.11.1.js"></script>
<script>
jQuery(document).ready(function () {
$("button").click(function () {
//创建一个新的jquery对象li
var jqNewLi = $("<li>我是jquery创建出来的li。用的是append方法添加</li>");
//append(); 在盒子里的最末尾添加与严肃
$("ul").append(jqNewLi); //把新创建的 li 塞进已知的 ul 中
//jqNewLi.appendTo($("ul")); //方式二把新创建的li塞进ul中。作用同上
})
});
</script>
</head>
<body>
<button>添加li</button>
<ul>
<li>我是土著li</li>
</ul>
</body>
</html>
```
效果:
20180205_2020.gif
**其他的添加元素的方法:**
方法2
```javascript
$(selector).appendTo(node);
```
作用同append(),只不过是反着写的。
方法3
```javascript
$(selector).prepend(node);
```
作用:在元素的第一个子元素前面追加内容或节点。
方法4
```javascript
$(selector).after(node);
```
作用:在被选元素之后,作为**兄弟元素**插入内容或节点。
**方法5**
```javascript
$(selector).before(node);
```
作用:在被选元素之前,作为**兄弟元素**插入内容或节点。
### 清空元素
方式一:没有参数
```javascript
$(selector).empty();
$(selector).html("");
```
解释:清空指定元素的所有子元素(光杆司令)。
方式二:
//
```javascript
$(selector).remove();
```
解释:“自杀” 。把自己以及所有的内部元素从文档中删除掉。
### 复制元素
格式:
```javascript
复制的新元素 = $(selector).clone();
```
解释:复制$(selector)这个元素。是深层复制。
### 总结
推荐使用 `html("<span></span>")` 方法来创建元素或者 `html("")` 清空元素。
### 案例:选择水果
完整版代码:
```html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
select {
width: 170px;
height: 240px;
font-size: 18px;
background-color: #a4ff34;
}
</style>
<script src="jquery-1.11.1.js"></script>
<script>
$(function () {
//步骤:
//1.将左侧的子标签全部移动到右侧。
$("button").eq(0).click(function () {
//右侧标签.append(左侧标签);
$("#sel2").append($("#sel1 option"));
});
//2.将右侧的子标签全部移动到左侧。
$("button").eq(1).click(function () {
//左侧标签.append(右侧标签);
$("#sel1").append($("#sel2 option"));
});
//第二步:获取子元素的时候要注意,获取的必须是,被选中的元素。
//技术点怎么获取被选中的子元素呢答案option:selected;
//1.将左侧被选中的子标签移动到右侧
$("button").eq(2).click(function () {
//右侧标签.append(左侧标签);
$("#sel2").append($("#sel1 option:selected"));
});
//2.将右侧被选中的子标签移动到左侧
$("button").eq(3).click(function () {
//右侧标签.append(左侧标签);
$("#sel1").append($("#sel2 option:selected"));
});
})
</script>
</head>
<body>
<select id="sel1" size="10" multiple>
<option value="0">香蕉</option>
<option value="1">苹果</option>
<option value="2">鸭梨</option>
<option value="3">葡萄</option>
</select>
<button>>>></button>
<button><<<</button>
<button>></button>
<button><</button>
<select id="sel2" size="10" multiple>
</select>
</body>
</html>
```
效果:
20180205_2040.gif
### 案例:动态添加表格项
代码如下:
```html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
table {
border-collapse: collapse;
border-spacing: 0;
border: 1px solid #c0c0c0;
}
th,
td {
border: 1px solid #d0d0d0;
color: #404060;
padding: 10px;
}
th {
background-color: #09c;
font: bold 16px "微软雅黑";
color: #fff;
}
td {
font: 14px "微软雅黑";
}
tbody tr {
background-color: #f0f0f0;
}
tbody tr:hover {
cursor: pointer;
background-color: #fafafa;
}
</style>
<script src="jquery-1.11.1.js"></script>
<script>
$(function () {
// 模拟从后台拿到的数据
var data = [{
name: "博客园",
url: "http://www.cnblogs.com/smyhvae/",
type: "程序员的精神家园"
}, {
name: "简书",
url: "https://www.jianshu.com/u/4d2e6b4bf117",
type: "写作平台"
}, {
name: "百度",
url: "https://www.baidu.com/",
type: "你就知道"
}];
//需求:点击按钮然后生成tr里面生成三个td.数组元素个数个tr。然后放入tbody中
//步骤:
//1.绑定事件
//2.利用for循环,把数组中的所有数据组合成一个字符串。
//3.把生成的字符串设置为html内容添加进tbody中。
//1.绑定事件
$("input").click(function () {
//写入到click事件中每次点击以后把之前的str清空【重要】
var str = "";
//2.利用for循环,把数组中的所有数据组合成一个字符串。
for(var i=0;i<data.length;i++){
//如何生成3组
// str += "<tr><td>1</td><td>2</td><td>3</td></tr>";
//data[i] = 数组中的每一个json
//data[i].name = 数组中的每一个json的name属性值
str += "<tr><td>"+data[i].name+"</td><td>"+data[i].url+"</td><td>"+data[i].type+"</td></tr>";
}
//3.把生成的字符串设置为html内容添加进tbody中。
$("#j_tbData").html(str);
})
})
</script>
</head>
<body>
<input type="button" value="获取数据" id="j_btnGetData"/>
<table>
<thead>
<tr>
<th>标题</th>
<th>地址</th>
<th>说明</th>
</tr>
</thead>
<tbody id="j_tbData">
<!--<tr>-->
<!--<td>1</td>-->
<!--<td>2</td>-->
<!--<td>3</td>-->
<!--</tr>-->
</tbody>
</table>
</body>
</html>
```
实现的效果:
20180205_2045.gif
代码解释每次生成字符串str之前记得先把之前的str清空不然每次点击按钮都会继续添加表格项。
### 将上一个案例进一步提升:点击按钮,添加数据
暂略。
## jQuery 设置和获取属性
jQuery 无法直接操作节点的属性和src等我们需要借助attr()方法。下面介绍。
### 属性操作
**1设置属性**
```javascript
$(selector).attr("title", "生命壹号");
```
参数解释:第一个参数表示:要设置的属性名称。第二个参数表示:该属性名称对应的值。
**2获取属性**
```javascript
$(selector).attr("title");
```
参数为:要获取的属性的名称,返回指定属性对应的值。
**总结**:两个参数是给属性赋值,单个参数是获取属性值。
**3移除属性**
```javascript
$(selector).removeAttr("title");
```
参数为:要移除的属性的名称。
4form表单中的 `prop()`方法:
针对`checked、selected、disabled`属性,要使用 `prop()`方法,而不是其他的方法。
prop方法通常用来影响DOM元素的动态状态而不是改变的HTML属性。例如input和button的disabled特性以及checkbox的checked特性。
总结:细节可以参考:<http://api.jquery.com/prop/>
以上四项的代码演示:
```html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
.aaa {
border: 1px solid red;
}
</style>
<script src="jquery-1.11.1.js"></script>
<script>
$(function () {
//获取元素,绑定属性
var jqinp = $("input").eq(0);
var jqinp2 = $("input:checkbox");
var jqbtn = $("button");
jqbtn.click(function () {
//是绑定到jquery的衣服上而不是标签上。所以没达到效果
// jqinp.title = 111;
// console.log(jqinp.title);
//绑定到标签上
jqinp.attr("title", 111);
console.log(jqinp.attr("title"));
jqinp.attr("aaa", 111);
console.log(jqinp.attr("aaa"));
//两个参数是给属性赋值,单个参数是获取属性值。
jqinp.attr("class", "aaa");
console.log(jqinp.attr("class"));
jqinp.removeAttr("class");
console.log(jqinp.attr("class"));
//form中的特殊属性用prop
jqinp2.prop("checked", true);
// jqinp2.attr("checked",true);//一次性的。鼠标多点击几次,就失效了。
});
})
</script>
</head>
<body>
<button>绑定</button>
<input type="text"/>
<input type="checkbox"/>
</body>
</html>
```
效果:
20180205_2115.gif
**案例:表格案例全选反选**
完整版代码:
```html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
* {
padding: 0;
margin: 0;
}
.wrap {
width: 300px;
margin: 100px auto 0;
}
table {
border-collapse: collapse;
border-spacing: 0;
border: 1px solid #c0c0c0;
}
th,
td {
border: 1px solid #d0d0d0;
color: #404060;
padding: 10px;
}
th {
background-color: #09c;
font: bold 16px "微软雅黑";
color: #fff;
}
td {
font: 14px "微软雅黑";
}
tbody tr {
background-color: #f0f0f0;
}
tbody tr:hover {
cursor: pointer;
background-color: #fafafa;
}
</style>
<script src="jquery-1.11.1.js"></script>
<script>
$(function () {
//需求1点击上面的多选按钮下面的所有多选按钮都和上面的一致
//需求2点击下面的多选按钮判断下面的所有多选按钮都是否全部被选定只有全部被选定上面的才被选定
//需求1点击上面的多选按钮下面的所有多选按钮都和上面的一致
//步骤:绑定事件,直接让下面的所有按钮和上面的按钮属性值一模一样
$("#j_cbAll").click(function () {
//直接让下面的所有按钮和上面的按钮属性值一模一样
$("#j_tb input:checkbox").prop("checked", $(this).prop("checked"));
});
//需求2点击下面的多选按钮判断下面的所有多选按钮都是否全部被选定只有全部被选定上面的才被选定
//需求2点击下面的多选按钮判断下面的所有多选按钮都是否全部被选定只有全部被选定上面的才被选定
$("#j_tb input:checkbox").click(function () {
//判断,只有所有都背选定,上面的才被选定
//技术点带有checked属性的标签和checkbox个数一样多的时候
if ($("#j_tb input:checkbox").length === $("#j_tb input:checked").length) {
//只有所有的都有checked属性上面的才被选定
$("#j_cbAll").prop("checked", true);
} else {
$("#j_cbAll").prop("checked", false);
}
});
})
</script>
</head>
<body>
<div class="wrap">
<table>
<thead>
<tr>
<th>
<input type="checkbox" id="j_cbAll"/>
</th>
<th>课程名称</th>
<th>所属团队</th>
</tr>
</thead>
<tbody id="j_tb">
<tr>
<td>
<input type="checkbox"/>
</td>
<td>JavaScript</td>
<td>生命团队</td>
</tr>
<tr>
<td>
<input type="checkbox"/>
</td>
<td>css</td>
<td>生命团队</td>
</tr>
<tr>
<td>
<input type="checkbox"/>
</td>
<td>html</td>
<td>生命团队</td>
</tr>
<tr>
<td>
<input type="checkbox"/>
</td>
<td>jQuery</td>
<td>生命团队</td>
</tr>
</tbody>
</table>
</div>
</body>
</html>
```
### val()方法和 text()方法
```javascript
$(selector).val();
```
作用:设置或返回 form 表单元素的value值例如input、select、textarea 的值。
```javascript
$(selector).text();
```
作用:设置或获取匹配元素的文本内容。不带参数表示,会把所有匹配到的元素内容拼接为一个**字符串**,不同于其他获取操作。
```javascript
$(selector).text(“我是内容”);
```
作用设置的内容包含html标签那么text()方法会把他们当作**纯文本**内容输出。
总结:
- text() 不识别标签。
- html() 识别标签。
举例:
@ -353,45 +979,49 @@ $(selector).toggleClass(“liItem”); //为指定元素切换类 className
```html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<script src="jquery-1.11.1.js"></script>
<script>
jQuery(document).ready(function () {
//val(); 获取标签中的value属性的值。带有参数是赋值(类比js中的value属性)
console.log($("input").val());
$("input").val("我是value()赋值的input内容");
console.log($("input").val());
console.log("-----------------");
//text(); 获取双闭合标签中的文本值。(不识别标签)(类比js中的innerText)
console.log($("div").text());
$("div").text("<li>我是text()赋值的</li>")
console.log($("div").text());
console.log("-----------------");
//html(); 获取双闭合标签中的文本值。(识别标签)(类比js中的innerHTML)
console.log($("div").html());
$("div").html("<li>我是html()赋值的</li>");
console.log($("div").html());
})
</script>
</head>
<body>
<input type="text" value="我是input中已存在的 value内容"/>
<div>
<li>你好</li>
</div>
</body>
</html>
```
打印结果:
```javascript
```
20180205_2139.png
```html
```
```javascript
```
```
```

View File

@ -0,0 +1,778 @@
## jQuery 设置宽度和高度
宽度操作:
```javascript
$(selector).height(); //不带参数表示获取高度
$(selector).height(200); //带参数表示设置高度
```
宽度操作:
```javascript
$(selector).width(); //不带参数表示获取宽度
$(selector).width(200); //带参数表示设置高宽度
```
**问题**jQuery的css()获取高度和jQuery的height获取高度二者的区别
答案:
```javascript
$("div").css(); //返回的是string类型例如30px
$("div").height(); //返回得失number类型例如30。常用于数学计算。
```
如上方代码所示,`$("div").height();`返回的是number类型常用于数学计算。
## jQuery 的坐标操作
### offset()方法
```javascript
$(selector).offset();
$(selector).offset({left:100, top: 150});
```
作用:获取或设置元素相对于 document 文档的位置。参数解释:
- 无参数:表示获取。返回值为:{left:num, top:num}。返回值是相对于document的位置。
- 有参数:表示设置。参数建议使用 number 数值类型。
注意设置offset后如果元素没有定位(默认值static)则被修改为relative。
### position()方法
```javascript
$(selector).position();
```
作用:获取相对于其最近的**带有定位**的父元素的位置。返回值为对象:`{left:num, top:num}`。
注意:只能获取,不能设置。
### scrollTop()方法
```javascript
scrollTop();
$(selector).scrollTop(100);
```
作用:获取或者设置元素被卷去的头部的距离。参数解释:
- 无参数:表示获取偏移。
- 有参数:表示设置偏移,参数为数值类型。
### scrollLeft()方法
```javascript
scrollLeft();
$(selector).scrollLeft(100);
```
作用:获取或者设置元素水平方向滚动的位置。参数解释:
- 无参数:表示获取偏移。
- 有参数:表示设置偏移,参数为数值类型。
代码示范:
```html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
body {
height: 5000px;
}
.box1 {
width: 300px;
height: 300px;
position: relative;
margin: 10px;
overflow: auto;
background-color: pink;
}
.box2 {
width: 200px;
height: 400px;
position: absolute;
top: 50px;
left: 50px;
background-color: yellow;
}
</style>
<script src="jquery-1.11.1.js"></script>
<script>
$(function () {
//距离页面最顶端或者最左侧的距离和有没有定位没有关系
$("button").eq(0).click(function () {
alert($(".box2").offset().top);
})
//距离页面最顶端或者最左侧的距离和有没有定位没有关系
$("button").eq(1).click(function () {
$(".box2").offset({"left": 1000, "top": 1000});
})
//距离父系盒子中带有定位的盒子的距离(获取的就是定位值和margin/padding无关)
$("button").eq(2).click(function () {
alert($(".box2").position().top);
})
//距离父系盒子中带有定位的盒子的距离(获取的就是定位值和margin/padding无关)
$("button").eq(3).click(function () {
$(".box2").position().top = "100px";
})
//获取被选取的头部
$("button").eq(4).click(function () {
alert($(window).scrollTop());
})
//获取被选取的头部
$("button").eq(5).click(function () {
$(window).scrollTop(100);
})
})
</script>
</head>
<body>
<div class="box1">
<div class="box2"></div>
</div>
<button>offset().top获取</button>
<button>offset().top设置</button>
<button>position().top获取</button>
<button>position().top设置</button>
<button>scrollTop()</button>
<button>scrollTop()</button>
</body>
</html>
```
## jQuery的事件机制
### 常见的事件绑定
- click(handler) 单击事件。
- blur(handler) 失去焦点事件。
- mouseenter(handler) 鼠标进入事件。
- mouseleave(handler) 鼠标离开事件。
- dbclick(handler) 双击事件。
- change(handler) 改变事件,如:文本框值改变,下拉列表值改变等。
- focus(handler) 获得焦点事件。
- keydown(handler) 键盘按下事件。
参考链接:<http://www.w3school.com.cn/jquery/jquery_ref_events.asp>
### on方式绑定事件
最早采用的是 bind、delegate等方式绑定的。jQuery 1.7版本后jQuery用on统一了所有的事件处理的方法此方法兼容zepto(移动端类似于jQuery的一个库)。
格式举例:
```javascript
$(document).on("click mouseenter", ".box", {"name": 111}, function (event) {
console.log(event.data); //event.data获取的就是第三个参数这个json。
console.log(event.data.name); //event.data.name获取的是name的值。
});
```
参数解释:
- 第一个参数events绑定事件的名称可以是由空格分隔的多个事件标准事件或者自定义事件。上方代码绑定的是单击事件和鼠标进入事件。
- 第二个参数selector, 执行事件的后代元素。
- 第三个参数data传递给事件处理函数的数据事件触发的时候通过event.data来使用也就是说可以通过event拿到data
- 第四个参数handler事件处理函数。
简单点的写法:
```javascript
$(document).on("click",".box", function () {
alert(1);
});
```
### off方式解绑事件
```javascript
$(selector).off(); // 解绑匹配元素的所有事件
$(selector).off("click"); // 解绑匹配元素的所有click事件
$(selector).off( “click”, "**" ); // 解绑所有代理的click事件元素本身的事件不会被解绑
```
## jQuery的事件对象
event.data 传递给事件处理程序的额外数据
event.currentTarget 等同于this当前DOM对象
event.pageX 鼠标相对于文档左部边缘的位置
event.target 触发事件源,不一定===this
event.stopPropagation() 阻止事件冒泡
event.preventDefault(); 阻止默认行为
event.type 事件类型clickdbclick…
event.which 鼠标的按键类型左1 中2 右3
event.keyCode 键盘按键代码
代码演示:
```html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<script src="jquery-1.11.1.js"></script>
<script>
$(function () {
$(document).on("click", {}, function (event) {
console.log(event.data);
console.log(event.currentTarget);
console.log(event.target);
console.log(event.pageX);
console.log(event.type);
console.log(event.which);
console.log(event.keyCode);
});
})
</script>
</head>
<body>
</body>
</html>
```
上方代码中我们通过event参数获取了点击事件的各种event里的属性。
单击网页后,打印结果为:
20180205_2338.png
**举例**:键盘上对的按键按下时,变色
这个时候就要用到event参数因为要获取event.keyCode才能知道按下的是键盘上的哪个按键。
代码实现:
```html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
.wrap {
width: 400px;
height: 400px;
margin: 100px auto 0;
}
.wrap h1 {
text-align: center;
}
.wrap div {
width: 400px;
height: 300px;
background: pink;
font-size: 30px;
text-align: center;
line-height: 300px;
}
</style>
<script src="jquery-1.11.1.js"></script>
<script>
$(function () {
//需求:在页面上,按键.是哪个颜色的首写字母div就改变为该颜色然后span内容赋值。
//步骤:
//1.给document绑定keyup事件
//2.获取值根据此值给div和span上色和内容
var div = $("#bgChange");
var span = $("#keyCodeSpan");
//绑定事件
$(document).keyup(function (e) { //键盘弹出时,触发事件
//调用方法
setColor(e.keyCode);
});
function setColor(keyCode) {
//alert(e.keyCode);
//2.获取值根据此值给div和span上色和内容
switch (keyCode) {
case 80:
//修改内容pink
setEle("pink", keyCode);
break;
case 66:
//修改内容blue
setEle("blue", keyCode);
break;
case 79:
//修改内容orange
setEle("orange", keyCode);
break;
case 82:
//修改内容red
setEle("red", keyCode);
break;
case 89:
//修改内容yellow
setEle("yellow", keyCode);
break;
default :
alert("系统没有设置该颜色!");
}
function setEle(a, b) {
div.css("background-color", a);
span.text(b);
}
}
//1.给document绑定keyup事件
// $(document).keyup(function (e) {
// //alert(e.keyCode);
// //2.获取值根据此值给div和span上色和内容
// switch (e.keyCode){
// case 80:
// //修改内容pink
// div.css("background-color","pink");
// span.text(e.keyCode);
// break;
// case 66:
// //修改内容blue
// div.css("background-color","blue");
// span.text(e.keyCode);
// break;
// case 79:
// //修改内容orange
// div.css("background-color","orange");
// span.text(e.keyCode);
// break;
// case 82:
// //修改内容red
// div.css("background-color","red");
// span.text(e.keyCode);
// break;
// case 89:
// //修改内容yellow
// div.css("background-color","yellow");
// span.text(e.keyCode);
// break;
// default :
// alert("系统没有设置该颜色!");
// }
// });
})
</script>
</head>
<body>
<div class="wrap">
<h1>按键改变颜色</h1>
<div id="bgChange">
keyCode为
<span id="keyCodeSpan">80</span>
</div>
</div>
</body>
</html>
```
## jQuery 的两大特点
1**链式编程**:比如`.show()`和`.html()`可以连写成`.show().html()`。
链式编程原理return this。
通常情况下,只有设置操作才能把链式编程延续下去。因为获取操作的时候,会返回获取到的相应的值,无法返回 this。
```javascript
end(); // 结束当前链最近的一次过滤操作,并且返回匹配元素之前的状态。
```
2**隐式迭代**:隐式 对应的是 显式。隐式迭代的意思是:在方法的内部会为匹配到的所有元素进行循环遍历,执行相应的方法;而不用我们再进行循环,简化我们的操作,方便我们调用。
如果获取的是多元素的值,大部分情况下返回的是第一个元素的值。
**举例:**五角星评分
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>五角星评分案例</title>
<style>
* {
padding: 0;
margin: 0;
}
.comment {
font-size: 40px;
color: #ff3100;
}
.comment li {
float: left;
cursor: pointer;
}
ul {
list-style: none;
}
</style>
<script src="jquery-1.11.1.js"></script>
<script>
$(function () {
var star_none = '☆'; // 空心五角星
var star_sel = '★'; // 实心五角星
//需求1鼠标放悬停时当前的li和之前所有的li内容全部变为实心五角星移开变为空心。
$(".comment li").on("mouseenter", function () {
//当前五角星,和之前的所有五角星,全部是实心的,其他的为空心
//写法一:分两次写
// $(this).text(star_sel).prevAll("li").text(star_sel);
// $(this).nextAll("li").text(star_none);
//写法二一次性写完但要用到end(),否则会出问题。【重要】
$(this).text(star_sel).prevAll("li").text(star_sel).end().nextAll("li").text(star_none);
});
$(".comment li").on("mouseleave", function () {
//bug如果没有点击过li那么会出现无法清除的现象处理办法就是先判断看看是否有current类
if ($("li.current").length === 0) {
$(".comment li").text(star_none);
} else {
//当鼠标移开的时候谁有current类名那么当前和之前所有的li前部是实心五角星后面的所有li都是空心
$("li.current").text(star_sel).prevAll("li").text(star_sel).end().nextAll("li").text(star_none);
}
});
//需求2鼠标点击那个li当你前li和之前所有的li都变成实心五角星其他变为空心。
$(".comment li").on("click", function () {
//点击哪个li给他加一个类名。清空其他所有的li的类名
$(this).attr("class", "current").siblings("li").removeAttr("class");
});
});
</script>
</head>
<body>
<ul class="comment">
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
</body>
</html>
```
上方代码中注意end的用法很巧妙。
实现效果:
20180206_1100.gif
## each的用法
大部分情况下是不需要使用each方法的因为jQuery的隐式迭代特性。
但是如果要对每个元素做不同的处理这时候就用到了each方法。
格式如下:
```javascript
$(selector).each(function(index,element){});
```
参数解释:
- 参数一:表示当前元素在所有匹配元素中的索引号
- 参数二参数二表示当前元素是js 中的DOM对象而不是jQuery对象
举例:
```html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
li {
width: 100px;
height: 100px;
margin: 20px;
float: left;
list-style: none;
text-align: center;
font: 50px/100px "simsun";
color: white;
background-color: black;
}
</style>
<script src="jquery-1.11.1.js"></script>
<script>
jQuery(function () {
//设置每个不一样的盒子透明度逐渐递增
$("ul li").each(function (index, element) {
$(element).css("opacity", (index + 1) / 10);
console.log(index+"---"+element.tagName);
});
});
</script>
</head>
<body>
<ul>
<li class="aaa1">1</li>
<li class="aaa2">2</li>
<li class="aaa3">3</li>
<li class="aaa4">4</li>
<li class="aaa5">5</li>
<li class="aaa6">6</li>
<li class="aaa7">7</li>
<li class="aaa8">8</li>
<li class="aaa9">9</li>
<li class="aaa10">10</li>
</ul>
</body>
</html>
```
效果如下:
20180206_1110.png
## 多库共存
**多库共存**指的是jQuery占用了 `$``jQuery` 这两个变量。当在同一个页面中引用了 jQuery 库以及其他的库或者其他版本的jQuery库恰好其他的库中也用到了 `$` 或者`jQuery`变量.那么,要保证每个库都能正常使用,就产生了多库共存的问题。
温馨提示:我们可以通过以下方式获取 jQuery 库的版本号。
```javascript
console.log($.fn.jquery); //打印 jQuery 库的版本号
```
**办法一**:让 jQuery 放弃对 `$` 的使用权:
```javascript
$.noConflict();
```
效果如下:
20180206_1126.png
上图中代码中同时包含了两个版本的库。1.11.1版本放弃了对 `$` 的使用权交给了1.8.2版本但是1.11.1版本并没有放弃对 `jQuery`关键字的使用权。
办法二:同时放弃放弃两个符号的使用权,并定义一个新的使用权(如果有三个库时,可以这样用)
```javascript
$.noConflict(true); //返回值是新的关键字
```
效果如下:
20180206_1133.png
## jQuery 的插件机制
jQuery 库虽然功能强大但也不是面面俱到。jQuery 是通过插件的方式,来扩展它的功能:
- 当你需要某个插件的时候你可以“安装”到jQuery上面然后使用。
- 当你不再需要这个插件那你就可以从jQuery上“卸载”它。
### 插件之改变颜色
jQuery的自定义动画方法animate(),在执行动画时,是不支持设置背景色这个属性的。这个时候可以借助`jQuery.color.js`这个插件。
举例:
```html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
div {
width: 100px;
height: 100px;
background-color: blue;
}
</style>
<script src="jquery-1.11.1.js"></script>
<script src="jquery.color.js"></script>
<script>
$(function () {
//点击按钮,改变盒子的宽度和背景色
$("button").on("click", function () {
$("div").animate({"width": 200, "background-color": "red"}, 2000, function () {
alert("动画结束");
});
});
})
</script>
</head>
<body>
<button>变色</button>
<div></div>
</body>
</html>
```
效果:
20180206_1400.gif
上方代码中因为加入了一行插件注意顺序是放在jQuery插件之后
```html
<script src="jquery.color.js"></script>
```
否则的话,在动画执行的过程中,是无法设置背景色的。
### 插件之懒加载
懒加载:当打开一个网页时,只有我看到某个部分,再加载那个部分;而不是一下子全部加载完毕。这样可以优化打开的速度。
比如说,我可以设置一张图片为懒加载,于是,这张图片会等我宠幸到它的时候,它再打开。
代码举例:
```html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
div {
height: 3000px;
background-color: pink;
}
</style>
<script src="jquery-1.11.1.js"></script>
<!--懒加载的使用。第一步:导包(必须在jquery库的下方-->
<script src="jquery.lazyload.js"></script>
<script>
$(function () {
//第二步骤:调用懒加载的方法实现功能。参数的不同,功能也不同。
$("img.lazy").lazyload();
})
</script>
</head>
<body>
<div></div>
<!--需要实现将图片设置为懒加载模式-->
<img class="lazy" data-original="images/01.jpg" width="640" height="480">
</body>
</html>
```