目录
正则语法
. 表示任意字符
在正则表达式中使用\作为转义字符
\. 表示 .
var reg=/\./;
console.log(reg);// /\./
console.log(reg.test("basd"));//false
\\ 表示 \
reg=/\\/;
console.log(reg.test("b.\\"));//true
console.log("b.\\");//b.\
注意:使用构造函数时,由于它的参数是一个字符串,而\是字符串中的转义字符,如果要使用\\则需要使用\\来代替
reg=new RegExp("\\.");
console.log(reg);// /\./
reg=new RegExp("\.");
console.log(reg);// /./
\w | 任意数字,字母,_ [A-z 0-9] |
\W | 除了任意数字,字母,_ [^A-z 0-9] |
\s | 空格 |
\S | 除了空格 |
\d | 任意数字 [0-9] |
\D | 除了数字 [^0-9] |
\b | 单词边界 |
\B | 除了单词边界 |
reg=/\w/;
console.log(reg.test("abc"));//true
console.log(reg.test("!@!@#"));//false
reg=/\s/;
console.log(reg.test("12 3"));//true
console.log(reg.test("123"));//false
console.log(reg.test(" "));//true
reg=/\S/;
console.log(reg.test("123"));//true
console.log(reg.test(" "));//false
console.log(reg.test("12 3"));//true
// 创建一个正则表达式检查一个字符串是否还有单词child
reg=/\bchild\b/;
console.log(reg.test("hello child"));
练习
对用户名去除前边和后边的空格
// 接受一个用户的输入
// var str=prompt("请输入您的用户名");
var str=" he llo ";
// 去除字符串中的空格
// 去除空格就是使用“”来替代空格
console.log(str);
// str=str.replace(/\s/g,"");
// 缺点:会把单词与单词之间的空格一块省去
// 所以有以下方法
// 去除开头的空格
str=str.replace(/^\s*/,"");
// 去除结尾的空格
str=str.replace(/\s*$/,"");
console.log(str);
邮件的正则
// 任意字母数字下划线 . 任意字母数字下划线 @
// 任意字母数字 . 任意字母(2-5位) . 任意字母(2-5位)
// \w{3,} . (\.\w+)* @ [A-z0-9]+ . (\.[A-z]{2,5}){1,2}
var emailReg=/^\w{3,}(\.\w+)*@[A-z0-9]+(\.[A-z]{2,5}){1,2}$/;
var email="abc@abc.com";
console.log(emailReg.test(email));
DOM
简介
全称Document Object Model文档对象模型
文档:整个的HTML网页文档
对象:将网页中的每一个部分转换位了一个对象
模型:使用模型来表示对象之间的关系,这样方便我们获取对象
节点
Node——构成HTML文档最基本的单元
常用节点分为4类
- 文档节点:整个HTML文档
- 元素节点:HTML文档中的HTML标签
- 属性节点:元素的属性
- 文本属性:HTML标签中的文本内容
<body>
<!-- 浏览器已经为我们提供文档节点对象,这个对象的window属性
可以在页面中直接使用,文档节点代表的是整个网页 -->
<button id="btn">我是一个按钮</button>
<script>
// console.log(document);
// 获取到button对象
var btn=document.getElementById("btn");
// 修改按钮的文字
btn.innerHTML="I'm button";
</script>
</body>
事件
用户和浏览器之间的交互行为,比如:点击按钮,鼠标移动,关闭窗口等等
<!-- 这种写法我们称为结构和行为耦合,不方便维护,不推荐使用-->
<button id="btn" onclick="alert('讨厌,点我干嘛');">我是一个按钮</button>
可以为按钮的对应事件绑定处理函数的形式来响应事件,这样当事件被处罚是,其对应的函数将会被调用,像这样为单击事件绑定的函数,我们称为单机响应函数
<body>
<button id="btn">我是一个按钮</button>
<script>
//获取按钮对象
var btn=document.getElementById("btn");
// 绑定单击事件
btn.onclick=function(){
alert("你还点~~~~~~~");
}
</script>
</body>
文档的加载
- 将js代码编写到页面的下部就是未来可以在页面加载完毕以后再执行js代码
- onload事件会在整个页面加载完成之后才出发,为window绑定一个onload事件,这样可以确保我们的代码执行时所有的DOM对象已经加载完毕了
- 浏览器在加载一个页面时,是按照自上向下的顺序加载的,读取到一行就运行一行,如果将script标签写到页面的上边,在代码执行时,页面还没有加载,页面没有加载Dom对象也没有加载,会导致无法获取到Dom对象
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<script>
window.onload = function () {
// 获取id为btn的按钮
var btn = document.getElementById("btn");
// 为按钮绑定一个单机响应函数
btn.onclick = function () {
alert("hello");
};
};
</script>
</head>
<body>
<button id="btn">点我一下</button>
</body>
</html>
dom查询
获取元素节点
- 通过document对象调用
getElementById() | 通过id属性获取一个元素节点对象 |
getElementsByTagName() | 通过标签名获取一组元素节点对象 |
getElementsByName() | 通过name属性获取一组元素节点对象 |
innerHTML用于获取元素内部的HTML代码
如果需要读取元素节点属性,直接使用元素.属性名
例子:元素.id 元素.name 元素.value
注意:class属性不能采用这种方式,读取class属性时需要使用 元素.className
获取元素节点的子节点
- 通过具体的元素节点调用
getElementByTagName()
方法,返回当前节点的指定标签名代节点
childNodes
属性,表示当前节点的所有子节点
childNodes属性会获取包括文本节点在内的所有节点,根据DOM标签间的空白也会当成文本节点
注意:在IE8及以下的浏览器中,不会将空白文本当成子节点
children
属性,可以获取当前元素的所有子元素
firstChild
属性,表示当前节点的第一个子节点(包括空白文本节点)
firstElementChild
获取当前元素的第一个子元素
不支持IE8以下的浏览器
lastChild
属性,表示当前节点的最后一个子节点
获取父节点和兄弟节点
- 通过具体的节点调用
parentNode
属性,表示当前节点的父节点
previousSibling
属性,表示当前节点的前一个兄弟节点
nextSibling
属性,表示当前节点的后一个兄弟节点
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<script>
window.onload = function () {
// 定义一个函数,专门用来为指定元素绑定单击响应函数
// 参数:
// idStr 要绑定单击响应函数的对象的id属性值
// fun 事件的回调函数,当单击元素是,该函数将会被触发
function myClick(idStr, fun) {
var btn = document.getElementById(idStr);
btn.onclick = fun;
}
// 为id为btn01的按钮绑定一个单击响应函数
var btn01 = document.getElementById("btn01");
btn01.onclick = function () {
// alert("hello");
// 查找#bj节点
var bj = document.getElementById("bj");
// 打印bj
// alert(bj);//[object HTMLLIElement]
// innerHTML,通过这个属性可以获取到元素内部的html代码
alert(bj.innerHTML);
};
var btn02 = document.getElementById("btn02");
btn02.onclick = function () {
// 查找所有li节点
// getElementByTagName()可以根据标签名来获取一组元素节点对象
// 这个方法会给我们返回一个类数组对象,所有查询到的元素会封装到对象中
var lis = document.getElementsByTagName("li");
// 打印lis
// alert(lis.length);
// 变量lis
for (var i = 0; i < lis.length; i++) {
alert(lis[i].innerHTML);
}
};
var btn03 = Document.getElementById("btn03");
btn03.onclick = function () {
// 查找name=gender的所有节点
var inputs = document.getElementsByName("gender");
// alert(inputs.length);
for (var i = 0; i < inputs.length; i++) {
// alert(inputs[i].innerHTML);
// innerHTML用于获取元素内部的HTML代码的
// 对于自结束标签,这个属性没有意义
// 如果读取元素节点属性
// 直接使用 元素.属性名
alert(inputs[i].className);
}
};
var btn04 = document.getElementById("btn04");
btn04.onclick = function () {
// 获取id为city都元素
var city = document.getElementById("city");
// 查找#city下所有li节点
var lis = city.getElementsByTagName("li");
for (var i = 0; i < lis.lenth; i++) {
alert(lis[i].innerHTML);
}
};
var btn05 = document.getElementById("btn05");
btn05.onclick = function () {
var city = document.getElementById("city");
// 返回#city的所有子节点
var cns = city.childNodes;
// alert(cns.length);
for (var i = 0; i < cns.length; i++) {
alert(cns[i]);
}
var cns2 = city.children;
alert(cns2.length);
};
var btn06 = document.getElementById("btn06");
btn06.onclick = function () {
// 获取id为phone的元素
var phone = document.getElementById("phone");
// 返回#phone的第一个子节点
phone.childNodes[0];
var fir = phone.firstChild;
alert(fir);
};
//为id为btn07的按钮绑定一个单击响应函数
myClick("btn07", function () {
//获取id为bj的节点
var bj = document.getElementById("bj");
//返回#bj的父节点
var pn = bj.parentNode;
alert(pn.innerHTML);
});
//为id为btn08的按钮绑定一个单击响应函数
myClick("btn08", function () {
//获取id为android的元素
var and = document.getElementById("android");
//返回#android的前一个兄弟节点(也可能获取到空白的文本)
var ps = and.previousSibling;
//previousElementSibling获取前一个兄弟元素,IE8及以下不支持
//var pe = and.previousElementSibling;
alert(ps);
});
//读取#username的value属性值
myClick("btn09", function () {
//获取id为username的元素
var um = document.getElementById("username");
//读取um的value属性值
//文本框的value属性值,就是文本框中填写的内容
alert(um.value);
});
//设置#username的value属性值
myClick("btn10", function () {
//获取id为username的元素
var um = document.getElementById("username");
um.value = "今天天气真不错~~~";
});
//返回#bj的文本值
myClick("btn11", function () {
//获取id为bj的元素
var bj = document.getElementById("bj");
//alert(bj.innerHTML);
//alert(bj.innerText);
//获取bj中的文本节点
/*var fc = bj.firstChild;
alert(fc.nodeValue);*/
alert(bj.firstChild.nodeValue);
});
};
</script>
</head>
<body>
<div class="total">
<div class="inner">
<p>你喜欢哪个城市?</p>
<ul id="city">
<li id="bj">北京</li>
<li>上海</li>
<li>东京</li>
<li>首尔</li>
</ul>
<br />
<br />
<p>你喜欢哪款单机游戏?</p>
<ul id="game">
<li class="rl">红警</li>
<li>实况</li>
<li>极品飞车</li>
<li>魔兽</li>
</ul>
<br />
<br />
<p>你手机的操作系统是?</p>
<ul id="phone">
<li>IOS</li>
<li id="android">Android</li>
<li>Windows Phone</li>
</ul>
</div>
<div class="inner">
gender:
<input class="hello" type="radio" name="gender" value="male" />
Male
<input class="hello" type="radio" name="gender" value="female" />
Female
<br />
<br />
name:
<input type="text" name="name" id="username" value="abcde" />
</div>
</div>
<div id="btnList">
<div><button id="btn01">查找#bj节点</button></div>
<div><button id="btn02">查找所有li节点</button></div>
<div><button id="btn03">查找name=gender的所有节点</button></div>
<div><button id="btn04">查找#city下所有li节点</button></div>
<div><button id="btn05">返回#city的所有子节点</button></div>
<div><button id="btn06">返回#phone的第一个子节点</button></div>
<div><button id="btn07">返回#bj的父节点</button></div>
<div><button id="btn08">返回#android的前一个兄弟节点</button></div>
<div><button id="btn09">返回#username的value属性值</button></div>
<div><button id="btn10">设置#username的value属性值</button></div>
<div><button id="btn11">返回#bj的文本值</button></div>
</div>
</body>
</html>
练习(轮播图)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
/* 去除原本样式 */
* {
margin: 0;
padding: 0;
}
/* 原本像素1000*2000,现在都除以2 */
img {
width: 200px;
height: 400px;
}
#outer {
width: 200px;
/* 垂直居中 */
margin: 50px auto;
/* 四个方向都加边界 */
padding: 10px;
background-color: blanchedalmond;
/* 设置文本居中 */
text-align: center;
}
</style>
<script>
window.onload = function () {
// 点击按钮切换图片
// 获取两个按钮
var prev = document.getElementById("prev");
var next = document.getElementById("next");
// 要切换为两个按钮绑定单击响应函数
var img=document.getElementsByTagName("img")[0];
// 创建一个数组,用来保存图片的路径
var imgArr=["img/1.jpg","img/2.jpg","img/3.jpg","img/4.jpg","img/5.jpg"];
var index=0;
// 切换图片就是修改img的src属性
// 获取id为info的p元素
var info=document.getElementById("info");
// 要修改一个元素的属性元素 元素.属性=属性值
// 分别为两个按钮绑定单击响应函数
prev.onclick = function () {
// 切换到下一张,索引自减
index--;
// 判断index是否小于0
if(index<0){
index=imgArr.length-1;
}
img.src=imgArr[index];
// 当点击按钮以后,重新设置信息
// 设置提示文字
info.innerHTML="一共"+imgArr.length+"张图片,当前第"+(index+1)+"张";
};
next.onclick = function () {
index++;
if(index>imgArr.length-1){
index=0;
}
img.src=imgArr[index];
// 设置提示文字
info.innerHTML="一共"+imgArr.length+"张图片,当前第"+(index+1)+"张";
};
};
</script>
</head>
<body>
<div id="outer">
<p id="info">一共5张图片,当前第1张</p>
<img src="img/1.jpg" alt="1" />
<button id="prev">上一张</button>
<button id="next">下一张</button>
</div>
</body>
</html>
效果图: