1. 属性操作
概念: JS有两种方式可以操作HTML属性:
- 直接控制:
obj.属性名/obj["属性名"]:获取属性,若属性不存在返回undefined。obj.属性名 = "属性值"/obj["属性名"] = "属性值":设置该属性。
- DOM控制:
obj.getAttribute("属性名"):获取属性,若属性不存在返回null。obj.setAttribute("属性名", "属性值"):设置该属性。obj.removeAttribute("属性名"):删除该属性。
<label>
<input id="test-ipt" value="111"/>
</label>
<br/>
<button id="get-btn" type="button">简单获取属性</button>
<br/>
<button id="set-btn" type="button">简单设置属性</button>
<br/>
<script type="text/javascript">
window.onload = () => {
let testIpt = document.querySelector("#test-ipt");
document.querySelector("#get-btn").onclick = () => {
console.log(testIpt.value);
console.log(testIpt["value"]);
console.log(testIpt["aaa"]);
};
document.querySelector("#set-btn").onclick = () => {
testIpt.value = "222";
testIpt["value"] = "333";
};
};
</script>
<button id="get-btn" type="button">DOM方式获取属性</button>
<br/>
<button id="set-btn" type="button">DOM方式设置属性</button>
<br/>
<button id="delete-btn" type="button">DOM方式删除属性</button>
<br/>
<script type="text/javascript">
window.onload = () => {
let testIpt = document.querySelector("#test-ipt");
document.querySelector("#get-btn").onclick = () => {
console.log(testIpt.getAttribute("value"));
console.log(testIpt.getAttribute("aaa"));
};
document.querySelector("#set-btn").onclick = () => {
testIpt.setAttribute("value", "222");
};
document.querySelector("#delete-btn").onclick = () => {
testIpt.removeAttribute("value");
};
};
</script>
2. 样式操作
概念: JS支持直接对元素的CSS样式进行操作:
obj["style"]["属性"] = "属性值":设置obj的指定样式。obj["style"]["属性"]:获取obj的指定行间样式。obj["currentStyle"]["属性"]:获取obj的指定样式(包括非行间),IE支持的写法。window.getComputedStyle(obj)["属性"]:获取obj的指定样式(包括非行间),非IE支持的写法。
<style type="text/css">
#text-sec {
height: 200px;
background-color: red;
}
</style>
</head>
<body>
<section id="text-sec" style="width:100px"></section>
<button id="set-inline-style-btn" type="button">设置样式</button>
<br/>
<button id="get-inline-style-btn" type="button">获取行间样式</button>
<br/>
<button id="get-style-btn" type="button">获取所有位置的样式</button>
<br/>
<script type="text/javascript">
window.onload = function () {
let testSec = document.querySelector("#text-sec");
document.querySelector("#set-inline-style-btn").onclick = () => {
testSec["style"]["width"] = "1000px";
};
document.querySelector("#get-inline-style-btn").onclick = () => {
console.log(testSec["style"]["width"]);
console.log(testSec["style"]["height"]);
};
document.querySelector("#get-style-btn").onclick = () => {
console.log(css(testSec, "width"));
console.log(css(testSec, "height"));
};
function css(obj, key) {
return obj["currentStyle"] ? obj["currentStyle"][key] : getComputedStyle(obj)[key];
}
};
</script>
3. 元素操作
概念:
- 静态获取:
obj.querySelector("selector"):根据CSS选择器获取一个元素。obj.querySelectorAll("selector"):根据CSS选择器获取多个元素。
- 动态获取:
obj.getElementById("id"):通过id获取某个元素,不加#。obj.getElementsByTagName("tagName"):通过标签名获取元素集合。obj.getElementsByName("name"):通过元素的name属性获取元素集合。
- 操作元素:
document.createElement("li"):通过标签名凭空创造一个DOM元素。父.appendChild(子):若子本身存在则表示移动,若子不存在则表示追加。父.insertBefore(子A, 子B):将子A插入到子B之前。父.removeChild(子):从父中删除子。
<ul id="item-list">
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>
<button id="by-static-btn" type="button">静态获取元素</button>
<br/>
<button id="by-dynamic-btn" type="button">动态获取元素</button>
<br/>
<script type="text/javascript">
onload = () => {
document.querySelector("#by-static-btn").onclick = () => {
let itemList = document.querySelector("#item-list");
let lis = itemList.querySelectorAll("li");
console.log(lis.length);
for (let i = 0, j = lis.length; i < j; i++) {
console.log("lis.length: " + lis.length);
itemList.innerHTML += `<li>${lis.length + i + 1}</li>`
}
};
document.querySelector("#by-dynamic-btn").onclick = () => {
let itemList = document.getElementById("item-list");
let lis = itemList.getElementsByTagName("li");
for (let i = 0, j = lis.length; i < j; i++) {
console.log("lis.length: " + lis.length);
itemList.innerHTML += `<li>${lis.length + i + 1}</li>`
}
};
};
</script>
<ul id="item-list">
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>
<button id="append-btn" type="button">追加一个子元素</button>
<br/>
<button id="move-btn" type="button">移动一个子元素</button>
<br/>
<button id="insert-btn" type="button">在头部插入一个子元素</button>
<br/>
<button id="delete-btn" type="button">删除最后一个子元素</button>
<br/>
<script type="text/javascript">
window.onload = () => {
let itemList = document.querySelector("#item-list");
document.querySelector("#append-btn").onclick = () => {
let newLi = document.createElement("li");
newLi.innerText = "5";
itemList.append(newLi);
};
document.querySelector("#move-btn").onclick = () => {
let firstLi = document.querySelector("#item-list li:first-child");
itemList.append(firstLi);
};
document.querySelector("#insert-btn").onclick = () => {
let newLi = document.createElement("li");
newLi.innerText = "0";
itemList.insertBefore(newLi, itemList.querySelectorAll("li")[0]);
};
document.querySelector("#delete-btn").onclick = () => {
let lastLi = document.querySelector("#item-list li:last-child");
itemList.removeChild(lastLi);
};
}
</script>
4. 表格操作
概念:
- 表格专用属性:
tBodies:快速获取表格的<tbody>集合。rows:快速获取表格的<tr>集合。cells:快速获取表格的<td>或<th>集合。
str.search(c):在字符串str中查找c的位置,不存在返回-1。str.split(a):将字符串str按照a来拆分,返回一个字符数组。
查寻目标和表格中内容完全一致(忽略大小写),将背景高亮显示。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style type="text/css">
#user-tab, td, th {
width: 300px;
border: 1px solid red;
border-collapse: collapse;
text-align: center;
}
</style>
</head>
<body>
<section>
<label><input id="search-ipt"/></label>
<button id="search-btn" type="button">按姓名搜索</button>
</section>
<hr/>
<section>
<table id="user-tab">
<tr>
<th>编号</th>
<th>姓名</th>
</tr>
<tr>
<td>001</td>
<td>zhaosi</td>
</tr>
<tr>
<td>002</td>
<td>liuneng</td>
</tr>
</table>
</section>
<script type="text/javascript">
/*需求:查寻目标和表格中内容完全一致(忽略大小写),将背景高亮显示。*/
window.onload = () => {
//抓到按钮,点击按钮后的一系列操作
document.querySelector("#search-btn").onclick = () => {
// 抓到文本框(当前写入的文本)
let searchIpt = document.querySelector("#search-ipt");
// 从这个集合的0号元素开始抓到<tbody>框
let tbody = document.querySelector("#user-tab").tBodies[0];
//获取<tbody>中的所有<tr>的内容
let trs = tbody.rows;
//集合遍历所有的<tr>,并且从第二行开始
for (let i = 1, j = trs.length; i < j; i++) {
//每次点击搜索之后文本框直接变成空的
trs[i]["style"]["backgroundColor"] = "";
//第二行<tr>第二个字段的内容赋值,并且忽略大小写
let nameFromTab = trs[i].cells[1].innerText.toUpperCase();
//获取当前文本框的内容,忽略大小写
let nameFromIpt = searchIpt["value"].toUpperCase();
//如果已存在的姓名和文本框的输入的名字匹配然后这行高亮
if (nameFromTab === nameFromIpt) {
trs[i]["style"]["backgroundColor"] = "gray";
}
}
}
};
</script>
</body>
</html>
模糊查寻指定内容(忽略大小写),将背景高亮显示。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style type="text/css">
#user-tab, td, th {
width: 300px;
border: 1px solid red;
border-collapse: collapse;
text-align: center;
}
</style>
</head>
<body>
<section>
<label><input id="search-ipt"/></label>
<button id="search-btn" type="button">按姓名搜索</button>
</section>
<hr/>
<section>
<table id="user-tab">
<tr>
<th>编号</th>
<th>姓名</th>
</tr>
<tr>
<td>001</td>
<td>zhaosi</td>
</tr>
<tr>
<td>002</td>
<td>liuneng</td>
</tr>
</table>
</section>
<script type="text/javascript">
/*需求:模糊查寻指定内容(忽略大小写),将背景高亮显示。*/
window.onload = () => {
//抓到按钮,点击按钮后的一系列操作
document.querySelector("#search-btn").onclick = () => {
// 抓到文本框(当前写入的文本)
let searchIpt = document.querySelector("#search-ipt");
// 从这个集合的0号元素开始抓到<tbody>框
let tbody = document.querySelector("#user-tab").tBodies[0];
//获取<tbody>中的所有<tr>的内容
let trs = tbody.rows;
//如果文本框的值是字符串空的或者是空的 直接返回
if (searchIpt["value"] === "" || searchIpt["value"] == null) {
return;
}
//集合遍历所有的<tr>,并且从第二行开始
for (let i = 1, j = trs.length; i < j; i++) {
//每次点击搜索之后文本框直接变成空的
trs[i]["style"]["backgroundColor"] = "";
//第二行<tr>第二个字段的内容赋值,并且忽略大小写
let nameFromTab = trs[i].cells[1].innerText.toUpperCase();
//获取当前文本框的内容,忽略大小写
let nameFromIpt = searchIpt["value"].toUpperCase();
//用以拥有的内容比较 文本框需要搜索的内容如果不存在就返回空,存在的话就变成灰色
if (nameFromTab.search(nameFromIpt) !== -1) {
trs[i]["style"]["backgroundColor"] = "gray";
}
}
}
};
</script>
</body>
</html>
按照空格拆分后,模糊查寻指定内容(忽略大小写),将背景高亮显示。
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style type="text/css">
#user-tab, td, th {
width: 300px;
border: 1px solid red;
/*单元格边框合并*/
border-collapse: collapse;
/*文本对齐方式:居中*/
text-align: center;
}
</style>
</head>
<body>
<section>
<label><input id="search-ipt"/></label>
<button id="search-btn" type="button">按姓名搜索</button>
</section>
<hr/>
<section>
<table id="user-tab">
<tr>
<th>编号</th>
<th>姓名</th>
</tr>
<tr>
<td>001</td>
<td>zhaosi</td>
</tr>
<tr>
<td>002</td>
<td>liuneng</td>
</tr>
</table>
</section>
<script type="text/javascript">
/*需求:按照空格拆分后,模糊查寻指定内容(忽略大小写),将背景高亮显示。*/
window.onload = () => {
//抓到按钮,点击按钮后的一系列操作
document.querySelector("#search-btn").onclick = () => {
// 抓到文本框(当前写入的文本)
let searchIpt = document.querySelector("#search-ipt");
// 从这个集合的0号元素开始抓到<tbody>框
let tbody = document.querySelector("#user-tab").tBodies[0];
//获取<tbody>中的所有<tr>的内容
let trs = tbody.rows;
//如果文本框的值是字符串空的或者是空的 直接返回
if (searchIpt["value"] === "" || searchIpt["value"] == null) {
return;
}
//集合遍历所有的<tr>,并且从第二行开始
for (let i = 1, j = trs.length; i < j; i++) {
//每次点击搜索之后文本框直接变成空的
trs[i]["style"]["backgroundColor"] = "";
//第二行<tr>第二个字段的内容赋值,并且忽略大小写
let nameFromTab = trs[i].cells[1].innerText.toUpperCase();
//获取当前文本框的内容,忽略大小写
let nameFromIpt = searchIpt["value"].toUpperCase();
//将文本框获取到的内容拆解成单独一个一个的
let names = nameFromIpt.split(" ");
//循环遍历拆解后的内容
for (let m = 0, n = names.length; m < n; m++) {
//用以拥有的内容比较 文本框需要搜索的内容如果不存在就返回空,存在的话就变成灰色
if (nameFromTab.search(names[m]) !== -1) {
trs[i]["style"]["backgroundColor"] = "gray";
}
}
}
}
};
</script>
</body>
</html>
增删改查
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style type="text/css">
#user-tab {
width: 1000px;
table-layout: fixed;
border-collapse: collapse;
text-align: center;
}
#user-tab, td, th {
border: 1px solid red;
}
</style>
</head>
<body>
<section>
<label><input id="name-ipt" placeholder="input your name..."/></label>
<label><input id="age-ipt" placeholder="input your age..."/></label>
<label><input id="search-ipt" placeholder="input your search..."/></label>
<button id="create-btn" type="button">添加</button>
<button id="delete-btn" type="button">删除</button>
<button id="search-btn" type="button">查找</button>
</section>
<hr/>
<section>
<table id="user-tab">
<tr>
<th><label><input type="checkbox"></label></th>
<th>编号</th>
<th>姓名</th>
<th>年龄</th>
<th>操作</th>
</tr>
<tr>
<td><label><input type="checkbox" disabled="disabled"></label></td>
<td>001</td>
<td>zhaosi</td>
<td>11</td>
<td></td>
</tr>
</table>
</section>
<script type="text/javascript">
let tbody;
window.onload = () => {
tbody = document.querySelector("#user-tab").tBodies[0];
document.querySelector("#create-btn").onclick = () => createData();
document.querySelector("#delete-btn").onclick = () => deleteData();
document.querySelector("#search-btn").onclick = () => searchData();
};
/*需求:点击添加按钮,可以添加一条数据。*/
function createData() {
let tr, td;
//创建一个tr标签
tr = document.createElement("tr");
//将创建的tr追加到曾经的tr后面
tbody.appendChild(tr);
//创建一个td标签
td = document.createElement("td");
//td的第一个标签是html并且是可选框 名字为cbs
td.innerHTML = `<label><input type="checkbox" name="cbs"/></label>`;
//将td追加到tr的身体里
tr.appendChild(td);
//创建一个td标签
td = document.createElement("td");
//这个代表文本编号 rows:快速获取表格的 `<tr>` 集合
td.innerText = "00" + (tbody.rows.length-1);
//将td追加到tr的身体里
tr.appendChild(td);
//创建一个td标签
td = document.createElement("td");
//创建对应th标签的文本框写入的值
td.innerText = document.querySelector("#name-ipt")["value"];
//将td追加到tr的身体里
tr.appendChild(td);
//创建一个td标签
td = document.createElement("td");
//创建对应th标签的文本框写入的值
td.innerText = document.querySelector("#age-ipt")["value"];
//将td追加到tr的身体里
tr.appendChild(td);
//创建一个td标签
td = document.createElement("td");
//在创建一个a标签
let updateA = document.createElement("a");
//想让a标签触发js事件,需要添加href="javascript:"
updateA["href"] = "javascript:";
//添加成功的时候td内容文本默认修改二字
updateA.innerText = "修改";
//点击这个修改按钮发生的事情
updateA.onclick = () => updateData(updateA);
td.appendChild(updateA);
tr.appendChild(td);
}
/*需求:点击修改按钮,可以修改姓名和年龄。*/
function updateData(updateA) {
//因为创建updateA是a标签,需要获取当前父亲标签,的父亲标签的子,标签数组第三个位置是姓名。
let nameTd = updateA.parentNode.parentNode.children[2];
//因为创建updateA是a标签,需要获取当前父亲标签,的父亲标签的子,标签数组第四个位置是年龄。
let ageTd = updateA.parentNode.parentNode.children[3];
//因为创建updateA是a标签,需要获取当前父亲标签,的父亲标签的子,标签数组第五个位置是操作。
let updateTd = updateA.parentNode.parentNode.children[4];
// 姓名原来的值 变成了输入框 ,输入框里面的值还是原来的值
nameTd.innerHTML = `<input value="${nameTd.innerHTML}"/>`;//输入框
ageTd.innerHTML = `<input value="${ageTd.innerHTML}"/>`;
//再次创建一个a标签
let okA = document.createElement("a");
//想让a标签触发js事件,需要添加href="javascript:"
okA["href"] = "javascript:";
okA.innerText = "确定";
//将获取到updateTd里面的内容清空
updateTd.innerHTML = "";
//然后将确定俩字添加进去
updateTd.appendChild(okA);
//点击确定按钮之后
okA.onclick = () => {
//获取姓名的子标签的值(input的值:输入框)就变成的修改后的值
nameTd.innerHTML = nameTd.children[0]["value"];
//获取年龄的子标签的值(input的值:输入框)就变成的修改后的值
ageTd.innerHTML = ageTd.children[0]["value"];
//清空确定这两个字
updateTd.innerHTML = "";
//把修改这两个字再次追加到标签里
updateTd.appendChild(updateA);
};
}
/*需求:勾选每一行的checkbox后,点击删除按钮可以进行批量删除。*/
function deleteData() {
//捕捉所有input标签里的name名字并且需要被打勾才行
let cbs = document.querySelectorAll("input[name=cbs]:checked");
if (cbs.length <= 0) {
alert("至少选择一项!");
return;
}
//confirm 是带取消 按钮的框
let response = confirm(`您将有条${cbs.length}数据被删除,确认吗?`);
if (response) {
for (let i = 0, j = cbs.length; i < j; i++) {
//从父中删除子,要删除tr的话需要找到tr的位置,父子关系查找,
//input>label>th>tr
tbody.removeChild(cbs[i].parentNode.parentNode.parentNode);
}
}
}
function searchData() {
// 抓到文本框(当前写入的文本)
let searchIpt = document.querySelector("#search-ipt");
//获取<tbody>中的所有<tr>的内容
let trs = tbody.rows;
//如果文本框的值是字符串空的或者是空的 直接返回
if (searchIpt["value"] === "" || searchIpt["value"] == null) {
return;
}
//集合遍历所有的<tr>,并且从第二行开始
for (let i = 1, j = trs.length; i < j; i++) {
//每次点击搜索之后文本框直接变成空的
trs[i]["style"]["backgroundColor"] = "";
//第二行<tr>第三个字段的内容赋值,并且忽略大小写
let nameFromTab = trs[i].cells[2].innerText.toUpperCase();
//获取当前文本框的内容,忽略大小写
let nameFromIpt = searchIpt["value"].toUpperCase();
//将文本框获取到的内容拆解成单独一个一个的
let names = nameFromIpt.split(" ");
//循环遍历拆解后的内容
for (let m = 0, n = names.length; m < n; m++) {
//用以拥有的内容比较 文本框需要搜索的内容如果不存在就返回空,存在的话就变成灰色
if (nameFromTab.search(names[m]) !== -1) {
trs[i]["style"]["backgroundColor"] = "gray";
}
}
}
}
</script>
</body>
</html>
表格点击排序
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style type="text/css">
body {
width: 400px;
margin: 0 auto;
text-align: center;
}
#user-tab, td, th {
width: 400px;
border: 1px solid red;
border-collapse: collapse;
}
</style>
</head>
<body>
<section>
<table id="user-tab">
<tr>
<th id="sort-by-id">编号</th>
<th id="sort-by-name">姓名</th>
<th id="sort-by-age">年龄</th>
</tr>
<tr>
<td>1</td>
<td>赵四</td>
<td>15</td>
</tr>
<tr>
<td>2</td>
<td>刘能</td>
<td>12</td>
</tr>
<tr>
<td>3</td>
<td>广坤</td>
<td>13</td>
</tr>
</table>
</section>
<script type="text/javascript">
/* 需求:按照表格第二列的序号进行升降序排列切换。*/
/* 思路:
1. 设置标志位isDescending,表示升序或降序。
2. 获取排序<th>并且挂载点击事件。
3. 新建一个空数组trArray,因为只有数组可以调用sort()方法。
4. 遍历<tbody>中的每一个<tr>,并且将它们都push到trArray中。
5. 用数组中的每个<tr>的第二个<td>中的内容进行比较和排序。
6. 排序后,将数组中的所有<tr>重新追加到<tbody>中。
7. 改变标志,方便循环点击排序。
*/
let tbody;
let isDescending = false;
window.onload = () => {
//获取所有的表格从数组角标0开始
tbody = document.querySelector("#user-tab").tBodies[0];
document.querySelector("#sort-by-id").onclick = () => {
//getTrArray()代表获取列 0代表比较角标
numberSort(getTrArray(), 0);
};
document.querySelector("#sort-by-name").onclick = () => {
stringSort(getTrArray(), 1)
};
document.querySelector("#sort-by-age").onclick = () => {
numberSort(getTrArray(), 2)
};
};
function getTrArray() {
let trArray = [];
//获取所有的tr
let trs = tbody.rows;
//从第二行开始循环,第一行是著称
for (let i = 1, j = trs.length; i < j; i++) {
//把所有的tr 放到数组里
trArray.push(trs[i]);
}
return trArray;
}
//数字比较
function numberSort(trArray, cellNumber) {
//排序tr列第一个孩子和第二列的孩子一次比较
trArray.sort((tr01, tr02) => {
let id01Text = tr01.cells[cellNumber].innerText;
let id02Text = tr02.cells[cellNumber].innerText;
return isDescending ? id01Text - id02Text : id02Text - id01Text;
});
appendToTbody(trArray);
}
// 文本比较
function stringSort(trArray, cellNumber) {
trArray.sort((tr01, tr02) => {
let id01Text = tr01.cells[cellNumber].innerText;
let id02Text = tr02.cells[cellNumber].innerText;
return isDescending ? id02Text.localeCompare(id01Text, "zh-CN") : id01Text.localeCompare(id02Text, "zh-CN");
});
appendToTbody(trArray);
}
//数组排序之后把排序好的内容再次追加到数组中
function appendToTbody(trArray) {
for (let i = 0, j = trArray.length; i < j; i++) {
tbody.appendChild(trArray[i]);
}
//取反可来回调换
isDescending = !isDescending;
}
</script>
</body>
</html>
6. 数据存储
概念: 利用JS在客户端存储数据有三种办法:
- cookie:cookie存储的数据在同一域名下共享,一个浏览器最多创建300个cookie,且每个cookie大小不能超过4KB,具体视浏览器而定,cookie存储方便,但不安全且占用带宽:
document.cookie="k=v":cookie同名覆盖,默认有效期是session级,即随浏览器关闭而死亡。document.cookie="k=v;expires=eDay":利用expires手动设定过期日期,-1表示立即失效。document.cookie:获取客户端的所有cookie,是一个由;分隔的字符串。
谷歌浏览器的Cookie可以在
F12-Application-Cookies中点击查看,若不支持本地测试Cookie,可以换成IE或者FF来测试。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<button id="test-cookie" type="button">测试cookie</button>
<br/>
<button id="set-cookie" type="button">测试setCookie()</button>
<br/>
<button id="get-cookie" type="button">测试getCookie()</button>
<br/>
<button id="delete-cookie" type="button">测试delCookie()</button>
<br/>
<script type="text/javascript">
window.onload = () => {
document.querySelector("#test-cookie").onclick = () => {
document.cookie = "a=1";
document.cookie = "a=2";
document.cookie = "b=3";
console.log(document.cookie);
};
document.querySelector("#set-cookie").onclick = () => {
setCookie("a", "1");
setCookie("b", "2", 1);
setCookie("b", "3", 4);
setCookie("c", "4", -1);
console.log(document.cookie);
};
document.querySelector("#get-cookie").onclick = () => {
setCookie("user", "joe");
console.log(getCookie("user"));
console.log(getCookie("username"));
};
document.querySelector("#delete-cookie").onclick = () => {
setCookie("user", "joe");
console.log(getCookie("user"));
delCookie("user");
console.log(getCookie("user"));
};
};
//存值 :键值对的方法 和过期时间
function setCookie(key, value, eDay = 1) {
let now = new Date();
//当前日期和输入的天数
let new_data = now.getDate() + eDay;
now.setDate(new_data);
//存入 输入的值和过期时间
document.cookie = `${key}=${value};expires=${now}`;
}
//取值
function getCookie(key) {
let result = null;
//存入数组并用分号空格分离开来
let cookies = document.cookie.split("; ");
//循环数组的值
for (let i = 0, j = cookies.length; i < j; i++) {
//如果输入的值和已存在的值一样用=号连接
let kvs = cookies[i].split("=");
if (kvs[0] === key) {
result = kvs[1];
break;
}
}
return result;
}
//删除值
function delCookie(key) {
//如果存在就删除
if (getCookie(key)) {
setCookie(key, "", -1);
}
}
</script>
</body>
</html>
案例:七天免密
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<section>
<form id="login-form" action="http://www.baidu.com" method="get">
<label>
<input id="username-ipt" name="username"/>
</label>
<label>
<input id="password-ipt" name="password" type="password"/>
</label>
<label>
<input id="no-password-cbx" type="checkbox"/>七天免密
</label>
<button id="login-btn" type="button">登录</button>
</form>
</section>
<script type="text/javascript">
/* 需求:以帐号以 admin/123 为例:
1. 当第一次使用 admin/123 进行登录时:
- 如果不勾选[7天免密],直接跳入主页面,cookie中不会记录任何信息。
- 如果勾选了[7天免密],将帐号密码存入cookie中,并设置7天后过期。
2. 当我在该 admin/123 过期前(7天内),再次登录时:
- 帐号框键入admin之后,密码框自动注入123,[7天免密]自动勾选。
- 帐号框键入admin之后,手动取消了勾选[7天免密],则admin/123将从cookie中被移除。
*/
window.onload = () => {
let usernameIpt = document.querySelector("#username-ipt");
let passwordIpt = document.querySelector("#password-ipt");
let noPasswordCbx = document.querySelector("#no-password-cbx");
let loginBtn = document.querySelector("#login-btn");
let loginForm = document.querySelector("#login-form");
loginBtn.onclick = () => {
//如果选中了点击框 用checked
if (noPasswordCbx.checked) {
//选中后存所有值
setCookie(usernameIpt["value"], passwordIpt["value"], 7);
} else {
//没选中就删除当前存在的值
delCookie(usernameIpt["value"]);
}
//手动提交表单
loginForm.submit();
};
//当文本框丧失焦点时触发的事件。
//账号框丧失焦点后
usernameIpt.onblur = () => {
//账号登录过输入,第二次输入账号就会自动获取密码
let passwordFromCookie = getCookie(usernameIpt["value"]);
if (passwordFromCookie) {
//密码的值和账号如果匹配上
passwordIpt["value"] = passwordFromCookie;
//选中
noPasswordCbx.checked = "checked";
}
}
};
//存值 :键值对的方法 和过期时间
function setCookie(key, value, eDay = 1) {
let now = new Date();
//当前日期和输入的天数
let new_data = now.getDate() + eDay;
now.setDate(new_data);
//存入 输入的值和过期时间
document.cookie = `${key}=${value};expires=${now}`;
}
//取值
function getCookie(key) {
let result = null;
//存入数组并用分号空格分离开来
let cookies = document.cookie.split("; ");
//循环数组的值
for (let i = 0, j = cookies.length; i < j; i++) {
//如果输入的值和已存在的值一样用=号连接
let kvs = cookies[i].split("=");
if (kvs[0] === key) {
result = kvs[1];
break;
}
}
return result;
}
//删除值
function delCookie(key) {
//如果存在就删除
if (getCookie(key)) {
setCookie(key, "", -1);
}
}
</script>
</body>
</html>