DOM文档对象模型
- 包含和页面元素相关的内容
1、通过选择器获取页面中的元素对象
let 元素对象 = document.querySelector("选择器")
2、获取和修改元素的文本内容
元素对象.innerText = "xxx"; 修改文本内容
元素对象.innerText 获取文本内容
3、获取和修改input控件的值
控件对象.value="xxx"; 修改
控件对象.value 获取
4、创建元素对象
let 元素对象 = document.createElement("标签名");
5、添加元素对象到某个元素里面
document.body.appendChild(元素对象);
父元素.appendChild(元素对象);
父元素.append(元素对象,元素对象,元素对象);
前端MVC设计模式
- MVC设计模式,其实就是将前端实现某个业务的所有代码划分为三部分
- Model: 模型, 指数据模型,这个数据一般来自于服务器
- View: 视图, 指页面标签内容
- Controller:控制器, 指将数据展示到视图中的过程代码
- 前端MVC设计模式弊端: 需要在Controller控制器部分频繁进行DOM(遍历查找元素的代码)操作, 会影响执行效率.
M,V,VM设计模式
- Model: 模型, 指数据模型,这个数据一般来自于服务器
- View: 视图, 指页面标签内容
- ViewModel:视图模型, 将页面中可能发生改变的元素和某个变量在内存中进行绑定,当变量的值发生改变时会从内存中直接找到对应的元素让其改变.
Vue
- Vue框架是目前最流行的前端框架
- Vue对象相当于MVVM设计模式中的VM, 负责将页面中可能发生改变的元素和变量进行绑定, 绑定完之后会不断监听变量的改变, 当变量的值发生改变时会自动找到对应的元素并改变其显示内容.
- 相关指令:
- {{变量}}:插值, 让此处的文本内容和变量进行绑定
- v-text="变量", 让元素的文本内容和变量进行绑定
- v-html="变量", 让元素的html内容和变量进行绑定
- v-bind:属性名="变量", 让元素的xxx属性和变量进行绑定 可以省略掉v-bind
- v-model="变量", 双向绑定, 当变量的值发生改变页面会跟着改变, 页面的内容改变时变量也会跟着改变,只有使用form表单中的控件时才会涉及到双向绑定.
- v-on:事件名="方法", 事件绑定 简写@事件名="方法" , 调用的方法必须声明在Vue里面的methods里面
- v-for="(变量,i) in 数组"; 遍历数组 同时重复生成当前标签,数量和数组中对象的数量一致
- v-if="变量" , 变量值为true时显示元素 ,为false时 删除元素
- v-else 和v-if结合使用 取反
- v-show="变量" , 变量值为true时显示元素 ,为false时 隐藏元素(需要频繁切换显示状态时使用)
Demo相关:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
//创建标签
let d = document.createElement("div");
//给div设置显示文本
d.innerText = "我是div";
//把div添加到body里面 append是添加多个标签
document.body.appendChild(d)
//创建h1和h2
let h1 = document.createElement("h1");
let h2 = document.createElement("h2");
h1.innerText = "这是h1";
h2.innerText = "这是h2";
document.body.append(h1,h2);
//创建图片并添加
let i = document.createElement("img");
//给元素设置属性
i.src="../b.jpg";
//添加到页面中
document.body.append(i);
</script>
</body>
</html>
帅哥美女添加练习:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<input type="text" id="i1">
<input type="button" value="添加帅哥" onclick="f(1)">
<input type="button" value="添加美女" onclick="f(2)">
<script>
let input = document.querySelector("#i1");//得到文本框对象
function f(x) {
let imgName = x==1?"../b.jpg":"../b.jpg";//得到图片名
for (let i = 0; i <input.value; i++) {
let img = document.createElement("img");
img.src = imgName;
img.width = 200;
img.height = 200;
document.body.append(img);
}
}
</script>
</body>
</html>
员工列表练习:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<input type="text" id="i1" placeholder="姓名">
<input type="text" id="i2" placeholder="工资">
<input type="text" id="i3" placeholder="工作">
<input type="button" value="添加" onclick="f()">
<table border="1">
<tr>
<th>姓名</th><th>工资</th><th>工作</th>
</tr>
</table>
<script>
//获取三个文本框
// let i1 = document.querySelector("#i1");
// let i2 = document.querySelector("#i2");
// let i3 = document.querySelector("#i3");
//通过标签名获取table
let table = document.querySelector("table");
function f() {
//创建tr和td
let tr = document.createElement("tr");
let nameTd = document.createElement("td");
let salaryTd = document.createElement("td");
let jobTd = document.createElement("td");
//把用户输入的内容添加到td里面
nameTd.innerText = i1.value;
salaryTd.innerText = i2.value;
jobTd.innerText = i3.value;
//把td装进tr
tr.append(nameTd,salaryTd,jobTd);
//把tr装进table
table.append(tr);
}
</script>
</body>
</html>
自定义对象:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table border="1">
<caption>商品列表</caption>
<tr>
<th>商品名</th>
<th>价格</th>
<th>库存</th>
</tr>
</table>
<script>
//定义一个空的Person类
function Person(){}
//实例化Person对象
let p1 = new Person();
//动态添加属性
p1.name = "刘德华"
p1.age = 50;
//动态添加方法
p1.run = function (){
console.log(this.name+":"+this.age);
}
//调用对象的方法
p1.run();
//定义一个自带属性和方法的对象
function Car(){
this.name = "宾利";
this.price = 500;
this.run = function (){
console.log(this.name+":"+this.price);
}
}
let c1 = new Car();
c1.run();
//直接实例化空对象的方式
let p2 = {};
p2.name = "貂蝉";
p2.age = 66;
p2.run = function (){
console.log(this.name+":"+this.age);
}
p2.run();
//直接实例化带属性和方法的对象
let p3 = {
name:"吕布",
age:18,
run:function (){
console.log(this.name+":"+this.age);
}
}
p3.run();
//将商品信息封装到一个对象中,在数组里面装多个表示商品信息的对象
let arr = [{title:"小米4",price:5000,num:100},
{title:"小米1",price:5000,num:100},
{title:"小米2",price:5000,num:100},
{title:"小米3",price:5000,num:100},]
//得到table对象
let table = document.querySelector("table");
//遍历数组
for (let item of arr){
let tr = document.createElement("tr");
let titleTd = document.createElement("td");
let priceTd = document.createElement("td");
let numTd = document.createElement("td");
//给td添加显示的商品信息
titleTd.innerText = item.title;
priceTd.innerText = item.price;
numTd.innerText = item.num;
tr.append(titleTd,priceTd,numTd);
//把tr装进table
table.append(tr);
}
</script>
</body>
</html>
综合练习:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table border="1">
<caption>个人信息</caption>
<tr>
<td>照片:</td>
<td><img id="head_img" src="head.jpg" width="50px" alt=""></td>
</tr>
<tr>
<td>名字:</td><td id="name_td">xxx</td>
</tr>
<tr>
<td>年龄:</td><td id="age_td">xxx</td>
</tr>
<tr>
<td>好友:</td>
<td><ul id="friend_ul"></ul></td>
</tr>
</table>
<input type="button" value="请求数据" onclick="f()">
<script>
function f(){
//模拟从服务器获取的数据
let person = {name:"苍老师",age:50,url:"../b.jpg",friend:["克井","传奇","成恒"]};
//获取页面中的元素对象
let head_img = document.querySelector("#head_img");
let name_td = document.querySelector("#name_td");
let age_td = document.querySelector("#age_td");
let friend_ul = document.querySelector("#friend_ul");
//把对象中的数据取出并赋值给页面中的元素对象
head_img.src = person.url;
name_td.innerText = person.name;
age_td.innerText = person.age;
//遍历好友数组
for (let friendName of person.friend) {
//创建li
let li = document.createElement("li");
li.innerText = friendName;
//把li添加到ul里面
friend_ul.append(li);
}
}
</script>
</body>
</html>
HelloVue:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<h1>{{info}}</h1>
</div>
<!--引入网络版Vue框架文件-->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<!--引入本地vue.js文件-->
<!--<script src="vue.js"></script>-->
<script>
let v = new Vue({
el:"#app", /*告诉Vue对象管理哪个元素*/
data:{
info:"Hello Vue!"
}
})
setTimeout(function (){
v.info = "值改变了!";
},3000);
</script>
</body>
</html>
文本相关指令:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>
<!--{{变量}}:插值,让此处的文本和data里面的变量进行绑定-->
<h1>{{info}}</h1>
<!--v-text=变量,让元素的文本内容和变量进行绑定-->
<p v-text="info"></p>
<!--v-html=变量,让元素的标签内容和变量进行绑定-->
<p v-html="info"></p>
</div>
<script src="../js/vue.js"></script>
<script>
let v = new Vue({
el:"div",
data:{
info:"文本相关练习<b>加粗</b>"
}
})
</script>
</body>
</html>
属性绑定:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>
<!--v-bind属性绑定-->
<!--<input type="text" v-bind:value="msg">-->
<!--v-bind属性绑定 简写-->
<input type="text" :value="msg">
<a :href="url">超链接</a>
<img :src="imgUrl" alt="">
</div>
<script src="../js/vue.js"></script>
<script>
let v = new Vue({
el:"div",
data:{
msg:"属性绑定测试",
url:"http://www.baidu.com",
imgUrl:"../b.jpg"
}
})
</script>
</body>
</html>
双向绑定:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>
<!--只有value才有双向绑定 v-model绑定value-->
<!--当需要获取input值的时候使用双向绑定-->
<input type="text" v-model="msg">
<h1>{{msg}}</h1>
<!--一组 代表一个空格-->
a b
<hr>
<input type="radio" v-model="gender" value="男">男
<input type="radio" v-model="gender" value="女">女
<h2>{{gender}}</h2>
</div>
<script src="../js/vue.js"></script>
<script>
let v = new Vue({
el:"div",
data:{
msg:"双向绑定测试",
gender:"男"
}
})
</script>
</body>
</html>
事件绑定:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>
<input type="button" value="按钮1" v-on:click="f()">
<input type="button" value="按钮2" @click="f1()">
{{info}}
</div>
<script src="../js/vue.js"></script>
<script>
let v = new Vue({
el:"div",
data:{info:"事件绑定"},
methods:{
/*方法定义的两种形式*/
f:function (){
v.info="按钮1点击了"
},
f1(){
v.info="按钮2点击了"
}
}
})
</script>
</body>
</html>
猜数字游戏:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>
<input type="text" v-model="num" placeholder="请输入0-100之间的整数">
<input type="button" value="猜一猜" @click="f()">
<h1>结果:{{info}}</h1>
</div>
<script src="../js/vue.js"></script>
<script>
let x = parseInt(Math.random()*101);
let v = new Vue({
el:"div",
data:{
info:"", num:""
},
methods:{
f(){
if(v.num>x){
v.info="猜大了!"
}else if(v.num<x){
v.info="猜小了!"
}else {
v.info="猜中了!"
}
}
}
})
</script>
</body>
</html>
计算器练习:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>
<input type="text" v-model="num1">
<input type="text" v-model="num2">
<input type="button" value="加" @click="f('+')">
<input type="button" value="减" @click="f('-')">
<input type="button" value="乘" @click="f('*')">
<input type="button" value="除" @click="f('/')">
<h1>结果:{{info}}</h1>
</div>
<script src="../js/vue.js"></script>
<script>
let v = new Vue({
el:"div",
data:{
info:"", num1:"", num2:""
},
methods:{
f(x){
/*eval:将字符串按照代码方式运行*/
v.info = eval(v.num1+x+v.num2);
}
}
})
</script>
</body>
</html>
循环遍历:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>
<table border="1">
<caption>国产优秀纯电汽车</caption>
<tr>
<th>编号</th>
<th>名字</th>
<th>价格</th>
<th>类型</th>
</tr>
<!--car代表数组中的每一个对象,i代表遍历的下标-->
<tr v-for="(car,i) in arr">
<td>{{i+1}}</td>
<td>{{car.name}}</td>
<td>{{car.price}}</td>
<td>{{car.type}}</td>
</tr>
</table>
<h1 v-for="car in arr">{{car.name}}---{{car.price}}</h1>
</div>
<script src="../js/vue.js"></script>
<script>
let v = new Vue({
el:"div",
data:{
arr:[{name:"比亚迪汉EV",price:250000,type:"轿车"},
{name:"极氪001",price:300000,type:"轿跑"},
{name:"蔚来ET7",price:500000,type:"轿车"}]
}
})
</script>
</body>
</html>
员工列表练习:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>
<input type="text" placeholder="姓名" v-model="name">
<input type="text" placeholder="工资" v-model="salary">
<input type="text" placeholder="工作" v-model="job">
<input type="button" value="添加" @click="f()">
<table border="1">
<caption>员工列表</caption>
<tr>
<th>编号</th>
<th>姓名</th>
<th>工资</th>
<th>工作</th>
<th>操作</th>
</tr>
<tr v-for="(e,i) in arr">
<td>{{i+1}}</td>
<td>{{e.name}}</td>
<td>{{e.salary}}</td>
<td>{{e.job}}</td>
<td><input type="button" value="删除" @click="del(i)"></td>
</tr>
</table>
</div>
<script src="../js/vue.js"></script>
<script>
let v = new Vue({
el:"div",
data:{
name:"",
salary:"",
job:"",
arr:[{name:"张三",salary:500,job:"销售"},
{name:"李四",salary:300,job:"人事"}]
},
methods:{
f(){
//往arr数组中添加一个对象
v.arr.push({name:v.name,salary:v.salary,job:v.job})
v.name="";
v.salary="";
v.job="";
},
del(i){
//删除arr数组中i下标位置的对象
v.arr.splice(i,1)
}
}
})
</script>
</body>
</html>
个人信息练习:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>
<table border="1">
<caption>个人信息</caption>
<tr>
<td>照片:</td>
<td><img :src="person.imgUrl" width="50px" alt=""></td>
</tr>
<tr>
<td>名字:</td><td>{{person.name}}</td>
</tr>
<tr>
<td>年龄:</td><td>{{person.age}}</td>
</tr>
<tr>
<td>好友:</td>
<td><ul>
<li v-for="name in person.friend">{{name}}</li>
</ul></td>
</tr>
</table>
<input type="button" value="请求数据" @click="f()">
</div>
<script src="../js/vue.js"></script>
<script>
let v = new Vue({
el:"div",
data:{
person:{name:"xxx",age:"xxx",imgUrl:"../day05/head.jpg",friend:["xxx","xxx"]}
},
methods:{
f(){
//模拟从服务器获取的数据
let person = {name:"苍老师",age:50,imgUrl:"../day05/a.jpg",friend:["克井","传奇","成恒"]};
v.person = person;
}
}
})
</script>
</body>
</html>
显示隐藏相关:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>
<!--v-if让元素是否显示和变量进行绑定,不显示时是把元素删除了-->
<h1 v-if="isVisible">刘德华</h1>
<!--v-else和v-if结合使用 和上面条件取反-->
<h1 v-else>刘苍松</h1>
<!--v-show让元素是否显示和变量进行绑定,不显示时是把元素隐藏了
(频繁切换显示状态时使用)-->
<h2 v-show="isVisible">张学友</h2>
</div>
<script src="../js/vue.js"></script>
<script>
let v = new Vue({
el:"div",
data:{
isVisible:true
}
})
</script>
</body>
</html>
综合练习:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>
<!--true登录 不显示 false没登录 显示-->
<!--在-->
<div v-if="!isLogin">
<a href="javascript:void(0)">注册</a>
<!--如果超链接点击时 不离开此页面需要添加javascript:void(0),废掉它的跳转功能-->
<!--href="" 空字符串表示跳转刷新-->
<a href="javascript:void(0)" @click="isLogin=true">登录</a>
</div>
<div v-else>
<input type="text" v-model="newName">
<!--如果在el:所确定的范围里,也就是在body>div里访问data里面的东西不用加v.arr.push(newName)
直接arr.push(newName),如果在methods:{}所定义的方法里面需要加v.。-->
<input type="button" value="添加" @click="arr.push(newName)">
<a href="javascript:void(0)" @click="isLogin=false">登出</a>
</div>
<ul>
<li v-for="name in arr">{{name}}</li>
</ul>
</div>
<script src="../js/vue.js"></script>
<script>
let v = new Vue({
el:"body>div",
data:{
newName:"",
arr:["刘备","关羽"],
isLogin:false
}
})
</script>
</body>
</html>
员工列表练习EUI版本:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<!-- import CSS -->
<link rel="stylesheet" href="css/eui.css">
</head>
<body>
<div id="app">
<input type="text" placeholder="姓名" v-model="name">
<input type="text" placeholder="工资" v-model="salary">
<input type="text" placeholder="工作" v-model="job">
<input type="button" value="添加" @click="add()">
<h1>员工列表</h1>
<el-table
:data="arr"
style="width: 100%">
<el-table-column
type="index"
label="编号"
width="180">
</el-table-column>
<el-table-column
prop="name"
label="名字"
width="180">
</el-table-column>
<el-table-column
prop="salary"
label="工资"
width="180">
</el-table-column>
<el-table-column
prop="job"
label="工作"
width="180">
</el-table-column>
<el-table-column label="操作">
<!--scope代表每行对应的数据里面的index属性代表下标,
里面的row代表每行对应的数组中的对象-->
<template slot-scope="scope">
<el-popconfirm @confirm="handleDelete(scope.$index, scope.row)"
title="这是一段内容确定删除吗?"
>
<el-button size="mini"
type="danger" slot="reference">删除</el-button>
</el-popconfirm>
</template>
</el-table-column>
</el-table>
</div>
</body>
<!-- import Vue before Element -->
<script src="js/vue.js"></script>
<!-- import JavaScript -->
<script src="js/eui.js"></script>
<script>
let v = new Vue({
el: '#app',
data: function() {
return {
name:"",
salary:"",
job:"",
arr:[{name:"孙悟空",salary:5000,job:"程序员"},
{name:"猪八戒",salary:3000,job:"销售"},
{name:"沙僧",salary:1000,job:"人事"}]
}
},
methods:{
add(){
if(v.name.trim()==""||v.salary.trim()==""||v.job.trim()==""){
v.$message.error("输入错误!");
return;
}
v.arr.push({name:v.name,salary:v.salary,job:v.job})
},
handleDelete(index, row) {
console.log(index, row);
//删除arr数组中i下标位置的对象
//1代表删除几行 一次删一行
v.arr.splice(index,1);
}
}
})
</script>
</html>