1、练习一, 通过选择省份,获取所选省份的城市
效果图:
code:
<!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>
select>option:first-child{
display: none;
}
</style>
<script>
var data = [
{
"sheng":"内蒙古",
"shi":["呼和浩特","包头","乌海","赤峰","通辽","鄂尔多斯","呼伦贝尔","巴彦淖尔","乌兰察布","兴安","锡林郭勒","阿拉善"]
},
{
"sheng":"辽宁",
"shi":["沈阳","大连","鞍山","抚顺","本溪","丹东","锦州","营口","阜新","辽阳","盘锦","铁岭","朝阳","葫芦岛"]
},
{
"sheng":"吉林",
"shi":["长春","吉林","四平","辽源","通化","白山","松原","白城","延边"]
},
{
"sheng":"四川",
"shi":["成都","自贡","攀枝花","泸州","德阳","绵阳","广元","遂宁","内江","乐山","南充","宜宾","广安","达州","眉山","雅安","巴中","资阳","阿坝","甘孜","凉山"]
},
{
"sheng":"山西",
"shi":["太原","大同","阳泉","长治","晋城","朔州","晋中","运城","忻州","临汾","吕梁"]
},
{
"sheng":"河北",
"shi":["石家庄","唐山","秦皇岛","邯郸","邢台","保定","张家口","承德","沧州","廊坊","衡水"]
},
];
</script>
</head>
<body onload="prac1_load()">
<h3>练习1:根据选择的省份,筛选出对应的城市</h3>
<p>
省:<select id="sheng">
<option value="null" selected>请选择省份</option>
</select>
市:<select id="shi">
<option value="null" selected>请选择城市</option>
</select>
</p>
<script>
let sheng = document.querySelector("#sheng");
let shi = document.querySelector("#shi");
// 添加下拉列表选项,num=1时为省,num=2时为市
function createOptions(data, num){
// 定义文档碎片,以减少节点树改变次数,节约性能
let docFrag = document.createDocumentFragment();
if(num == 1){
for(let i=0;i<data.length;i++){
let option = document.createElement("option");
option.value = data[i]["sheng"];
option.innerText = data[i]["sheng"];
docFrag.appendChild(option);
}
sheng.appendChild(docFrag);
}else if(num == 2){
// 每次添加市选项时,删除前一次添加的选项
shi.innerHTML = "";
for(let i=0;i<data.length;i++){
let option = document.createElement("option");
option.value = data[i];
option.innerText = data[i];
docFrag.appendChild(option);
}
shi.appendChild(docFrag);
}
}
// 将可选省份添加到下拉列表
function prac1_load(){
createOptions(data,1);
sheng.onchange = function(){
createOptions(data[sheng.selectedIndex-1].shi ,2);
}
}
</script>
</body>
</html>
2、练习二,复选框的全选与反选
效果图:
code:
<!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>
#prac2{
width: 400px;
border: 1px solid black;
border-collapse: collapse;
}
#prac2>thead>tr{
background-color: #cacaca;
}
#prac2>tr{
border-top: 1px solid #42424260;
}
#prac2>tr:hover{
background-color: #cacaca60;
}
#prac2 td{
width: 100px;
text-align: center;
}
</style>
</head>
<body>
<h3>练习2:复选框的全选与反选</h3>
<table id="prac2">
<thead>
<tr>
<th><input type="checkbox" id="checkAll"></th>
<th>学号</th>
<th>姓名</th>
<th>班级</th>
</tr>
</thead>
</table>
<p><button onclick="check_all()">全部选中</button><button onclick="reCheck()">反选</button></p>
<script>
// 定义数据集
var data2 = [
{
"sid":"001",
"name":"张三",
"classes":"F07",
},
{
"sid":"002",
"name":"李四",
"classes":"F07",
},
{
"sid":"003",
"name":"王五",
"classes":"F07",
},
{
"sid":"004",
"name":"赵六",
"classes":"F07",
}
];
// 创建单元格函数需要在下面一行前执行,否则下一行不能获取到元素节点
createTr();
let box = document.querySelectorAll(".checks");
let checkall = document.querySelector("#checkAll");
// 创建表格每行数据
function createTr(){
// 定义文档碎片,以减少节点树改变次数,节约性能
let docFrag = document.createDocumentFragment();
let table = document.querySelector("#prac2");
// 创建单元格,一行四列
for(let i=0;i<data2.length;i++){
let tr = document.createElement("tr");
let checkbox = document.createElement("input");
checkbox.className = "checks";
checkbox.type = "checkbox";
let td = document.createElement("td");
let td1 = document.createElement("td");
let td2 = document.createElement("td");
let td3 = document.createElement("td");
td.appendChild(checkbox);
td1.innerText = data2[i].sid;
td2.innerText = data2[i].name;
td3.innerText = data2[i].classes;
tr.appendChild(td);
tr.appendChild(td1);
tr.appendChild(td2);
tr.appendChild(td3);
docFrag.appendChild(tr);
}
table.appendChild(docFrag);
}
checkboxBindListener();
// 复选框绑定事件
function checkboxBindListener(){
for(let i=0;i<box.length;i++){
box[i].onchange=function(){
ifCheckall();
}
}
}
// 全选框是否选中
function ifCheckall(){
if(isAllChecked()){
checkall.checked = true;
}else{
checkall.checked = false;
}
}
// 判断复选框是否全选中
function isAllChecked(){
for(let i=0;i<box.length;i++){
if(!box[i].checked){
return false;
}
}
return true;
}
// 全选
function check_all(){
for(let i=0;i<box.length;i++){
box[i].checked = true;
}
ifCheckall();
}
// 反选
function reCheck(){
for(let i=0;i<box.length;i++){
if(box[i].checked){
box[i].checked = false;
}else{
box[i].checked = true;
}
}
ifCheckall();
}
// 全选框状态改变事件
checkall.onchange = function(){
if(checkall.checked){
check_all();
}else{
check_all();
reCheck();
}
}
</script>
</body>
</html>
3、练习三,下拉列表多选项的移动
效果图:
code:
<!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>
section{
display: flex;
}
section select{
width: 100px;
height: 150px;
}
section select option:first-child{
display: block;
}
.action{
display: block;
}
</style>
</head>
<body>
<h3>练习三:下拉列表选项转移</h3>
<section>
<div>
<select id="front" multiple="multiple">
<option value="刘备">刘备</option>
<option value="关羽">关羽</option>
<option value="张飞">张飞</option>
<option value="马超">马超</option>
<option value="曹操">曹操</option>
</select>
</div>
<div>
<button class="action" onclick="addRight()">></button>
<button class="action" onclick="addRightAll()">>></button>
<button class="action" onclick="addLeft()"><</button>
<button class="action" onclick="addLeftAll()"><<</button>
</div>
<div>
<select id="after" multiple="multiple">
</select>
</div>
</section>
<script>
let front = document.querySelector("#front"); // 左下拉列表
let after = document.querySelector("#after"); // 右下拉列表
let f_ops,a_ops;
// 左边添加到右边
function addRight(){
f_ops = front.selectedOptions; //获取front内选中的选项
for(let i=0;i<f_ops.length;i++){
after.appendChild(f_ops[i]);
i--;
}
// .forEach() 循环遍历数组
// let ii = document.querySelectorAll("#front option")
// ii.forEach(x => {
// if(x.selected){
// after.appendChild(x);
// }
// });
}
// 右边添加到左边
function addLeft(){
a_ops = after.selectedOptions; //获取after内选中的选项
for(let i=0;i<a_ops.length;i++){
front.appendChild(a_ops[i]);
i--;
}
}
// 左边全部添加到右边
function addRightAll(){
f_ops = front.options; //获取front内的选项
for(let i=0;i<f_ops.length;i++){
after.appendChild(f_ops[i]);
i--;
}
}
// 右边全部添加到左边
function addLeftAll(){
a_ops = after.options; //获取after内的选项
for(let i=0;i<a_ops.length;i++){
front.appendChild(a_ops[i]);
i--;
}
}
</script>
</body>
</html>
新手上路,如有错误,望大佬们指正。