一、JavaScript 和 html 代码的结合方式
1. 第一种方式
只需要在 head 标签中,或者在 body 标签中, 使用 script 标签 来书写 JavaScript 代码
<!DOCTYPE html>
<html lang="en">
<head> <meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript">
// alert 是 JavaScript 语 言 提 供 的 一 个 警 告 框 函 数 。
// 它 可 以 接 收 任 意 类 型 的 参 数 , 这 个 参 数 就 是 警 告 框 的 提 示 信 息 alert("hello javaScript!");
</script>
</head>
<body>
</body>
</html>
2. 第二种方式
使用 script 标签引入 单独的 JavaScript 代码文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!- 现在需要使用 script 引入外部的 js 文件来执行 src 属性专门用来引入 js 文件路径(可以是相对路径,也可以是绝对路径)
script 标签可以用来定义 js 代码,也可以用来引入 js 文件 但是,两个功能二选一使用。不能同时使用两个功能
--> <script type="text/javascript" src="1.js">
</script>
<script type="text/javascript">
alert("国哥现在可以帅了");
</script> </head> <body>
</body>
</html>
二、变量
什么是变量?变量是可以存放某些值的内存的命名。
JavaScript 的变量类型:
- 数值类型: number
- 字符串类型: string
- 对象类型: object
- 布尔类型: boolean
- 函数类型: function
JavaScript 里特殊的值: undefined 未定义,所有 js 变量未赋于初始值的时候,默认值都是 undefined. null 空值 NaN 全称是:NotaNumber。非数字。非数值
JS 中的定义变量格式: var 变量名; var 变量名 = 值;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript">
var i;
// alert(i);
// undefined i = 12;
// typeof() 是 JavaScript 语 言 提 供 的 一 个 函 数 。
// alert( typeof(i) ); // number
i = "abc";
// 它 可 以 取 变 量 的 数 据 类 型 返 回 // alert( typeof(i) );
// String
var a = 12; var b = "abc";
alert( a * b ); // NaN是 非 数 字 , 非 数 值 。
</script>
</head>
<body>
</body>
</html>
三、常见运算
1. 关系(比较)运算
- 等于: == 等于是简单的做字面值的比较
- 全等于: === 除了做字面值的比较之外,还会比较两个变量的数据类型
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript">
var a = "12";
var b = 12;
alert( a == b ); // true
alert( a === b ); // false
</script> </head> <body>
</body> </html>
2. 逻辑运算
- 且运算: &&、
- 或运算:|| 、
- 取反运算: !
在 JavaScript 语言中,所有的变量,都可以做为一个 boolean 类型的变量去使用。
0 、null、 undefined、””(空串) 都认为是 false;
注意:
- && 且运算。 有两种情况: 第一种:当表达式全为真的时候。返回最后一个表达式的值。 第二种:当表达式中,有一个为假的时候。返回第一个为假的表达式的值
- || 或运算 第一种情况:当表达式全为假时,返回最后一个表达式的值 第二种情况:只要有一个表达式为真。就会把回第一个为真的表达式的值
- 并且 && 与运算 和 ||或运算 有短路。 短路就是说,当这个&&或||运算有结果了之后 。后面的表达式不再执行 */
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript">
var a = 0;
if (a) {
alert(" 零 为 真 ");
} else {
alert(" 零 为 假 ");
}
var b = null;
if (b) {
alert("null为 真 ");
} else {
alert("null为 假 ");
}
var c = undefined;
if (c) {
alert("undefined为 真 ");
} else {
alert("undefined为 假 ");
}
var d = "";
if (d) {
alert(" 空 串 为 真 ");
} else {
alert(" 空 串 为 假 ");
}
var a = "abc";
var b = true;
var d = false;
var c = null;
alert( a && b );//true
alert( b && a );//true
alert( a && d ); // false
alert( a && c ); // null
alert( d || c ); // null
alert( c|| d ); //false
alert( a || c ); //abc
alert( b || c ); //true
</script>
</head>
<body>
</body>
</html>
四、数组
1. 数组定义方式
- var 数组名 =[]; //空数组
- var 数组名 =[1,’abc’,true]; // 定义数组同时赋值元素
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript">
var arr = [true,1]; //定 义 数 组
// alert( arr.length ); // 2
arr[0] = 12;
// alert( arr[0] );//12
// javaScript语 言 中 的 数 组 , 只 要 我 们 通 过 数 组 下 标 赋 值 , 那 么 最 大 的 下 标 值 , 就 会 自 动 的 给 数 组 做 扩 容 操 作 。
arr[2] = "abc";
alert(arr.length); //3
// alert(arr[1]);// undefined
// 数 组 的 遍 历
for (var i = 0; i < arr.length; i++){
alert(arr[i]);
}
</script> </head>
<body>
</body> </html>
五、函数
函数的二种定义方式
1. 第一种定义方式
可以使用 function 关键字来定义函数
function 函数名(形参列表){
函数体
}
在 JavaScript 语言中,如何定义带有返回值的函数? 只需要在函数体内直接使用 return 语句返回值即可!
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript">
// 定 义 一 个 无 参 函 数
function fun(){
alert("无参函数 fun()被调用了");
}
// 函 数 调 用 === 才 会 执 行
fun();
function fun2(a ,b) {
alert("有参函数 fun2()被调用了 a=>" + a + ",b=>"+b);
}
fun2(12,"abc");
//定 义 带 有 返 回 值 的 函 数
function sum(num1,num2) {
var result = num1 + num2;
return result;
}
alert( sum(100,50) );
</script> </head> <body>
</body> </html>
2. 第二种定义方式
var 函数名 =function(形参列表){
函数体
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript">
var fun = function () {
alert("无参函数");
}
fun();
var fun2 = function (a,b) {
alert("有参函数 a=" + a + ",b=" + b);
}
fun2(1,2);
var fun3 = function (num1,num2) {
return num1 + num2;
}
alert( fun3(100,200) );
</script>
</head>
<body>
</body>
</html>
注意:在 Java 中函数允许重载。但是在 JS 中函数的重载会直接覆盖掉上一次的定义
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript">
function fun() {
alert("无参函数 fun()");
}
function fun(a,b) {
alert("有参函数 fun(a,b)");
}
fun();
</script>
</head>
<body>
</body>
</html>
3. 函数的 arguments 隐形参数
只在 function 函数内,就是在 function 函数中不需要定义,但却可以直接用来获取所有参数的变量。我们管它叫隐形参数
隐形参数特别像 java 基础的可变长参数一样。
public void fun(Object...args);
,可变长参数其他是一个数组
那么 js 中的隐形参数也跟 java 的可变长参数一样,操作类似数组
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript">
function fun(a) {
alert( arguments.length );// 可 看 参 数 个 数
alert( arguments[0] );
alert( arguments[1] );
alert( arguments[2] );
alert("a = " + a);
for (var i = 0; i < arguments.length; i++){
alert( arguments[i] );
}
alert("无参函数 fun()");
}
fun(1,"ad",true);
//需 求 : 要 求 编 写 一 个 函 数 。 用 于 计 算 所 有 参 数 相 加 的 和 并 返 回
function sum(num1,num2) {
var result = 0;
for (var i = 0; i < arguments.length; i++) {
if (typeof(arguments[i]) == "number") {
result += arguments[i]; }
}
return result;
}
alert( sum(1,2,3,4,"abc",5,6,7,8,9) );
</script>
</head>
<body>
</body>
</html>
六、JS 中的自定义对象
1. Object 形式的自定义对象
对象的定义:
var 变量名 =newObject(); // 对象实例(空对象)
变量名.属性名 = 值; // 定义一个属性
变量名.函数名 =function(){} // 定义一个函数
对象的访问:
变量名.属性 / 函数名();
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript">
var obj = new Object();
obj.name = "马达";
obj.age = 18;
obj.fun = function () {
alert("姓名:" + this.name + " , 年龄:" + this.age);
}
// 对象的访问
// alert(obj.name);
obj.fun();
</script>
</head>
<body>
</body>
</html>
2. {}花括号形式的自定义对象
对象的定义:
var 变量名 ={ // 空对象
属性名:值, // 定义一个属性
属性名:值, // 定义一个属性
函数名:function(){} // 定义一个函数
};
对象的访问:
变量名.属性 / 函数名();
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript">
var obj = {
name: "马达",
age: 18,
fun: function () {
alert("姓名:" + this.name + " , 年龄:" + this.age);
}
};
// alert(obj.name);
obj.fun();
</script>
</head>
<body>
</body>
</html>
七、JS中的事件
什么是事件?事件是电脑输入设备与页面进行交互的响应,称之为事件
1. 常用的事件
- onload 加载完成事件: 页面加载完成之后,常用于做页面 js 代码初始化操作
- onclick 单击事件: 常用于按钮的点击响应操作
- onblur失去焦点事件: 常用用于输入框失去焦点后验证其输入内容是否合法
- onchange内容发生改变事件: 常用于下拉列表和输入框内容发生改变后操作
- onsubmit 表单提交事件: 常用于表单提交前,验证所有表单项是否合法
事件的注册又分为静态注册和动态注册两种
什么是事件的注册(绑定)?
其实就是告诉浏览器,当事件响应后要执行哪些操作代码,叫事件注册或事件绑定。
2. 静态注册事件
通过 html 标签的事件属性直接赋于事件响应后的代码,这种方式我们叫静态注册
3. 动态注册事件
是指先通过 js 代码得到标签的 dom 对象,然后再通过 dom对象.事件名 =function(){} 这种形式赋于事件
响应后的代码,叫动态注册
动态注册基本步骤:
- 获取标签对象
- 标签对象.事件名 =fucntion(){}
4. onload 加载完成事件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript">
// function onLoadFun() {
// alert("静态注册onload事件");
// }
// 这个是动态注册,固定的写法
window.onload = function () {
alert("动态注册onload事件");
}
</script>
</head>
<!--静态注册onload事件,这个事件是在浏览器解析完页面之后自动触发的事件,里面自定义的函数
<body onload="onLoadFun()">
-->
</body>
</html>
5. onclick 单击事件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript">
// function onclickFun() {
// alert("静态注册onclick事件");
// }
// 动态注册
window.onload = function () {
// 1. 获取标签对象
// document是JS语言提供的一个对象
// 通过属性的id来获取标签对象
var b = document.getElementById("b01");
// alert(b);
// 2. 通过标签对象.事件名 = function (){}
b.onclick = function () {
alert("动态注册onclick事件");
}
}
</script>
</head>
<body>
<!-- 静态注册onclick-->
<button onclick="onclickFun();">按钮1</button>
<button id="b01">按钮2</button>
</body>
</html>
6. onblur失去焦点事件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript">
// 静 态 注 册 失 去 焦 点 事 件
function onblurFun() {
// console 是 控 制 台 对 象 , 是 由 JavaScript语 言 提 供 , 专 门 用 来 向 浏 览 器 的 控 制 器 打 印 输 出 , 用 于 测 试 使 用
// log()
console.log("静态注册失去焦点事件");
}
// 动态注册
window.onload = function () {
//1 获 取 标 签 对 象
var passwordObj = document.getElementById("password");
// alert(passwordObj);
// 2 通 过 标 签 对 象 . 事 件 名 = function(){};
passwordObj.onblur = function () {
console.log("动态注册失去焦点事件");
}
}
</script>
</head>
<body>
用户名:<input type="text" onblur="onblurFun();"><br/>
密码:<input id="password" type="text"><br/>
</body>
</html>
7. onchange内容发生改变事件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript">
function onchangeFun() {
alert("电影改变");
}
window.onload = function () {
var sObj = document.getElementById("s01");
sObj.onchange = function () {
alert("书籍已经改变");
}
}
</script>
</head>
<body>
<!--静态注册事件-->
请选择你喜欢看的电影
<select onchange="onchangeFun();">
<option>--电影--</option>
<option>盗墓笔记</option>
<option>黑客帝国</option>
<option>千与千寻</option>
</select>
<br>
请选择你喜欢看的书籍
<select id="s01">
<option>--书籍--</option>
<option>平凡的世界</option>
<option>小王子</option>
<option>解忧杂货店</option>
</select>
</body>
</html>
8. onsubmit 表单提交事件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript">
// 静态注册表单提交事务
function onsubmitFun() {
alert("提交不合法");
return false;
}
// 动态注册表单提交事务
window.onload = function () {
var formObj = document.getElementById("form01");
formObj.onsubmit = function () {
alert("动态注册提交不合法");
return false;
}
}
</script>
</head>
<body>
<!--return false 可 以 阻 止 表 单 提 交-->
<form action="http://localhost:8080" method="get" onsubmit="return onsubmitFun();">
<input type="submit" value="静态注册"/>
</form>
<form action="http://localhost:8080" id="form01">
<input type="submit" value="动态注册"/>
</form>
</body>
</html>
八、DOM模型
DOM 全称是 DocumentObjectModel 文档对象模型
就是把文档中的标签,属性,文本,转换成为对象来管理。 那么 它们是如何实现把标签,属性,文本转换成为对象来管理呢
1. Document 对象
Document 对象的理解:
- Document 它管理了所有的 HTML 文档内容
- document 它是一种树结构的文档,有层级关系
- 它让我们把所有的标签 都 对象化
- 我们可以通过 document 访问所有的标签对象
2. Document 对象中的方法介绍
- document.getElementById(elementId) 通过标签的 id 属性查找标签 dom 对象,elementId 是标签的 id 属性值
- document.getElementsByName(elementName) 通过标签的 name 属性查找标签 dom 对象,elementName 标签的 name 属性值
- document.getElementsByTagName(tagname) 通过标签名查找标签 dom 对象。tagname 是标签名
- document.createElement( tagName) 方法,通过给定的标签名,创建一个标签对象。tagName 是要创建的标签名
注意:
document 对象的三个查询方法,如果有 id 属性,
优先使用 getElementById 方法来进行查询 如果没有 id 属性,则优先使用 getElementsByName 方法来进行查询 如果 id 属性和 name 属性都没有最后再按标签名查 getElementsByTagName
以上三个方法,一定要在页面加载完成之后执行,才能查询到标签对象
3. getElementById 方法
需 求 : 当用户点击了校验按 钮 , 要 获 取 输 出 框 中 的 内 容 。 然 后 验 证 其 是 否 合 法 。
验 证 的 规 则 是 : 必 须 由 字 母、数 字、下 划 线 组 成 。 并 且 长 度 是 5 到 12 位
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript">
function onClick() {
// 1 当我们要 操 作 一 个 标 签 的 时 候 , 一 定 要 先 获 取 这 个 标 签 对 象 。
var usernameObj = document.getElementById("username");
// [object HTMLInputElement] 就是dom对象
var usernameText = usernameObj.value;
//如 何 验 证 字 符 串 , 符 合 某 个 规 则 , 需 要 使 用 正 则 表 达 式 技 术
var patt = /^w{5,12}$/;
/*
test() 方 法 用 于 测 试 某 个 字 符 串 , 是 不 是 匹 配 我 的 规 则 ,
匹配就返回true,否则返回false
*/
var usernameSpanObj = document.getElementById("usernameSpan");
// innerHTML表 示 起 始 标 签 和 结 束 标 签 中 的 内 容
// innerHTML 这个属性可读,可写
usernameSpanObj.innerHTML = "你好!";
if (patt.test(usernameText)) {
alert("用户名合法");
usernameSpanObj.innerHTML = "用户名合法!";
}else{
alert("用户名不合法");
usernameSpanObj.innerHTML = "用户名不合法!";
}
}
</script>
</head>
<body>
用户名:<input type="text" id="username" value="md">
<span id="usernameSpan" style="color: red;">
</span>
<button onclick="onClick()">校验</button>
</body>
</html>
4. getElementsByName 方法
让 所 有 复 选 框 都 选 中
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript">
function checkAll() {
// document.getElementsByName("hobby"),是根据指定的name来查询返回多个标签对象集合
// 这个集合的操作和数组一样,集合中每个元素都是dom对象
// 这个集合中元素的顺序是按照html页面的上下顺序
var hobbies = document.getElementsByName("hobby");
// checked表示复选框的选中状态,选中是true
for (var i = 0; i < hobbies.length; i++){
hobbies[i].checked = true;
}
}
// 全不选
function checkNo() {
var hobbies = document.getElementsByName("hobby");
for (var i = 0; i < hobbies.length; i++){
hobbies[i].checked = false;
}
}
// 反选
// 这里用的取反操作
function checkReverse() {
var hobbies = document.getElementsByName("hobby");
for (var i = 0; i < hobbies.length; i++){
hobbies[i].checked = !hobbies[i].checked;
}
}
</script>
</head>
<body>
兴趣爱好:
<input type="checkbox" name="hobby" value="c" checked="checked"> C
<input type="checkbox" name="hobby" value="java"> Java
<input type="checkbox" name="hobby" value="python"> Python
<br>
<button onclick="checkAll()">全选</button>
<button onclick="checkNo()">全部选</button>
<button onclick="checkReverse()">反选</button>
</body>
</html>
5. getElementsByTagName 方法
也是全选操作
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript">
function checkAll() {
// document.getElementsByTagName("input"),
// 是根据指定标签名来查询返回多个标签对象集合
// 这个集合的操作和数组一样,集合中每个元素都是dom对象
// 这个集合中元素的顺序是按照html页面的上下顺序
var hobbies = document.getElementsByTagName("input");
for (var i = 0; i < hobbies.length; i++){
hobbies[i].checked = true;
}
}
</script>
</head>
<body>
兴趣爱好:
<input type="checkbox" name="hobby" value="c" checked="checked"> C
<input type="checkbox" name="hobby" value="java"> Java
<input type="checkbox" name="hobby" value="python"> Python
<br>
<button onclick="checkAll()">全选</button>
</body>
</html>
6. createElement 方法
使用js代码来创建html标签
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript">
window.onload = function () {
// 在内存中有<div> </div>
var divObj = document.createElement("div");
// 有一个文本节点对象 你好,山丘
var textNodeObj = document.createTextNode("你好,山丘");
// <div>你好,山丘 </div>
divObj.appendChild(textNodeObj);
// 添加子元素,在body里
document.body.appendChild(divObj);
}
</script>
</head>
<body>
</body>
</html>
7. 节点常用的属性和方法
方法:
- 通过具体的元素节点调用 getElementsByTagName() 方法,获取当前节点的指定标签名孩子节点
- appendChild(ChildNode) 方法,可以添加一个子节点,ChildNode 是要添加的孩子节点
属性:
- childNodes 属性,获取当前节点的所有子节点
- firstChild 属性,获取当前节点的第一个子节点 ,会匹配换行和空格信息 ,使用firstElementChild 则不会匹配换行和空格信息,其他的类似
- lastChild 属性,获取当前节点的最后一个子节点
- parentNode 属性,获取当前节点的父节点
- nextSibling 属性,获取当前节点的下一个节点
- previousSibling 属性,获取当前节点的上一个节点,previousElementSibling这个不包括换行和空格
- className 用于获取或设置标签的 class 属性值
- innerHTML 属性,表示获取/设置起始标签和结束标签中的内容
- innerText 属性,表示获取/设置起始标签和结束标签中的文本
8. DOM练习
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript">
window.onload = function () {
// 1. 查找#bj节点
document.getElementById("b01").onclick = function () {
var bjObj = document.getElementById("bj");
alert(bjObj.innerHTML);
};
// 2. 查找所有 li 节点
var but02Ele = document.getElementById("b02");
but02Ele.onclick = function () {
var lis = document.getElementsByTagName("li");
alert(lis.length);
};
// 3. 查找 name=gender 的所有节点
var but03Ele = document.getElementById("b03");
but03Ele.onclick = function () {
var genders = document.getElementsByName("gender");
alert(genders.length);
};
// 4. 查找#city 下所有 li 节点
var but04Ele = document.getElementById("b04");
but04Ele.onclick = function () {
var lis = document.getElementById("city").getElementsByTagName("li");
alert(lis.length);
};
// 5. 返回#city 的所有子节点
var but05Ele = document.getElementById("b05");
but05Ele.onclick = function () {
var obj = document.getElementById("city").childNodes;
console.log(obj.length);
for (var i = 0; i < obj.length; i++){
console.log(obj[i]);
}
};
// 6. 返回#phone 的第一个子节点
var but06Ele = document.getElementById("b06");
but06Ele.onclick = function () {
var objphone = document.getElementById("phone").firstElementChild;
alert(objphone.innerHTML);
};
// 7. 返回#bj 的父节点
var but07Ele = document.getElementById("b07");
but07Ele.onclick = function () {
var objbj = document.getElementById("bj").parentNode;
alert(objbj.innerHTML);
};
// 8. 返回#ML 的前一个兄弟节点
var but08Ele = document.getElementById("b08");
but08Ele.onclick = function () {
alert(document.getElementById("ML").previousElementSibling.innerHTML);
};
// 9. 返回#username 的 value 属性值
var but09Ele = document.getElementById("b09");
but09Ele.onclick = function () {
alert(document.getElementById("username").value);
};
// 10. 设置#username 的 value 属性值
var but10Ele = document.getElementById("b10");
but10Ele.onclick = function () {
document.getElementById("username").value = "山丘";
};
// 11. 返回#city 的文本值
var but11Ele = document.getElementById("b11");
but11Ele.onclick = function () {
alert(document.getElementById("city").innerText);
};
};
</script>
</head>
<body>
<div id="total">
<div class="inner">
<p>
你喜欢那个城市?
</p>
<ul id="city">
<li id="bj">北京</li>
<li>南京</li>
<li>东京</li>
<li>上海</li>
</ul>
<br>
<p>
你喜欢那款游戏?
</p>
<ul id="game">
<li id="wz">王者荣耀</li>
<li>飞车</li>
<li>联盟</li>
<li>DNF</li>
</ul>
<br>
<p>
你的手机是什么品牌?
</p>
<ul id="phone">
<li>华为</li>
<li id="ML">小米</li>
<li>oppo</li>
<li>一加</li>
</ul>
</div>
<div class="inner">
gender:
<input type="radio" name="gender" value="male">
Male
<input type="radio" name="gender" value="female">
Female
<br>
name:
<input type="text" name="name" id="username" value="md">
</div>
</div>
<div id="btuList">
<div><button id="b01">查找#bj节点</button></div>
<div><button id="b02">查找所有 li 节点</button></div>
<div><button id="b03">查找 name=gender 的所有节点</button></div>
<div><button id="b04">查找#city 下所有 li 节点</button></div>
<div><button id="b05">返回#city 的所有子节点</button></div>
<div><button id="b06">返回#phone 的第一个子节点</button></div>
<div><button id="b07">返回#bj 的父节点</button></div>
<div><button id="b08">返回#android 的前一个兄弟节点</button></div>
<div><button id="b09">返回#username 的 value 属性值</button></div>
<div><button id="b10">设置#username 的 value 属性值</button></div>
<div><button id="b11">返回#city 的文本值</button></div>
</div>
</body>
</html>