JavaScript基础

文章目录

JavaScript基础(语法、变量)

一、JavaScript简介

* 概念:一门客户端脚本语言

  • 运行在客户端浏览器中的。每一个浏览器都有Javascript的解析引擎
  • 脚本语言:不需要编译,直接就可以被浏览器解析执行了

* 功能 :

  • 可以来增强用户和html页面的交互过程,可以来控制html元素,让页面有一些动态的效果,增强用户的体验。
  • JavaScript =ECMAScript + JavaScript自己特有的东西(BOM+DOM)

1. ECMAScript : 客户端脚本语言的标准

1.基本语法

1. 与html结合方式

1.内部JS :

  • 定义<script>,标签体内容就是js代码

​ 2. 外部JS :

​ * 定义<script>,通过src属性引入外部的 js文件

​ * 注意:

​ 1. <script>可以定义在html页面的任何(符合语法规则)地方。但是定义的位置会影响执行顺序。

​ 2. <script>可以定义多个

2. 注释
  1. 单行注释: // 注释内容
  2. 多行注释: /* 注释内容 */
3. 数据类型:
  1. 原始数据类型(基本数据类型) :
    1. number :数字。整数/小数/NaN(not a number -个不是数字的数字类型)
    2. string:字符串。字符串 ”abc" “a” ‘abc’
    3. boolean: true和false
    4. null : 一个对象为空的占位符
    5. undefined : 未定义时,默认的类型。
    2.引用数据类型: 对象
4. 变量
  • 变量:一小块存储数据的内存空间

    • Java语言是强类型语言, 而JavaScript是弱类型语言。
      • 强类型:在开辟变量存储空间时,定义了空间将来存储的数据的数据类型。只能存储固定类型的数据
      • 弱类型:在开辟变量存储空间时,不定义空间将来的存储数据类型,可以存放任意类型的数据。
    • 语法:
      • var 变量名=初始化值;
    • 验证类型:
      document.write(typeof(num)); //打印在页面
      其中,typeof 运算符对于 null 值 返回 “object”,这其实是JavaScript中的一个bug,然后被ECMAScript沿用了,现在null 被认为是对象的占位符,从而解释了这一矛盾
5. 运算符
  1. 一元运算符:只有一个运算数的运算符
     ++    --   +(正号)
      其中,++  --:自增(自减)
          当++或--在前,先自增或自减,再运算
          当++或--在后,先运算,在自增或自减
    
  2. 算术运算符
     ​      +   -    *    /   % 
    
  3. 赋值运算符
    =   +=   -+ ...
    
  4. 比较运算符

    < >= == ===(全等于)
    其中比较方式:

    1. 类型相同:直接比较
      • 字符串,按照字典顺序比较,按位逐一比较,直接得出大小为止
    2. 类型不同:先进行类型转换,再比较
      • ===,全等于。在比较之前,先判断类型,如果类型不一样,则直接返回false
  5. 逻辑运算符

    && || !

  6. 三元运算符

    ? :

7. 注意:

在 JS 中,如果运算符不是运算符所要求的类型,那么 JS引擎会自动的将运算数进行类型转换

​ 其他类型转number:

  • string 转number:按照字面值转换,若字面值不是数字,则转为NaN(不是数字的数字)

    • boolean 转number:true转为1,false转为0
8. 流程控制语句(和Java类似)

(1)if…else…
(2)switch:
* 在java中,switch语句可以接受的数据类型: byte int short char ,枚举(1.5), string(1.7)
格式:switch(变量):
case 值:
* 在JS中, switch语句可以接受任意的原始数据类型
(3) while
(4) do… .while
(5) for

9. JS 中的特殊语法

(1)语句以分号结尾,如果一行只有一条语句,则可以省略(不建议)
(2)变量定义使用 var关键字,也可以不使用
用的话,定义的是局部变量
不用的话,定义的辩论是全局变量(不建议)

2.基本对象

(1)Function:函数(方法)对象

​ 1)创建:
​ a. var fun=new Function(形式参数列表,方法体); //不建议
​ b. function 方法名称(形式参数列表){
​ 方法体
​ }
​ c. var 方法名=function(形式参数列表){
​ 方法体
​ }

​ 2)方法:
​ 3)属性:
​ length:代表形参的个数
​ 4)特点:
​ a.方法定义时,形参的类型可以不用写,返回值类型也不写
​ b.方法是一个对象,如果定义名称相同的方法,会覆盖(方法调用只与方法名称有关)
​ c.在JS中,方法的调用只与方法的名称有关,和参数列表无关(个数也无关)
​ d.在方法声明中有一个隐藏的内置对象(数组),arguments,封装所有的实际参数

//求任意个数的数的和
function add(){
    var sum=0;
    for(var i=0; i< arguments.length; i++){
        sum +=arguments[i];
    }
    return sum;
}
(2)Array:数组对象

​ 1)创建
​ a. var arr=new Array(元素列表);
​ b. var arr=new Array(默认长度);
​ c. var arr=[元素列表];
​ 2)方法
​ join(参数) 将数组中的元素按照指定的分隔符拼接为字符串
​ push( ) 向数组的末尾添加一个或更多元素,并返回新的长度。
​ 3)属性
​ length:数组的长度
​ 4)特点:
​ a. 在JS中,数组的元素类型可变的
​ b. 在JS中,数组的长度可变的。

(3)Date:日期对象

​ 1)创建:
​ var date=new Date();
​ 2)方法:
​ toLocaleString():返回当前date 对象对应的时间本地字符串格式
​ getTime():获取毫秒数。返回当前日期对象描述的时间到1970年1月1日零点的毫秒数。
​ 3)更多方法看JavaScript手册https://www.w3school.com.cn/jsref/jsref_obj_date.asp

(4)Math:数学

​ 1)创建:
​ 特点:Math对象不用创建,直接使用。 Math.方法名();
​ 2)方法:
​ random():返回 0~1 之间的随机数。 含0不含1
​ ceil(x): 对数进行上舍入。
​ floor(x): 对数进行下舍入。
​ round(x): 对数进行四舍五入为最接近的整数。
​ 3)属性:
​ PI 圆周率

       /*
       *  取 1~100之间的随机整数
       *  1.Math.random()产生随机数,范围(0,1]小数
       *  2.乘以100--->[0,99.9999]小数
       *  3. 舍弃小数部分:floor--->[0,99]整数
       *  4.+1--->[0,99] 整数[1,100]
       */
       var number=Math.floor((Math.random()*100))+1;
       document.write(number);
(5)Number
(6)String
(7)RegExp:正则表达式对象

​ 1)正则表达式:定义字符串的组成规则。
​ a.单个字符:[ ]
​ 如:[a] [ab] [a-zA-Z0-9_]
​ 特殊字符代表特殊含义的单个字符:
​ \d:单个数字字符[0-9]
​ \w:单个单词字符[a-zA-Z0-9]
​ b. 量词符号:
​ ?:表示出现0次或1次
* :表示出现0次或多次
+ :出现1次或多次
{m,n}:表示 m<= 数量 <=n
当m缺省时,即{ , n} 表示最多n次
当n 缺省时,即{m, } 表示最少m次
2)正则对象:
a. 创建
第一种:var reg=new RegExp(“正则表达式”);
第二种:var reg=/正则表达式/;
b. 方法
* test(参数):验证指定的字符串是否符合正则定义的规范
c.补充:
转义字符 \:若想要表示常规的字符\,则可多打一个
符号 ^ 表示开始,$ 表示结束 eg.var username=/^\w{6,12}$/;表示6-12位单词字符构成

(8)Global

​ 1)特点:全局对象,这个Global 中封装的方法不需要对象就可以直接调用。 方法名()。
​ 2)方法:
​ encodeURI():编码为 URI。
​ decodeURI(): url解码。
​ 这两组有区别
​ encodeURIComponent():url编码,编码的字符更多
​ decodeURIComponent():url解码

​ parseInt( ): 将字符转为数字
​ * 逐一判断每一个字符是否是数字,直到不是数字为止,将前边数字部分转为number
​ isNaN( ): 判断一个值是否为NaN
​ * NaN 六亲不认,连自己的都不认。NaN 参与的 == 全等于全部都为false
​ eval( ):计算 JavaScript 字符串,并把它作为脚本代码来执行。

/*
*   判断是否是NaN 需要通过方法isNaN
*/
    var a=NaN;
    document.write(a==NaN);       //无法判断,结果为false
    document.write(isNaN(a));
​

JavaScript基础

2.DOM 简单学习

(1)功能:控制html的文档内容
(2)获取页面标签(元素)对象:Element
document.getElementById(“id值”):通过元素的id获取元素对象
(3)操作Element对象:
​ 1) 修改属性值:
a.明确获取对象是哪一个?
b.查看API文档,找其中可以设置的属性https://www.w3school.com.cn/jsref/dom_obj_all.asp
​ 2)修改标签体内容:
属性: innerHTML
a. 获取元素对象
b.使用innerHTML属性修改标签体内容

3. 事件简单学习

​ (1)功能:某些组件被执行某些操作后,触发某些代码的执行。
​ (2)如何绑定事件
​ 1)直接在html 标签上,指定的属性(操作),属性值就是JS代码(不推荐,代码耦合度高,难以维护)
​ a.事件:onclick—单击事件

<img id="light"  src=""   οnclick="fun();">      <!--fun()是JS 函数-->

​ 2)通过JS 获取元素对象,指定事件属性,设置一个函数

/* 获取light对象*/
var light=document.getElementById("light");
//绑定单击事件
			light.onclick=function(){
				...
			}			

4. 一个简单的电灯开关案例

(1)电灯图片:点击图片,则灯的颜色变化,显示出开灯关灯的效果
JavaScript基础JavaScript基础

<!DOCTYPE html>
<html  lang="en">
	<head>
		<meta charset="utf-8" />
		<title>电灯开关</title>
	</head>
	<body>
		<img id="light" src="img/off.png" /><!---->
		<script>
			/*
			 * 分析:
			 * 1.获取图片对象
			 * 2.绑定单击事件
			 * 3.每次点击切换图片
			 *    规则:
			 *          如果灯是开的 on,切换图片为 off
			 *          如果灯是关的 off,切换图片为on
			 *    使用标记 flag来完成
			 */
			/* 获取light对象*/
			var light=document.getElementById("light");
			var flag=false;         //代表灯是灭的。off图片
			
			//绑定单击事件
			light.onclick=function(){
				if(flag){       //判断如果灯是开的,则灭掉
					light.src="img/off.png";
					flag=false;
				}else{
					light.src="img/on.png";
					flag=true;
				}
			}
		</script>
	</body>
</html>

5. BOM对象

(1)概念

​ Browser Object Model 浏览器模型
​ 将浏览器的各个组成部分封装成对象

(2)组成

​ Window
​ Navigator
​ Screen
​ History
​ Location

(3)Window:窗口对象

​ 1)创建
​ Window对象不需要创建

​ 2)方法
​ a.与弹出框有关的方法:
​ alert() 显示带有一段消息和一个确认按钮的警告框。
​ confirm() 显示带有一段消息以及确认按钮和取消按钮的对话框。 其中,如果用户点击确定按钮,则方法返回true;如果用户点击取消按钮,则方法返回false。
​ prompt() 显示可提示用户输入的对话框。 返回值:获取用户输入的值

​ b.与打开关闭有关的方法:
​ open() 打开一个新的浏览器窗口或查找一个已命名的窗口。会返回一个新的Window对象。
​ close() 关闭浏览器窗口。注意是关闭调用该方法的窗口。

​ c.与定时器有关的方法
​ setTimeout() 在指定的毫秒数后调用函数或计算表达式。
​ * 参数:JS代码或者方法对象; 毫秒值
​ * 返回值:唯一标识,用于取消定时器。
​ clearTimeout() 取消由 setTimeout() 方法设置的 timeout。

​ 3)属性:

​ a.获取其他BOM对象:Navigator, Screen,History, Location
​ b. 获取DOM对象:document

​ 4)特点
​ * Winow 对象不需要创建可以直接使用 window使用。wondow.方法名();
​ * window引用可以省略,即Window 对象的使用可以直接写方法名:方法名();

(4)Location:地址栏对象

​ 1)创建(获取):
​ a. Window.location
​ b. location

​ 2)方法:
​ reload() 重新加载当前文档,即刷新。

​ 3)属性
​ href:设置或返回完整的 URL。

(5)History:历史记录对象(仅仅是当前窗口的)

​ 1)创建(获取):
​ a. window.history
​ b.history

​ 2) 方法:
​ back() 加载 history 列表中的前一个 URL。
​ forward() 加载 history 列表中的下一个 URL。
​ go(参数) 加载 history 列表中的某个具体页面。
​ 若参数为正数,则前进几个历史记录;若参数为负数,则后退几个历史记录

​ 3)属性:
​ length: 返回当前窗口历史记录中的 URL 数量。

6. 轮播图 案例

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>图片轮播</title>
	</head>
	<body>
		<img  id="img" src="img/banner1.jpg"  width="100%" />
		
		<script>
			/**
			 * 分析:
			 * 1.在页面上使用img 标签展示图片
			 * 2.定义一个方法,修改图片对象的src属性
			 * 3.定义一个定时器
			 * 
			 * 注意:
			 * 图片的img标签与JS的script标签顺序,
			 * 该顺序与调用顺序有关,
			 * 若JS代码在前,当资源很多时,有可能会加载不出来
			 *
			 */
			
			//修改图片的src属性
			var number=1;
			function fun () {
				number ++;
				if(number >3){   //一共三张图片
					number=1;
				}
				//获取img 对象
				var img=document.getElementById("img");
				img.src="img/banner"+ number+".jpg";
			}
			
			// 设置定时器
			setInterval(fun,2000);          //每两秒换一次		
		</script>
	</body>
</html>

7. 自动跳转页面 案例

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>自动跳转到首页</title>
		<style>
			p{
				text-align: center;
			}
			span{
				color: red;
			}
			
		</style>
		
	</head>
	<body>
		<p>
			<span id="time">5</span> 秒之后,自动跳转到首页
		</p>
		
		<script>
			/*
			 * 分析:
			 *  1.显示页面效果   <p>
			 *  2.倒计时读秒效果实现:
			 *     (1)定义一个方法,获取span 标签,修改span标签体内容,时间
			 *     (2)定义一个定时器,1秒执行该方法
			 *  3. 在方法中判断时间如果<=0,则 跳转到首页
			 * 
			 * 
			 * */
			
			//倒计时读秒效果实现
			
			var second=5;
			var time= document.getElementById("time");
			
			//定义一个方法,获取span标签,修改标签体内容,时间
			function showTime(){
				second --;
				
				if(second <=0){
					location.href="http://www.baidu.com";
				}
				time.innerHTML=second+"";   // DOM 使用innerHTML属性修改标签体内容
			}
			
			//设置定时器, 1 秒执行一次该方法
			setInterval(showTime,1000);
		
		</script>
	</body>
</html>

8. DOM对象

(1)概念

DOM:Document Object Model 文档对象模型;
将标记语言文档的各个组成部分,封装成对象。可以使用这些对象,对标记语言文档进行CRUD的动态操作。

DOM树JavaScript基础

DOM 是 W3C(万维网联盟)的标准。
DOM 定义了访问 HTML 和 XML 文档的标准:
“W3C 文档对象模型 (DOM) 是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。”

(2) W3C DOM 标准被分为 3 个不同的部分:

​ 1)核心 DOM - 针对任何结构化文档的标准模型
​ * Docuent:文档对象
​ * Element:元素对象
​ * Attribute:属性对象
​ * Text:文本对象
​ * Comment: 注释对象

​ * Node: 节点对象,其他5个对象的父对象

​ 2)XML DOM - 针对 XML 文档的标准模型
​ 3)HTML DOM - 针对 HTML 文档的标准模型

(3)核心DOM模型

1)Document:文档对象

​ (1)创建(获取):在html dom模型中可以使用window对象来获取
​ a. window.document
​ b. document
​ (2)方法:https://www.w3school.com.cn/xmldom/dom_document.asp
​ a. 获取Element对象:
​ getElementById(): 根据元素id属性值获取元素对象。id属性值一般唯一。
​ getElementsByTagName(): 根据元素名称获取元素对象们。返回值是一个数组。
​ getElementsByClassName():根据class属性值获取元素对象们。返回值是一个数组。
​ getElementsByName():根据name属性值获取元素对象们。返回值是一个数组。

​ b.创建其他DOM对象:
​ createAttribute(name):创建拥有指定名称的属性节点,并返回新的 Attr 对象。
​ createComment():创建注释节点。
​ createElement():创建元素节点。
​ createTextNode():创建文本节点。

<!-- 使用Document的常用方法 -->
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>Document对象</title>
	</head>
	<body>
		<div id="div1">div1</div>
		<div id="div2">div2</div>
		<div id="div3">div3</div>
		
	    <div class="cls1">div4</div>
	    <div class="cls1">div5</div>
	    
	    <input type="text" name="username" />
	    
	   <script>
	   	
	   	//根据元素名称获取元素对象们。返回值是一个数组。
        var divs=document.getElementsByTagName("div");
        //alert(divs.length);
        //根据class属性值获取元素对象们。返回值是一个数组。
        var div_cls=document.getElementsByClassName("cls1");
        //alert(div_cls.length);
        //根据name属性值获取元素对象们。返回值是一个数组。
	   	var ele_username=document.getElementsByName("username");
	   	//alert(ele_username.length);

        var table=document.createElement("table");
        alert(table);
        
	   </script>	
	</body>
</html>

​ (3)属性:

2)Element:元素对象

​ (1)获取(创建):通过 document 来获取和创建
​ (2)方法:
​ removeAttribute( ):删除属性
​ setAttribute( ): 设置属性

<!--Element对象-->
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>Element对象</title>
	</head>
	<body>
		<a>点我</a>
		<input type="button" id="btn_set" value="设置属性" />
		<input type="button" id="btn_remove" value="删除属性" />
		
		<script>
			//获取btn
			var btn_set=document.getElementById("btn_set");
			btn_set.onclick=function(){
				//1.获取 a标签
				var element_a=document.getElementsByTagName("a")[0];
				element_a.setAttribute("href","https://www.baidu.com");
			}
			//移除btn
			var btn_remove=document.getElementById("btn_remove");
			btn_remove.onclick=function(){
				//1.获取a标签
				var element_a=document.getElementsByTagName("a")[0];
				element_a.removeAttribute("href");
			}

		</script>
		
	</body>
</html>

3)Node:节点对象,其他5个的父对象

​ (1)特点:所有 dom 对象都可以被认为是一个节点
​ (2)方法:https://www.w3school.com.cn/xmldom/dom_node.asp
​ CRUD dom树:
​ appendChild() 向节点的子节点列表的结尾添加新的子节点。
​ removeChild() 删除(并返回)当前节点的指定子节点。
​ replaceChild() 用新节点替换一个子节点。
​ (3)属性:
​ parentNode:返回当前节点的父节点。

<!---->
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>Node对象</title>
		<style>
			div{
				border: 2px solid red;
			}
			#div1{
				width: 300px;
				height: 300px;
			}
			#div2{
				width: 100px;
				height: 100px;
			}
			#div3{
				width: 100px;
				height: 100px;
			}
		</style>
		
	</head>
	<body>
		<div id="div1">
			<div id="div2">div2</div>
			div1
		</div>	
		<!--<a href="" id="del">删除子节点</a>-->  <!--是超链接时,链接为空,相当于点击按钮就跳到本页面,所以看不出变化-->
		<!--<input type="button" id="del" value="删除子节点" />-->  <!--是一个按钮时就能看出来删除子节点效果-->
		<a href="javascript:void(0);" id="del">删除子节点</a>
		<a href="javascript:void(0);" id="add">增加子节点</a>
		<!--
			 超链接功能:
			    1.可以被点击:样式
			    2.点击后跳转到href指定的url
			   现在的需求是:保留1功能,去掉2功能
			   实现:href="javascript:void(0);"
		-->
		<script>
			//删除div2
			//1.获取超链接
			var element_a=document.getElementById("del");
			//2.绑定单击事件
			element_a.onclick=function(){
				var div1=document.getElementById("div1");
				var div1=document.getElementById("div1");
				div1.removeChild(div2);			
			}
			//增加
			//1.获取超链接
			var element_add=document.getElementById("add");
			//2.绑定单击事件
			element_add.onclick=function(){
				var div1=document.getElementById("div1");
				//给div1添加子节点
				//创建div节点
				var div3=document.createElement("div");
				div3.setAttribute("id","div3");
				
				div1.appendChild(div3);	
			}
			
			//获取div2的父节点
			var div2=document.getElementById("div2");
			var div1=div2.parentNode;
			alert(div1);			
		</script>
	</body>
</html>

(4)HTML DOM

​ 1)标签体的设置和获取:innerHTML

在 9. 动态表格案例中,添加函数可以修改为如下代码,代码会简洁很多,相比之下通过element的方法比较面向对象,innerHTML不面向对象,但代码很简单

//在 9.的动态表格案例中,添加函数可以修改为
//使用innerHTML添加
			document.getElementById("btn_add").onclick=function(){
			   //2.获取文本框的内容
				var id=document.getElementById("id").value;
				var name=document.getElementById("name").value;
				var sex=document.getElementById("sex").value;
			   //.取table
				var table=document.getElementsByTagName("table")[0];
				//追加一行
				table.innerHTML+="<tr>\n"+
				"<td>"+id+"</td>\n"+
				"<td>"+name+"</td>\n"+
				"<td>"+sex+"</td>\n"+
				"<td><a href=\"javascript:void(0);\"οnclick=\"delTr(this);\">删除</a></td>\n"+
			"</tr>"
			}

​ 2)使用html元素对象的属性
​ 3)设置元素样式
​ a. 使用元素的style属性来设置
​ b.提前定义好类选择器的样式,通过元素的className属性来设置其className属性值。
​ 两种方式,第一种方式在样式很多的时候,不太方便,第二种方式,通过CSS的方式,阅读性会高一些

<!--HTML DOM 控制样式-->
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>控制样式</title>
		<style>
			.d1{
				border: 1px solid red;
				width: 100px;
				height: 100px;
			}
			.d2{
				border: 1px solid blue;
				width: 200px;
				height: 200px;
			}
		</style>

	</head>
	<body>
		<div id="div1">
			div1
		</div>
		<div id="div2">
			div2
		</div>
		
		<script>
			var div1=document.getElementById("div1");
			//点击div1或div2,样式就会变化
			div1.onclick=function(){
				//修改样式方式1
				div1.style.border="1px solid red";
				div1.style.width="200px";
				
				//font-size---->fontSize
				div1.style.fontSize="20px";
			}
			
			var div2=document.getElementById("div2");
			div2.onclick=function(){
				div2.className="d1";
			}	
		</script>		
	</body>
</html>

9. 动态表格案例

<!--动态表格-->
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>动态表格</title>
		
		<style>
			table{
				border: 1px solid;
				margin: auto;
				width: 500px;
			}
			td,th{
				text-align: center;
				border: 1px solid;
			}
			div{
				text-align: center;
				margin: 50px;
			}
		</style>
			
	</head>
	<body>
		<div>
			<input type="text" id="id" placeholder="请输入编号"/>
			<input type="text" id="name" placeholder="请输入姓名"/>
			<input type="text" id="sex" placeholder="请输入性别"/>
			<input type="button" value="添加" id="btn_add" />
		</div>
		
		<table>
			<caption>学生信息表</caption>
			<tr>
				<th>编号</th>
				<th>姓名</th>
				<th>性别</th>
				<th>操作</th>
			</tr>
			
			<tr>
				<td>1</td>
				<td>哈哈</td>
				<td>女</td>
				<td><a href="javascript:void(0);" onclick="delTr(this);">删除</a></td>
			</tr>
			<tr>
				<td>2</td>
				<td>呵呵</td>
				<td>女</td>
				<td><a href="javascript:void(0);"onclick="delTr(this);">删除</a></td>
			</tr>
			<tr>
				<td>1</td>
				<td>嘻嘻</td>
				<td>女</td>
				<td><a href="javascript:void(0);"onclick="delTr(this);">删除</a></td>
			</tr>
			
		</table>
		
		<script>
			/*
			 * 分析:
			 *    1. 添加:
			 *       (1)给添加按钮绑定单击事件
			 *       (2)获取文本框内容
			 *       (3)创建td,设置td的文本为文本框的内容
			 *       (4)创建tr
			 *       (5)将td添加到tr中
			 *       (6)获取table,将tr添加到table中
			 *    2.删除
			 *       (1)确定点击的是哪一个超链接
			 *          <a href="javascript:void(0);" οnclick="delTr(this);"删除</a>
			 *       (2)怎么删除
			 *              removeChild();通过父节点删除子节点
			 */
			
			//1.获取按钮
			document.getElementById("btn_add").onclick=function(){
				//2.获取文本框的内容
				var id=document.getElementById("id").value;
				var name=document.getElementById("name").value;
				var sex=document.getElementById("sex").value;
				
				//3.创建td,赋值td的标签体
				//id的 td
				var td_id=document.createElement("td");
				var text_id=document.createTextNode(id);
				td_id.appendChild(text_id);
				//name的 td
				var td_name=document.createElement("td");
				var text_name=document.createTextNode(name);
				td_name.appendChild(text_name);
				//sex的 td
				var td_sex=document.createElement("td");
				var text_sex=document.createTextNode(sex);
				td_id.appendChild(text_id);
				// a 标签的 td
				var td_a=document.createElement("td");
				var ele_a=document.createElement("a");
				ele_a.setAttribute("href","javascript:void(0);");
				ele_a.setAttribute("onclick","delTr(this);");
				var text_a=document.createTextNode("删除");
				ele_a.appendChild(text_a);
				td_a.appendChild(ele_a);
				
				//4.创建tr
				var tr=document.createElement("tr");
				//5.添加td到tr中
				tr.appendChild(td_id);
				tr.appendChild(td_name);
				tr.appendChild(td_sex);
				tr.appendChild(td_a);
				//6.获取table
				var table=document.getElementsByTagName("table")[0];
				table.appendChild(tr);
			}
			
			//删除方法
			function delTr(obj){
				var table=obj.parentNode.parentNode.parentNode;
				var tr=obj.parentNode.parentNode;
				
				table.removeChild(tr);
			}
		</script>	
	</body>
</html>

10. JavaScript中的事件(事件监听机制)

(1)概念

​ 某些组件被执行某些操作后,触发某些代码的执行。
​ a. 事件:某些操作。eg.单击,双击。。。
​ b. 事件源:组件。按钮、文本框。。。
​ c. 监听器:代码。
​ d. 注册监听:将事件,事件源,监听器结合在一起。当事件源上发生了某个事件,则触发执行某个监听器代码。

失去焦点(离焦)事件

(2)常见的事件:

​ 1)点击事件:
​ a. onclick:单击事件
​ b.ondblclick:双击事件

​ 2)焦点事件:
​ a. onblur 元素失去焦点。 一般用于表单校验。
​ b. onfocus 元素获得焦点。

​ 3)加载事件:
​ a. onl oad 一张页面或一幅图像完成加载。(加载完成后才触发,用得挺多的。。。)

​ 4)鼠标事件:
​ a. onm ousedown 鼠标按钮被按下。
​ 定义方法时,定义一个形参,接受event对象。event对象的button属性可以获取鼠标按钮键被点击了(左键是0。中键是1。右键是2)
​ b. onm ousemove 鼠标被移动。
​ c. onm ouseout 鼠标从某元素移开。
​ d. onm ouseover 鼠标移到某元素之上。
​ e. onm ouseup 鼠标按键被松开。

​ 5)键盘事件

​ a. onkeydown 某个键盘按键被按下。
​ b. onkeypress 某个键盘按键被按下并松开。(两个动作)
​ c. onkeyup 某个键盘按键被松开。

​ 6)选择和改变
​ a. onchange 域的内容被改变。
​ b. onselect 文本被选中。

​ 7)表单事件
​ a. onsubmit 确认按钮被点击。(很重要!!!)
​ 可以阻止表单的提交(验证提交的内容);返回 false。若成功提交,地址栏地址会变化。
​ b. onreset 重置按钮被点击。

11. 表格全选、全不选、反选,焦点事件案例

<!--动态表格全选、全不选,鼠标移动到就变色-->
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>动态表格</title>
		
		<style>
			table{
				border: 1px solid;
				width: 500px;
				margin-left: 30%;
			}
			td,th{
				text-align: center;
				border: 1px solid;
			}
			div{
				margin-top: 10px;
				margin-left: 30%;
			}
			.out{
				background-color: white;
			}
			.over{
				background-color: pink;
			}
			
		</style>
		
		<script>
			/*
			 * 分析:
			 *    1. 全选:
			 *          a.获取所有的checkbox
			 *          b.遍历cb,设置每一个cb的状态为选中  checked
			 */	
			
			//1. 在页面加载完后绑定事件
			window.onload=function(){
				//2.给全选按钮绑定事件
				document.getElementById("selectAll").onclick=function(){
					//全选
					//1.获取所有的checkbox
					var cbs=document.getElementsByName("cb");
					//2.遍历
					for(var i=0;i<cbs.length;i++){
						//3.设置每一个cb的状态为选中,checked
						cbs[i].checked=true;
					}	
				}
				
				//2.给全不选按钮绑定事件
				document.getElementById("unselectAll").onclick=function(){
					//全不选
					//1.获取所有的checkbox
					var cbs=document.getElementsByName("cb");
					//2.遍历
					for(var i=0;i<cbs.length;i++){
						//3.设置每一个cb的状态为未选中,checked
						cbs[i].checked=false;
					}	
				}
				//3.给反选按钮绑定事件
				document.getElementById("selectRev").onclick=function(){
					//反选
					//1.获取所有的checkbox
					var cbs=document.getElementsByName("cb");
					//2.遍历
					for(var i=0;i<cbs.length;i++){
						//3.设置每一个cb的状态为反选
						cbs[i].checked=!cbs[i].checked;
					}	
				}
				//4.第一个cb点击
				document.getElementById("firstCb").onclick=function(){
					//反选
					//1.获取所有的checkbox
					var cbs=document.getElementsByName("cb");
					//获取第一个cb
					//2.遍历
					for(var i=0;i<cbs.length;i++){
						//3.设置每一个cb的状态和第一个cb的状态一样
						cbs[i].checked=this.checked;
					}	
				}
				//5.给所有的tr绑定鼠标移到元素之上和移出元素事件
				var trs=document.getElementsByTagName("tr");
				//2.遍历
				for(var i=0;i<trs.length;i++){
					//移到元素之上
					trs[i].onmouseover=function(){
						/*alert("1");*/
						this.className="over";
					}
					//移出元素
					trs[i].onmouseout=function(){
						this.className="out";
					}
				}		
			}
		</script>		
	</head>
	<body>
		
		<table>
			<caption>学生信息表</caption>
			<tr>
				<th><input type="checkbox" name="cb" id="firstCb"></th>
				<th>编号</th>
				<th>姓名</th>
				<th>性别</th>
				<th>操作</th>
			</tr>
			
			<tr>
				<th><input type="checkbox" name="cb"></th>
				<td>1</td>
				<td>哈哈</td>
				<td>女</td>
				<td><a href="javascript:void(0);" onclick="delTr(this);">删除</a></td>
			</tr>
			<tr>
				<th><input type="checkbox" name="cb"></th>
				<td>2</td>
				<td>呵呵</td>
				<td>女</td>
				<td><a href="javascript:void(0);"onclick="delTr(this);">删除</a></td>
			</tr>
			<tr>
				<th><input type="checkbox" name="cb"></th>
				<td>3</td>
				<td>嘻嘻</td>
				<td>女</td>
				<td><a href="javascript:void(0);"onclick="delTr(this);">删除</a></td>
			</tr>
		</table>
		
		<div>
			<input type="button" id="selectAll" value="全选" />
			<input type="button" id="unselectAll" value="全不选" />
			<input type="button" id="selectRev" value="反选" />
			
		</div>	
	</body>
</html>

12. 表单校验案例

<!--表单校验-->
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>表单检验</title>
		
		<style>
			*{
				margin: 0px;
				padding: 0px;
				box-sizing: border-box;
			}
			body{
				background: url("img/banner2.jpg") center;
				padding-top: 25px;
			}
			.rg_layout{
				width: 900px;
				height: 500px;
				border: 8px solid #EEEEEE;
				background-color: white;
				/*让div水平居中*/
				margin: auto;
			}
			.rg_left{
				float: left;
				margin: 15px;
			}
			.rg_left > p:first-child{
				color: #FFD026 ;
				font-size: 20px;
			}
			.rg_left > p:last-child{
				color: #A6A6A6;
				font-size: 20px;
			}
			
			.rg_center{
				float: left;
			}
			
			.rg_right{
				float: right;
				margin: 15px;
			}
			
			.rg_right> p:first-child{
				font-size: 15px;
			}
			.rg_right p a{
				color: pink;
			}
			
			.td-left{
				width: 100px;
				text-align: right;
                height:45px ;
			}
			
			.td_right{
				padding-left: 50px;
			}
			
			#username,#password,#email{
				width:251px;
				height: 32px;
				border: 1px solid #A6A6A6;
				/*设置边框圆角*/
				border-radius: 5px;
				padding-left: 10px;
			}
			#checkcode{
				width: 110px;
			}
			#img_check{
				height: 32px;
				vertical-align: middle;
			}
			#btn_sub{
				width: 150px;
				height: 40px;
				background-color: #FFD026;
				border: 1px solid #FFD026;
			}
			.error{
				color: red;
			}		
			.#td_sub{
				padding-left:150px;
			}
		</style>
		
		<script>
			/*  分析:
                    1.给表单绑定onsubmit事件。监听器中判断每一个方法校验的结果。
                                            如果都为true,则监听器方法返回true
                                            如果有一个为false,则监听器方法返回false
                    2.定义一些方法分别校验各个表单项。
                    3. 给各个表单项绑定onblur事件。
            */

			window.onload=function(){
				//1.给表单绑定onsubmit事件
				document.getElementById("form").onsubmit=function(){
					//调用用户校验方法          
					return checkUsername()&&checkpassword();	
				}
				//给用户名和密码框分别绑定离焦事件
				document.getElementById("username").onblur=checkUsername; /*等于函数对象,一定不能写括号*/
				document.getElementById("password").onblur=checkPassword;
			}
			
			//校验用户名
			function checkUsername(){
				//1.获取用户名的值
				var username=document.getElementById("username").value;
				//2.定义正则表达式
				var reg_username=/^\w{6,12}$/;
				//3.判断值是否符合正则的规则
				var flag=reg_username.test(username);
				//4.提示信息
				var s_username=document.getElementById("s_username");
				if(flag){
					//符合则提示绿色对勾
					s_username.innerHTML="<img width='35' height='35' src='img/gou.png'/>";
				}else{
					//不符合规范则提示红色用户名有误
					s_username.innerHTML="用户名有误,请输入6-12位";
				}
			}
			
			//校验密码。若要校验邮箱,是一样的
			function checkPassword(){
				//1.获取用户名的值
				var password=document.getElementById("password").value;
				//2.定义正则表达式
				var reg_password=/^\w{6,12}$/;
				//3.判断值是否符合正则的规则
				var flag=reg_password.test(password);
				//4.提示信息
				var s_password=document.getElementById("s_password");
				if(flag){
					//符合则提示绿色对勾
					s_password.innerHTML="<img width='35' height='35' src='img/gou.png'/>";
				}else{
					//不符合规范则提示红色用户名有误
					s_password.innerHTML="密码有误,请输入6-12位";
				}
			}
			
		</script>
	
	</head>
	<body>
		<div class="rg_layout">
			<div class="rg_left">
				<p>新用户注册</p>
				<p>USER REGISTER</p>
			</div>
		
		<div class="rg_center">
			<div class="rg_form">
				<!--定义表单from -->
				<form action="#" id="form" method="get">
					<table>
						<tr>
							<td class="td_left"><label for="username">用户名</label></td>
							<td class="td_right">
								<input type="text" name="username" id="username" placeholder="请输入用户名">
							
							    <span id="s_username" class="error"></span>
							</td>
						</tr>
						<tr>
							<td class="td_left"><label for="password">密码</label></td>
							<td class="td_right">
								<input type="text" name="password" id="password" placeholder="请输入密码">
						        <span id="s_password" class="error"></span>
							</td>
						</tr>
						<tr>
							<td class="td_left"><label for="email">邮箱</label></td>
							<td class="td_right"><input type="text" name="email" id="email" placeholder="请输入邮箱">
							</td>
						</tr>
						
						<tr>
							<td colspan="2" id="td_sub"><input type="submit" id="btn_sub" value="注册"</td>
						</tr>
					</table>  
				   </form>		
			    </div>
		    </div>
		    
		    <div class="rg_right">
		    	<p>已有账号?<a href="#">立即登录</a></p>
		    </div>
		    
		</div>
		
	</body>
</html>

PS:补充

1. JavaScript 输出到页面

  `document.write(变量名+"<br>");`       //换行

2. JavaScript更多详细内容:

可查看网址w3school 在线教程 https://www.w3school.com.cn/,选择JavaScript语言,再点击参考书,即可看到
JavaScript基础

3. 查看运行代码的错误,并修改

(1)我是使用Hbuilder软件,在浏览器运行有错误时,打开浏览器的“开发者工具”,点击"Console",即可看到错误位置,可进行调试
JavaScript基础

​ (2)若同一个按钮设置了两个响应事件,可能会出现错误提示“ Failed to load resource: the server responded with a status of 404 (Not Found) ”

4. HBulider的使用

(1)选中代码块后,按ctrl+F 替换功能,可以替换部分指定代码

5. 补充

(1)超链接功能:

​ a. 可以被点击:样式
​ b. 点击后跳转到 href指定的url
​ 保留1功能,去掉2功能
​ 在JavaScript中 实现:href=“javascript:void(0);” (Node小案例中有)

(2)JavaScript中的this

​ JavaScript中的this比较特殊
​ 在c++、Java等语言中,this的含义非常明确,就是指向当前的对象实例。
​ 在JavaScript中,this 作为一个单独的指针,在不同的情况之下,指向不同的位置。

​ 1)在全局作用域时:this指向window,在全局作用域,this与window等价。
​ 2)在函数中,

function set(){
  var x = 0;
};
//在这一形态下,其内部的this是与全局作用域时一样,直接指向window,所以其形态 依然等价于window。

但是,如果将这个函数实例化(new)之后,此函数将生成一个全新的环境,此时在此实例中的this也会随之发生变化,它将指向所在实例。

num = "0";
function setThis(){
  this.num = "1";
}
console.log(this.num);//"0"
new setThis();
console.log(this.num);//"0"
console.log(new setThis().num);//1

这是因为,当实例化之后,此函数变成了一个实例对象,而其内部的this也自然而然的指向了此实例对象,如同一开始的this是指向window的对象一样指向了它所在的实例

另外,在我们写javascript的时候,我们通常还会有一种调用函数的方法,即为元素绑定事件,比如button.addEventListener(‘click’, fn, false)等,如果在fn里面需要使用到this的话,那么此时this指向事件处理元素,也就是button

上一篇:jsp


下一篇:Html01_表格-tr、th与td区别