文章目录
- 一、HTML
- 1.1 基础标签
- 1.2 列表
- 1.3 表格
- 1.4 表单
- 二、CSS
- 2.1 引入方式
- 2.2 CSS 选择器
- 2.2.1 基本选择器
- 2.2.2 组合选择器
- 2.3 常用属性
- 2.3.1 背景
- 2.3.2 文本
- 2.3.3 字体
- 2.3.4 display元素类型
- 2.3.5 浮动
- 2.3.6 盒子模型
- 三、JavaScript
- 3.1 引入方式
- 3.2 数据类型
- 3.2.1 数组
- 3.2.2 函数
- 3.2.3 对象
- 3.3 WebAPI-事件
- 3.3.1 事件处理程序
- 3.3.2 常用事件
- 3.4 WebAPI-Bom对象
- 3.4.1 window 对象
- 3.4.2 history 对象
- 3.4.3 location 对象
- 3.5 WebAPI-Dom对象
- 3.5.1 获取节点
- 3.5.2 创建/插入节点
- 3.5.3 间接查找节点
- 3.5.4 删除节点
- 3.5 WebAPI-表单
- 3.5.1 获取表单
- 3.5.2 获取表单元素
- 3.5.3 提交表单
- 3.6 WebAPI-Ajax请求
- 3.6.1 Get 请求
- 3.6.2 Post 请求
提示:以下是本篇文章正文内容,前端系列学习将会持续更新
一、HTML
W3school 官方文档:https://www.w3school.com.cn/html/index.asp
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Document</title>
</head>
<body>
</body>
</html>
1.1 基础标签
① h标签
<h1>这是一个一级标题</h1>
② p标签
<p>这是一段文本</p>
③ img标签
<img src=" " alt=" "/>
属性:
- src source表示图片的路径;
- alt 设置图像找不到时的代替文本;
- title 设置提示文本;
- width 表示图片的宽度,单位是px;
- height 表示图片的高度,与宽度等比缩放;
- border 边框属性,它的值可设置边框的厚度;
④ video标签
<video src="video/Daniel_Wu.mp4" height="280px" controls>
您的浏览器不支持 video 标签。
</video>
controls 属性规定浏览器应该为视频提供播放控件。
⑤ a标签
<a href="">文字或图片img</a>
<a href="javascript:void(0)" onclick="func();">不跳转,只触发事件</a>
属性:
- href hypertext reference,超文本引用。属性值:即将跳转网页的路径。
- target 设置跳转网页是否用新窗口打开, 默认是原窗口。属性值为”_blank”时,用新窗口打开。
- title 设置鼠标悬停文本。
⑥ div 和 span
div 是大的范围。容器级标签,可放置任意标签。
span 是小区域、小跨度。常用于小范围调整布局。文本级标签,不能盛放容器级标签。
一般认为 p > span > a
⑦ html 杂项
<!-- 注释 -->
<font>文字</font>
<b>加粗</b> <strong>加粗强调</strong>
<u>下划线</u>
<i>倾斜</i> <em>倾斜强调</em>
<del>中划线</del> <hr/>水平分割线
回到目录…
1.2 列表
①无序列表 (ul>li)
<ul>
<li>电视剧</li>
<li>电影</li>
<li>小说</li>
</ul>
实用案例:
②有序列表 (ol>li)
<ol>
<li>冠军</li>
<li>亚军</li>
<li>季军</li>
</ol>
应用案例:
③定义列表 (dl>dt>dd)
<dl>
<dt>小米</dt>
<dd>特点:功能还好、价格合理、需要抢购</dd>
<dd>产品类型:手机、平板、电视、手环等</dd>
<dd>出产地:中国</dd>
</dl>
<dl>
<dt>vivo</dt>
<dd>特点:性价比高、赠品多</dd>
<dd>产品类型:手机等</dd>
<dd>出产地:中国</dd>
</dl>
应用案例:
回到目录…
1.3 表格
- 标签:
table > tr > td(th)
- 表格分区:可以将表格分为三部分,标题:
caption
、表头:thead
、主体:tbody
- 合并单元格:rowspan:合并行单元格,colspan:合并列单元格
<table border="1px">
<tr>
<td colspan="2">1</td>
<td>2</td>
<td rowspan="2">3</td>
<td>4</td>
</tr>
<tr>
<td>5</td>
<td rowspan="2">6</td>
<td>7</td>
<td>8</td>
</tr>
<tr>
<td>9</td>
<td>10</td>
<td colspan="2">11</td>
</tr>
</table>
回到目录…
1.4 表单
①form标签
<form action="">大标签,所有表单元素写在form标签内部</form>
- method: 方法,提交数据的方法,属性值:get、post。
- action: 提交的位置,对应后端控制层的接口。
②文本框
<input type="text" value="默认文本">
③密码框
<input type="password">
④按钮
<input type="button" value="普通按钮">
<input type="submit" value="提交">
<input type="reset" value="重置">
⑤单选框
<input type="radio" name="gender" value="1"> 男
<input type="radio" name="gender" value="2"> 女
- name属性值:必须设置,确定是否为一组。
- value属性值:可以不设置,一般作为数据提交时的值。
⑥多选框
<input type="checkbox" name="hobby"> 游泳
<input type="checkbox" name="hobby"> 羽毛球
<input type="checkbox" name="hobby"> 足球
- checked属性功能:当值为空时,默认不选;当值为checked时,默认勾选
⑦文本域
<textarea name="" id="" cols="30" rows="10">默认文本</textarea>
- rows:属性值为数字,表示行数
- cols:属性值为数字,表示每行的字节数
⑧下拉菜单
<select>
<option>北京</option>
<option>上海</option>
<option>广州</option>
<option>宁夏</option>
</select>
回到目录…
二、CSS
2.1 引入方式
①内部样式表:将样式写在 style 标签中,嵌入 html 的 head 标签中。
<head>
<style>
p {
color:green;
}
</style>
</head>
<body>
<p>hello,world</p>
</body>
②行内样式表:通过 style 属性来指定某个标签的样式。
<div style="color:green">想要生活过的去, 头上总得带点绿</div>
③外部样式:创建一个 css 文件,使用 link 标签引入 (link在head中)。
<head>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div>上帝为你关上一扇门, 然后就去睡觉了</div>
</body>
CSS 的优先级:就近原则。
回到目录…
2.2 CSS 选择器
2.2.1 基本选择器
①通用选择器: 选择所有元素
* {
color: orange;
}
②元素选择器: 选择指定标签
p {
color: red;
font-size: 20px;
}
<p>这是一段文字</p>
③ID选择器: 选择设置过指定id属性值的元素
#div1 {
color: #FF0000;
}
<div id="div1">div</div>
④类选择器: 选择设置过指定class属性值的元素
.cls1 {
color: #FF0000;
}
<div class="cls1">div</div>
⑤分组选择器: 当⼏个元素样式属性⼀样时,可以共同调⽤⼀个声明,选择器之间⽤逗号分隔
h2 , #text {
color: orange;
font-style: italic;
}
<h2>标题二</h2>
<div id="text">文字盒子</div>
CSS 样式的优先级,常⻅的权重如下,权重越⼤,优先级越⾼:
- 元素选择器:1
- 类选择器:10
- id选择器:100
- 内联样式:1000
回到目录…
2.2.2 组合选择器
①后代选择器: 可以指定元素的所有的后代元素,以空格分隔
.food #apple p {
color: red;
}
<h1>⻝物</h1>
<div class="food">
<div id="apple">
<img src="apple.png"/>
<p>苹果</p>
</div>
</div>
②子代选择器: 可以指定元素的第一代元素,以大于号分隔
.food > p {
color: red;
}
<h1>⻝物</h1>
<div class="food">
<img src="apple.png"/>
<p>苹果</p>
<img src="orange.png"/>
<p>橘子</p>
</div>
③相邻兄弟选择器: 可以指定元素的相邻的下一个指定元素,以加号分隔
#d + div {
border: 1px solid red;
}
<div id="d">
相邻兄弟选择器1
<ul>
<li>开⼼麻花</li>
<li>贾玲</li>
<li>宋⼩宝</li>
</ul>
</div>
<div>
相邻兄弟选择器2
</div>
④普通兄弟选择器: 可以指定元素后的指定同级元素(自上而下),以波浪号分隔
.bro ~ li {
background-color: yellow;
}
<div>
普通兄弟选择器1
<ul>
<li class="bro">开⼼麻花</li>
<li>贾玲</li>
<li>宋⼩宝</li>
</ul>
</div>
回到目录…
2.3 常用属性
2.3.1 背景
body {
background-color: #ff0000; /*设置元素的背景颜⾊*/
background-image: url(img/logo.jpg); /*设置元素的背景图像,默认平铺重复显示*/
background-repeat: no-repeat; /*背景图显示效果*/
}
background-repeat 值 | 说明 |
---|---|
repeat | 默认。背景图像将在垂直方向和水平方向重复。 |
repeat-x | 背景图像将在水平方向重复。 |
repeat-y | 背景图像将在垂直方向重复。 |
no-repeat | 背景图像将仅显示一次。 |
inherit | 规定应该从父元素继承 background-repeat 属性的设置。 |
2.3.2 文本
p {
color: rgb(255,0,0); /*文本颜色*/
text-align: center; /*文本对齐方式: center、left、right、justify两端对齐*/
text-decoration: underline; /*设置文本修饰,下划线*/
text-indent: 2em; /*设置文本首行缩进*/
}
text-decoration 值 | 说明 |
---|---|
underline | 对⽂本添加下划线 |
overline | 对⽂本添加上划线 |
line-through | 对⽂本添加中划线 |
none | 关闭原本应⽤到元素上的所有装饰 |
2.3.3 字体
div {
font-family: "agency fb",楷体,宋体; /*"后备"机制,设置多种字体*/
font-size: 30px; /* 设置字体大小 */
font-style: italic; /* 设置字体风格: normal正常体、italic斜体、oblique强制倾斜*/
font-weight: 700; /* 设置字体粗细,400为正常 */
}
2.3.4 display元素类型
- 块级元素:可以设置元素的宽高和边距,元素会自动换行。
- 行内元素:不可以设置元素的宽高和边距,元素不会自动换行。
- 行内块级元素:可以设置元素的宽高和边距,元素不会自动换行。
#p1, #p2 {
width: 200px;
height: 200px;
background-color: #FA8072;
display: inline-block;
}
display 值 | 说明 |
---|---|
block | 元素会显示块级元素 |
inline | 元素会显示为行内元素 |
inline-block | 元素会显示为行内块级元素 |
none | 元素会被隐藏 |
2.3.5 浮动
- float 的属性值有
none
、left
、right
。 - 只有横向浮动,并没有纵向浮动。
- 会自动将元素的 display 属性变更为 block。
- 浮动元素的后⼀个元素会围绕着浮动元素(典型运⽤是⽂字围绕图⽚)。
- 浮动元素的前⼀个元素不会受到任何影响(如果你想让两个块状元素并排显示,必须让两个块状元素都应⽤ float)。
img {
width: 100px;
float: left;
}
2.3.6 盒子模型
①边框 border
#div2 {
border-style: dashed; /*样式: none无边框、soild实线、dotted点状、dashed虚线、double双线、inset(3D效果)*/
border-color: #DA70D6; /*颜色*/
border-width: 1px; /*宽度*/
}
table {
border-collapse : collapse; /*设置是否将表格边框折叠为单⼀边框*/
}
#nav li {
border-radius: 0 10px 0 10px; /* 为元素添加圆角边框: 左上、右上、右下、左下 */
}
②内边距 padding
td {
padding: 10px; /* 设置一个值,表示四个方向(上右下左)都相同 */
padding: 10px 20px; /* 设置两个值,表示上下一致,左右一致 */
/* 还可以单独设置四个内边距 */
padding-top: 5px;
padding-right: 10px;
padding-bottom: 2px;
padding-left: 10px;
}
①外边距 margin
p {
margin: 100px; /* 设置一个值,表示四个方向(上右下左)都相同 */
margin: auto; /*⾃动,可以理解为居中的意思*/
/* 还可以单独设置四个外边距 */
margin-top:100px;
margin-right:50px;
margin-bottom:100px;
margin-left:50px;
}
回到目录…
三、JavaScript
3.1 引入方式
①行内式:直接嵌入html内部
<input type="button" value="点我一下" onclick="alert('hello')">
②内嵌式:写在 script 标签中
<script>
alert("hello");
</script>
③外部式:创建一个 js 文件,直接引用
<script src="js/hello.js" type="text/javascript" charset="utf-8"></script>
3.2 数据类型
虽说 JS 是弱类型语⾔,变量没有类型,但数据本身是有类型的。针对不同的类型,我们可以进⾏不同的操作。
JavaScript 中有 6 种数据类型,其中有五种简单的数据类型:Undefined、Null、布尔、数值和字符串,还有⼀种复杂数据类型 Object。
数据类型 | 说明 |
---|---|
数值(Number) | 整数和小数(比如 1 和 3.14) |
字符串(String) | 字符组成的⽂本(比如"Hello World") |
布尔值(Boolean) | true(真)和 false(假) |
Undefined | 表示“未定义”或不存在,即此处⽬前没有任何值 |
Null | 表示空缺,即此处应该有⼀个值,但⽬前为空 |
对象(object) | 各种值组成的集合。 对象(object) {name:”zhangsan”,age:”18”} 数组(array) [1,2,3] 函数(function) function test() {} |
类型转换:
parseInt("1234blue"); // returns 1234
parseInt("22.5"); // returns 22
parseInt("blue"); // returns NaN
parseFloat("1234blue"); // returns 1234.0
parseFloat("22.5"); // returns 22.5
parseFloat("22.34.5"); // returns 22.34
parseFloat("blue"); //returns NaN
var data = 10;
data.toString(); //将内容转换为字符串形式
data.toFixed(2); //根据⼩数点后指定位数将数字转为字符串,四舍五⼊
回到目录…
3.2.1 数组
①定义数组
var arr = new Array();
var arr1 = [];
var arr2 = [1, 2, 'haha', false];
②元素的添加和删除
arr.push(1); // 添加元素1
arr.splice(2, 1); // 从下标为2处删除1个元素
③遍历数组
for (var i = 0; i < arr.length; i++) {
console.log(arr[i]);
}
arr.forEach(function(element,index){
// element(名称任意):元素,index(名称任意):下标
console.log(element);
})
3.2.2 函数
①函数声明语句,没有加var关键字,使⽤之后⾃动变为全局变量
function 函数名(形参列表) {
函数体;
return 返回值;
}
// 函数调用
函数名(实参列表) // 不考虑返回值
返回值 = 函数名(实参列表) // 考虑返回值
②函数定义表达式
var 变量名 = function ([参数列表]) {
函数体;
}
变量名();
// 例如:
var print = function(){
console.log("Hello");
}
print();
3.2.3 对象
①直接创建
var student = {
name: '蔡徐坤',
height: 175,
weight: 170,
sayHello: function() {
console.log("hello");
}
};
②new Object 创建
var student = new Object();
student.name = "蔡徐坤";
student.height = 175;
student['weight'] = 170;
student.sayHello = function () {
console.log("hello");
}
③构造方法创建
function Cat(name, type, sound) {
this.name = name;
this.type = type;
this.miao = function () {
console.log(sound);
}
}
var mimi = new Cat('咪咪', '中华田园喵', '喵');
④序列化和反序列化
var str = JSON.stringify(object); // 序列化对象,将对象转为字符串
var student = JSON.parse(jsonStr); // 反序列化,将⼀个Json字符串转换为对象
⑤内置对象
对象名 | 说明 |
---|---|
Arguments | 只在函数内部定义,保存了函数的实参 |
Array | 数组对象 |
Date | ⽇期对象,⽤来创建和获取⽇期 |
Math | 数学对象 |
String | 字符串对象,提供对字符串的⼀系列操作 |
回到目录…
3.3 WebAPI-事件
事件 (Event) 是 JavaScript 应⽤跳动的⼼脏 ,进⾏交互,使⽹⻚动起来。当我们与浏览器中 Web ⻚⾯进⾏某些类型的交互时,事件就发⽣了。事件可能是⽤户在某些内容上的点击、⿏标经过某个特定元素或按下键盘上的某些按键。事件还可能是 Web 浏览器中发⽣的事情,⽐如说某个 Web ⻚⾯加载完成,或者是⽤户滚动窗⼝或改变窗⼝⼤⼩。
3.3.1 事件处理程序
①HTML 事件处理程序
某个元素⽀持的每种事件,都可以⽤⼀个与相应事件处理程序同名的 HTML 特性来指定。这样做有⼀些缺点,例如耦合度过⾼,还可能存在时差问题(当⽤户点击按钮时,处理函数还未加载到,此时处理函数是单独写的⼀段js代码),⽽且在不同的浏览器上可能会有不同的效果。
<input type="button" value="Press me" onclick="alert('thanks');" />
②DOM0 级事件处理程序
通过 JavaScript 指定事件处理程序的传统⽅式,就是将⼀个函数赋值给⼀个事件处理程序属性。这种⽅式被所有现代浏览器所⽀持。这种⽅式⾸先必须取得⼀个要操作的对象的引⽤,每个元素都有⾃⼰的事件处理程序属性,这些属性通常全都⼩写,例如 onclick
,然后将这种属性的值设为⼀个函数,就可以指定事件处理程序了。
<body>
<button id="myBtn">按钮</button>
<script type="text/javascript">
var btn = document.getElementById('myBtn');
btn.onclick = function(){
console.log('你点击了一下按钮');
}
</script>
</body>
以这种⽅式添加的事件处理程序会在事件流的冒泡阶段被处理。⽽且,只能为同⼀个元素的同⼀个事件设定⼀个处理程序,设定多个处理程序会被下面的覆盖。
③DOM2 级事件处理程序
<body>
<button id="myBtn">按钮</button>
<script type="text/javascript">
var btn = document.getElementById('myBtn')
btn.addEventListener('click',function(){
alert('you add a eventListener by DOM2')
},false)
btn.addEventListener('click',function(){
alert('you add a eventListener by DOM2 again')
},false)
function thread(){
alert('you add a eventListener by DOM2 第三次')
}
btn.addEventListener('click',thread,false)
btn.removeEventListener('click',thread,false)
</script>
</body>
这种⽅式可以为同⼀个元素的同⼀个事件添加多个处理函数。还可删除事件处理函数,注意,在删除的时候,不能删除匿名处理函数。
回到目录…
3.3.2 常用事件
JavaScript 可以处理的事件类型为:⿏标事件、键盘事件、HTML事件。
HTML 事件参考手册:https://www.w3school.com.cn/tags/html_ref_eventattributes.asp
事件 | 说明 |
---|---|
onload | 当⻚⾯或图像加载完后⽴即触发 |
onclick | ⿏标点击某个对象 |
onblur | 元素失去焦点 |
onfocus | 元素获得焦点 |
onchange | ⽤户改变域的内容 |
onmouseover | ⿏标移动到某个元素上 |
onmouseout | ⿏标从某个元素上离开 |
onkeyup | 某个键盘的键被松开 |
onkeydown | 某个键盘的键被按下 |
①onload:当页面或图像加载完后立即触发
<button type="button" onclick="clickBtn()">按钮</button>
<script type="text/javascript">
function clickBtn(){
console.log("按钮被点击了...");
}
</script>
②onclick:鼠标点击某个对象
<script type="text/javascript">
window.onload = function(){
console.log("页面加载完毕...");
}
</script>
③onblur:元素失去焦点、onfocus:元素获得焦点
<form>
姓名:<input type="text" id="uname" >
</form>
<script type="text/javascript">
var uname = document.getElementById("uname");
// onblur:元素失去焦点
uname.onblur = function(){
console.log("文本框失去焦点...");
}
// onfocus:元素获得焦点
uname.onfocus = function(){
console.log("文本框获得焦点...");
}
</script>
④onchange:用户改变域的内容
<form>
城市:<select id="city">
<option>请选择城市</option>
<option>上海</option>
<option>北京</option>
</select>
</form>
<script type="text/javascript">
// onchange:用户改变域的内容
document.getElementById("city").onchange = function(){
console.log("下拉框的值改变了...");
}
</script>
⑤onmouseover:鼠标悬停,onmouseout:鼠标移开
<div id="div1">这是一个div</div>
<script type="text/javascript">
var div1 = document.getElementById("div1");
// onmouseover:鼠标移动到某个元素上
div1.onmouseover = function(){
console.log("鼠标悬停...");
}
// onmouseout:鼠标从某个元素上离开
div1.onmouseout = function(){
console.log("鼠标移开...");
}
</script>
⑥onkeyup:键盘松开,onkeydown:键盘按下
<form>
姓名:<input type="text" id="uname" >
</form>
<script type="text/javascript">
var uname = document.getElementById("uname");
// onkeyup:某个键盘的键被松开
uname.onkeydown = function(){
console.log("按键按下...");
}
// onkeydown:某个键盘的键被按下
uname.onkeyup = function(){
console.log("按键弹起...");
}
</script>
回到目录…
3.4 WebAPI-Bom对象
BOM 的核⼼对象是 window
,它表示浏览器的⼀个实例。window 对象有双重角色,它既是通过 JavaScript 访问浏览器窗⼝的⼀个接⼝,又是 ECMAScript 规定的 Global 对象。这意味着在网页中定义的任何⼀个对象、变量和函数,都以 window 作为其 Global 对象,因此有权访问 parseInt() 等⽅法。如果页面中包含框架,则每个框架都拥有自己的 window 对象,并且保存在 frames 集合中。在 frames 集合中,可以通过数值索引(从0开始,从左⾄右,从上到下)或者框架的名称来访问相应的 window 对象。
3.4.1 window 对象
①系统对话框
消息框:alert()
方法用于显示带有一条指定消息和一个 OK 按钮的警告框。
window.alert("Hello");
输入框:prompt()
方法用于显示可提示用户进行输入的对话框, 可以返回值。
// 参数(可选):第一个参数:要在对话框中显示的纯文本。第二个参数:默认的输入文本。
var uname = window.prompt("请输入用户名:","");
确认框:confirm()
方法用于显示一个带有指定消息和 OK 及取消按钮的对话框。
var flag = confirm("您确认要删除该记录吗?");
②打开/关闭窗口
打开窗口:window.open()
方法既可以导航到一个特定的URL也可以用来打开一个新的窗口。
// 打开空白窗口
window.open();
// 打开指定页面
window.open("系统对话框.html");
// 不打开新窗口的方式打开页面
window.open("http://www.baidu.com","_self");
关闭窗口:window.close()
关闭窗口。
window.close();
③时间函数
setTimeout()
:在指定的毫秒数后调用函数或计算表达式。返回一个唯一的标识;也可以通过返回的标识 clearTimeout(id)
来清除指定函数的执行。
// 开启定时函数
var id = setTimeout(function,times);
// 停止/清除定时函数
clearTimeout(id);
setInteval()
:可按照指定的周期(以毫秒计)来调用函数或计算表达式,也可根据返回的标识用来结束。该方法会不停地调用函数,直到 clearInterval()
被调用或窗口被关闭。
setInteval(function,times);
3.4.2 history 对象
history 对象是历史对象。包含⽤户(在浏览器窗⼝中)访问过的 URL。history 对象是 window 对象的⼀部分,可通过 window.history
属性对其进⾏访问。
- history 对象的属性:
length
,返回浏览器历史列表中的 URL 数量。 - history 对象的方法:
back()
:加载 history 列表中的前一个 URL。forward()
:加载历史列表中的下一个 URL。当页面第一次访问时,还没有下一个 URL。go(number|URL)
:URL 参数使用的是要访问的 URL。而 number 参数使用的是要访问的 URL 在 History 的 URL 列表中的相对位置。如,go(-1) 到上一个页面。
// 打印当前页面的历史记录长度
console.log(window.history.length);
// 页面后退
window.history.back();
// 页面前进
window.history.forward();
// 跳转到某个页面
window.history.go("https://www.baidu.com");
3.4.3 location 对象
location 对象是 window 对象之⼀,提供了与当前窗⼝中加载的⽂档有关的信息,还提供了⼀些导航功能。也可通过 window.location
属性来访问。
- location 对象的属性:
href
,设置或返回完整的 URL。 - location 对象的方法:
reload()
:重新加载当前⽂档。replace()
:⽤新的⽂档替换当前⽂档,替代后的新文档是没有历史记录的。
// 打印当前页面的URL
console.log(window.location.href);
// 重新加载
window.location.reload();
// 替换页面
window.location.replace("https://www.baidu.com");
回到目录…
3.5 WebAPI-Dom对象
DOM:Document Object Model ⽂档对象模型。
要实现页面的动态交互效果,Bom 操作远远不够,需要操作 html 才是核⼼。如何操作 html,就是 DOM。简单的说,dom 提供了应用程序动态控制 html 接⼝。DOM 即⽂档对象模型描绘了⼀个层次化的节点树,运⾏开发⼈员添加、移除和修改⻚⾯的某⼀部分。Dom 处于 javascript 的核心地位上。
每个载⼊浏览器的 HTML ⽂档都会成为 Document 对象。Document 对象使我们可以从脚本中对 HTML 页面中的所有元素进⾏访问。Document 对象是 Window 对象的⼀部分,可通过 window.document
属性对其进⾏访问。
节点类型 | HTML内容 | 例如 |
---|---|---|
⽂档节点 | ⽂档本身 | 整个⽂档 document |
元素节点 | 所有的HTML元素 | h、p、div、img 等 |
属性节点 | HTML元素内的属性 | id、href、name、class 等 |
文本节点 | 元素内的⽂本 | hello |
注释节点 | HTML中的注释 | <!-- 注释 --> |
注意:操作 Dom 必须等节点初始化完毕后,才能执⾏。
处理方式两种:
(1)把 script 调⽤标签移到 html 末尾即可;
(2)使⽤ onload 事件来处理 JS,等待 html 加载完毕再加载 onload 事件⾥的 JS。
window.onload = function () { // 预加载 html 后执⾏};
3.5.1 获取节点
方法 | 描述 |
---|---|
getElementById() | 根据 id 获取dom对象,如果id重复,那么以第⼀个为准 |
getElementsByTagName() | 根据标签名获取dom对象数组 |
getElementsByClassName() | 根据 class 名获取dom对象数组 |
getElementsByName() | 根据 name 属性值获取dom对象数组,常⽤于多选获取值 |
<p id="p1" class="para" name="text">这又是一个段落</p>
var p1 = document.getElementById("p1");
var p2 = document.getElementsByTagName("p")[0];
var p3 = document.getElementsByClassName("para")[0];
var p4 = document.getElementsByName("text")[0];
3.5.2 创建/插入节点
创建方法 | 描述 |
---|---|
createElement() | 创建⼀个新的节点,需要传⼊节点的标签名称,返回创建的元素对象 |
createTextNode() | 创建⼀个⽂本节点,可以传⼊文本内容 |
innerHTML | 也能达到创建节点的效果,直接添加到指定位置了 |
插入方法 | 描述 |
---|---|
write() | 将任意的字符串插⼊到⽂档中 |
appendChild() | 向元素中添加新的子节点,作为最后⼀个子节点 |
insertBefore() | 向指定的已有的节点之前插⼊新的节点。newItem(要插⼊的节点)、exsitingItem(父节点作为参考) |
<div id="div1"></div>
方式一:在 div 中添加一个超链接。innerHTML
最常用。
// 先获取节点
var div = document.getElementById("div1");
var a = `<a href='https://www.baidu.com'>百度</a>`;
div.innerHTML += a;
方式二:在 div 中添加一句文本。createElement()
和 appendChild()
配合使用。
// 先获取节点
var div = document.getElementById("div1");
// 创建元素节点
var p = document.createElement("p");
// 创建文本节点
var txt = document.createTextNode("这是一段文本");
// 将文本节点追加到元素节点中
p.appendChild(txt);
// 将p标签设置到div中
div.appendChild(p);
方式三:在 div 的最开始添加一张图片。了解 insertBefore()
用法。
// 先获取父节点
var div = document.getElementById("div1");
// 创建元素节点
var img = document.createElement("img");
img.src = "img/cat.png";
// 再获取参照节点
var p = document.getElementsByTagName("p")[0];
// 插入元素到最开始
div.insertBefore(img, p);
方式四:在文档末尾插入一句文本。了解 write()
用法。
document.write("<p>你好</p>");
3.5.3 间接查找节点
方法 | 描述 |
---|---|
childNodes | 返回元素的⼀个子节点的数组 |
firstChild | 返回元素的第⼀个子节点 |
lastChild | 返回元素的最后⼀个子节点 |
nextSibling | 返回元素的下⼀个兄弟节点 |
parentNode | 返回元素的父节点 |
previousSibling | 返回元素的上⼀个兄弟节点 |
<ul>
<li id="red">红色</li>
<li>绿色</li>
</ul>
// 得到ul
var ul = document.getElementsByTagName("ul")[0];
// childNodes 返回元素的一个子节点的数组
console.log(ul.childNodes);
// children 返回元素的所有的子元素数组
console.log(ul.children);
// firstChild 返回元素的第一个子节点
console.log(ul.firstChild);
console.log(ul.firstElementChild);
// lastChild 返回元素的最后一个子节点
console.log(ul.lastChild);
console.log(ul.lastElementChild);
// nextSibling 返回元素的下一个兄弟节点
console.log(document.getElementById("red").nextSibling);
console.log(document.getElementById("red").nextElementSibling);
// previousSibling 返回元素的上一个兄弟节点
console.log(document.getElementById("red").previousSibling);
console.log(document.getElementById("red").previousElementSibling);
// parentNode 返回元素的父节点
console.log(ul.parentNode);
// parentElement
console.log(ul.parentElement);
3.5.4 删除节点
方法 | 描述 |
---|---|
removeChild() | 从元素中移除⼦节点 |
// 得到被删除的对象
var span = document.getElementById("programmer");
// 得到被删除的对象的父元素
var parent = span.parentElement;
// 父元素删除子元素
parent.removeChild(span);
回到目录…
3.5 WebAPI-表单
表单是我们页面向后台传输数据的⼀种⾮常常见的⽅式,在进行数据发送(请求发出)之前,我们应该现在页面进⾏⼀系列数据合法性的验证,节省不必要的错误数据的传输,以及提高用户的体验度。
3.5.1 获取表单
方式一: document.表单name名
方式二: document.getElementById(表单 id);
方式三: document.forms[表单name名];
方式四: document.forms[索引];
3.5.2 获取表单元素
①获取input元素
方式一: 通过 id 获取: document.getElementById(元素 id);
方式二: 通过 form名称.元素名称 获取: 如 myform.uname;
方式三: 通过 name 获取: document.getElementsByName(name属性值)[索引] // 从0开始
方式四: 通过 tagName 数组: document.getElementsByTagName('input')[索引] // 从0开始
<body>
<form id='myform' name="myform" action="" method="get">
姓名:<input type="text" id="uname" name="uname" value="zs"/><br />
密码:<input type="password" id="upwd" name="upwd" value="1234"/><br />
<input type="hidden" id="error" name="error" value="隐藏域" />
个⼈说明:<textarea name="info"></textarea>
<button type="button" onclick="getTxt();" >获取元素内容</button>
</form>
</body>
<script>
function getTxt(){
var uname = myform.uname;
var upwd = document.getElementsByTagName('input')[1] ;
var info = document.getElementsByName("info")[0];
var error = document.getElementById("error");
console.log(uname.value +", "+ upwd.value +", "+ info.value);
}
</script>
②获取单选按钮
第一步: 获取单选按钮组, document.getElementsByName("name属性值");
第二步: 遍历每个单选按钮,并查看单选按钮元素的 checked 属性。若属性值为true表示被选中,否则未被选中
<body>
<form action="" name="myform">
<input type="radio" name="sex" value="男" /> 男
<input type="radio" name="sex" value="女" /> 女
<button type="button" onclick="test1()">提交</button>
</form>
</body>
<script type="text/javascript">
function test2() {
var radios = document.getElementsByName('sex');
var sex = null;
for (var i = 0; i < radios.length; i++){
if(radios[i].checked){
sex = radios[i].value;
}
}
console.log(sex);
if(favs.length == null) {
alert("请选择性别");
}
}
</script>
③获取多选按钮
<body>
<form action="" name="myform">
<input type="checkbox" name="hobby" value="游泳"> 游泳
<input type="checkbox" name="hobby" value="羽毛球"> 羽毛球
<input type="checkbox" name="hobby" value="足球"> 足球
<button type="button" onclick="test2()">提交</button>
</form>
</body>
<script type="text/javascript">
function test1() {
var hobbys = document.getElementsByName("hobby");
var favs = [];
for (var i = 0; i < hobbys.length; i++){
if(hobbys[i].checked){
favs.push(hobbys[i].value);
}
}
console.log(favs);
if(sex == 0) {
alert("请至少选择一项");
}
}
</script>
④获取下拉菜单
<body>
<form id='myform' name="myform" action="" method="">
来⾃:<select id="selects" name="selects">
<option value="-1">请选择</option>
<option value="北京">北京</option>
<option value="上海">上海</option>
</select>
<button type="button" onclick="test3()">提交</button>
</form>
</body>
<script>
function test3() {
// 获取select对象
var selects = document.getElementById("selects");
// 获取选中的索引
var idx = selects.selectedIndex;
console.log("选中项的索引值:" + idx);
// 获取选中项的value值
var val = selects.options[idx].value;
console.log("选中项的value属性值:" + val);
// 获取选中项的text
var txt = selects.options[idx].text;
console.log("选中项的text:" + txt);
}
</script>
回到目录…
3.5.3 提交表单
方式一:使用普通button按钮 + onclick事件 + 函数获取表单.submit()
<body>
<form id='myform1' name="myform2" action="http://www.baidu.com" method="post" >
姓名:<input type="text" id="uname"/>
<input type="button" value="提交表单" onclick="submitForm()"/>
</form>
</body>
<script type="text/javascript">
function submitForm() {
// 获取姓名文本框的值
var uname = document.getElementById("uname").value;
if (uname == null || uname.trim() == "") {
alert("用户名不能为空!");
return;
}
// 提交表单
document.getElementById("myform1").submit();
}
</script>
方式二:使⽤submit按钮 + onclick="return 函数()"
+ 函数return true|false;
<body>
<form id='myform2' action="http://www.baidu.com" method="post" >
姓名:<input type="text" id="uname2"/>
<input type="submit" value="提交表单" onclick="return submitForm2()" />
</form>
</body>
<script type="text/javascript">
function submitForm2() {
var uname = document.getElementById("uname2").value;
if (uname == null || uname.trim() == "") {
alert("用户名不能为空!");
return false;
}
return true;
}
</script>
方式三:使⽤submit按钮 + 表单onsubmit="return 函数()"
+ 函数return true|false;
<body>
<!-- 直接提交,不检验 -->
<form id='myform3' action="" method="post">
姓名:<input type="text" id="uname3"/>
<input type="submit" value="提交表单" />
</form>
<!-- 先检验,再提交 -->
<form id='myform4' action="" method="post" onsubmit="return submitForm4();">
姓名:<input type="text" id="uname4"/>
<input type="submit" value="提交表单" />
</form>
</body>
<script type="text/javascript">
function submitForm4() {
var uname = document.getElementById("uname4").value;
if (uname == null || uname.trim() == "") {
alert("用户名不能为空!");
return false;
}
return true;
}
</script>
回到目录…
3.6 WebAPI-Ajax请求
3.6.1 Get 请求
①无参 Get 请求:
@GetMapping("/books")
public List<Book> bookList() {
return bookService.getBooks();
}
<body>
<table id="table" border="1px">
<tr>
<th>序号</th>
<th>标题</th>
<th>描述</th>
</tr>
</table>
</body>
<script>
// 1.创建请求对象
var xhr = new XMLHttpRequest();
// 2.配饰请求方法,设置请求接口地址
xhr.open('get','/books')
// 3. 响应后返回的数据
xhr.onload = function() {
// 将后端的响应结果(JSON数据)进行反序列化
var books = JSON.parse(this.responseText);
// 修改 DOM 树,将数据填充到 DOM 树中
var table = document.getElementById("table");
books.forEach(function(book) {
var tbody = `<tr><td>${book.bid}</td><td>${book.title}</td><td>${book.desc}</td></tr>`;
table.innerHTML += tbody;
});
}
// 4.发送请求
xhr.send()
</script>
②有参 Get 请求:
@GetMapping("/book")
public Book findBookById2(int bid) {
return bookService.getBookById(bid);
}
<body>
<form action="">
请输入要查找的书籍ID: <input type="text" id="input"><br>
<button onclick="find()">查找</button><br>
</form>
</body>
<script>
function find() {
var input = document.getElementById("input");
var id = input.value;
// 1.创建请求对象
var xhr = new XMLHttpRequest()
// 2.配饰请求方法,设置请求接口地址
xhr.open('get','/book?bid=' + id)
// 3. 响应后返回的数据
xhr.onload = function() {
alert(this.responseText);
}
// 4.发送请求
xhr.send()
}
</script>
回到目录…
3.6.2 Post 请求
一般用户向服务器提交数据都是 Post 请求:
@PostMapping("/addBook")
public Boolean add(@RequestBody Book book) {
return bookService.addBook(book) > 0;
}
<body>
<button onclick="add()">添加书籍</button>
</body>
<script>
function add() {
// 1. 创建对象
var book = new Object();
book.bid = 7;
book.title = "捉妖记";
book.desc = "从前有一堆可爱的小妖怪";
var bookJSON = JSON.stringify(book);
// 2. 创建请求对象
var xhr = new XMLHttpRequest()
// 3. 调用open方法,设置请求方法和请求路径
xhr.open("POST", "/addBook");
// 4. 设置请求头
xhr.setRequestHeader("Content-Type", "application/json");
// 5. 响应后返回的数据
xhr.onload = function() {
var ret = JSON.parse(this.responseText);
if(ret) {
document.write("添加成功");
}
}
// 6. 发送请求,将请求参数传入请求体中
xhr.send(bookJSON);
}
</script>
回到目录…
总结:
提示:这里对文章进行总结:
本文是对前端部分的学习,一篇文章学会HTML+CSS+JavaScript,从此自己也可以写出好看的页面了。之后的学习内容将持续更新!!!