前端---JavaScript基础+DOM编程与BOM编程

在浏览器中植入脚本技术的好处:1)减轻服务器压力2)在浏览器端进行校验
JavaScript:是BOM编程,基于浏览器对象模型编程。是一种弱类型语言
JScript:是DOM编程(重点),基于文档对象模型编程。

js基础语法

js的基本使用方式

1.内部方式:在html源代码中的head标签中定义标签<script></script>,然后在标签中定义javascript语言.
2.外部方式:引入文件script标签(必须有标签体,有开始有结束的标签),通过标签中的src属性中连接到外部js文件.

js中的常用函数(写在script标签中或js文件中)

  • 提示框函数:(window.)alert("提示框");
  • 写正文:document.write("hello world");
  • 类型转换函数:若遇到非数值类型的字符就停止转换.如果一开始就是非数值类型的字符,转换后值是:NaN
    • 将string转换为整数:parseInt(变量名)
    • 将string转换为小数:parseFloat(变量名)

js的变量和数据类型

js是一种弱类型语言:

  • 1)使用var定义任何类型的变量,使用var也可以定义对象,var可以省略
    java:Person p=new Person();
    js:var p=new Person();

  • 2)在js中,可以重复定义变量,后面定义的变量会覆盖起前面的定义.
    var a=10; var a=20;

查看变量的数据类型:typeof(变量名),

  • js中不论整数还是小数,都是number类型
  • 不论是字符还是字符串,都是string类型
  • js中还存在boolean类型
  • object类型(属于模板对象,所有对象都可以用它来表示)
  • undefined类型:未定义类型

js的运算符

算数运算符:+ - * / %

  • 在js中,true=1,false=0;若与number类型进行算数运算时,会自动转为数值类型

比较运算符:> < >= <=
逻辑运算符:&& || !
三目运算符:(表达式) ? true的结果:false的结果

js中的流程控制语句

选择结构语句:

if(条件表达式){}else{}

  • if表达式中如果是number类型,非0 代表条件成立,0代表条件成立
  • 表达式如果是空字符串,则条件不成立,如果是非空字符串,则条件成立
  • 表达式如果是对象类型:null 代表条件不成立,非空表示条件成立
  • 表达式如果是boolean:true就成立,false就不成立.

:

switch(表达式)
{case 值1: 
语句1;

default:
...;
}

在java中,switch语句中的表达式可以为:枚举,八大数据类型等,在js中,case后面既可以是常量,也可以是变量,也可以跟表达式

循环语句:
  • for(var 变量名;条件判断语句;步长语句){}
  • while(条件表达式){ }
  • do{}while(条件表达式);
  • with(document){}
  • for-in遍历数组或对象的使用:js中内置Array对象:数组对象.
    • var 数组名称=[内容]var 数组 new Array[]
    • for-in格式:for(var 变量名 in 数组名称/对象名称){输出;}

在js要创建对象,首先要定义对象:

//定义对象
function Person(name,age)
{this.name=name;
this.age=age;}
//创建对象
var p=new Person("lily",23);

js中函数的定义和调用

使用function定义函数,格式为:function 函数名称(形参列表){函数体;}
调用函数:函数名称(实际参数列表);

注意:在js中,
1)定义的形式参数列表时,参数不能使用var修饰.
2)定义函数时,可以有return语句,但是不需要定义返回值
3)在表单验证时,使用函数进行校验,表单提交onsubmit需携带返回值
4)不存在方法重载的概念,后面定义的函数会自动覆盖前面定义的函数
5)当实际参数个数小于形式参数个数,结果为NaN,当实际参数个数大于形式参数个数,那么会取前形参需要的个数,多余的实际参数被移掉;因为在在js中默认有一个arguments数组,会将实际参数和形式参数绑定,并对其赋值.

事件编程的三要素:

1)事件源<input type="button" />
2)事件监听器:执行某个逻辑函数

function checkMonth(){
alert("hello")
}

3)注册事件:事件源和函数进行绑定<input type="button" onclick="checkMonth"/>

Date对象

var date=new Date();
/获取年份:
document.write(date.getFullYear()+“年”)
//获取月份:
document.write(date.getMonth()+1+“月”)
//获取日期:
document.write(date.getDate()+“日”)
//获取一周的星期
document.write(date.getDay())
//获取时
document.write(date.getHour()+“时”)
//获取分
document.write(date.getMinutes()+“分”)
//获取秒
document.write(date.getSeconds()+“秒”)

定时器

属于window对象的两个方法:
1.每隔指定毫秒值重复执行:window.setInterval(“任务”,毫秒值)
2.经过指定毫秒数执行一次任务:window.setTimeOut(“任务”,毫秒值)

practice:简单的网页时钟:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body onload="genDate()">
			<!--
	作者:sweet
	时间:2019-04-10
	描述:步骤:
	1.创建Date对象,拼接年月日时分秒
	2.获取span标签对象
	3.设置span标签对象的innerHTML对象
	4.设置定时器
-->
		当前系统时间为:<span id="spanTip"></span>
		
	</body>
	<script type="text/javascript">
			//通过ID属性获取span函数对象
			function genDate(){
				//1.设置span标签的innerHTNL属性
			var spanTip=document.getElementById("spanTip");
				//HTML是从上往下依次执行的,当加载到第一步时,标签还未加载,因此不能回去到id
			//设置span标签的innerHTML属性

			//1
			var date=new Date();
			var dateStr=date.getFullYear()+"年"+(date.getMonth()+1)+"月"+date.getDate()+"日&nbsp;&nbsp"
			+date.getHours()+"时"+date.getMinutes()+"分"+date.getSeconds()+"秒";
			//2
			var spanTip=document.getElementById("spanTip");
			//3
			spanTip.innerHTML=dateStr;
			//4.定时器
			setInterval("genDate()",1000);
			
			}
		</script>
</html>
		

Array对象

数组对象定义方式
1.var arr=[val1,val2];
2.var arr=new Array(val1,val2,val3);
3.var arr=new Array();
在js中定义数组,不用担心数组角标越界的问题,js会自动扩容
数组元素可以定义任何数据类型的元素。

两个方法:
通过指定字符串,将数组中的内容用该字符串拼接返回字符串值:join(str)
将数组中的内容进行反转:reverse();

自定义对象

4种方式:

  1. 有参方式:类似于Java对象中的有参构造
    定义对象:
    function 对象(形参){
    追加属性;
    追加方法;
    }
    创建对象:var 对象名=new 对象名(实际参数);
    通过实例化对象可以调用属性和方法
  2. 无参方式:类似于Java中的无参构造
    定义对象:
    function 对象(){
    }
    创建对象:
    var p=new Person();
  3. 创建object对象,因为object对象包含所有对象,是一个模板对象
    var p=new Object();
    追加属性:p.name=“lily”;
    追加方法:p.age=19;
    追加方法:
    p.say=function(){
    alert(“调用了say方法”);
    }
  4. 字面量的方式:Json格式
    {
    “key1”:“value1”,
    “key2”:“value2”
    “key3”:“value3”
    }

jason解析的三种方式:1.第三方的jar包:Gson 2.FastJson 3.Json原生的方法

eg:

var p={
//追加属性
"name":"王五",
"age":25,
"say":function(){
alert("调用了say方法")}
};

若要求在Array对象(内置对象)中添加search,max方法,但不能用自定义对象完成;
解决方案:js原型,在js原型中,给原型对象添加一个方法,然后在内置对象中创建原型对象,这个方法就会自动添加到原型对象(Prototype)中

js原型属性的作用

  • 1.在js中所有的内置对象中,都存在原型属性:prototype
  • 2.在内置对象中调用原型属性,追加一个方法,这个方法会自动添加到内置对象中,
  • 3.给内置对象中追加方法
  • 格式:内置对象.prototype.方法名=function(参数){}

BOM编程

HTML在页面在被js引擎解析的时候,将页面中部分内容封装为对象:

  • window对象:窗口对象
  • Location对象:地址栏对象
  • history对象:历史纪录对象
  • screen对象:屏幕对象

window窗口对象

常用方法:
open("url(打开资源的文件路径)","打开方式","打开新窗口的宽高以及设置工具栏的显示");打开窗口
setIntereval(""任务,毫秒值)定时器:每经过指定毫秒值,执行任务
clearInterval(timerId)取消定时器
setTimeOut("任务",毫秒值)定时器:经过指定毫秒数,执行一次任务
clearInTimeOut(timerId)取消定时器
alert("")显示弹框
confirm()确认对话框
propt()消息对话框和输入框

Location地址栏对象

常用属性:
href:改变当前url的地址,实现跳转

window是顶级对象,可以调用location对象的href属性window.location.href=“xxxx”;

常用方法:
reload():重新刷新当前页面

history历史纪录对象

forward();载入下一个URL
back();载入上一个url
go(整数);装入url代替上面两个方法

js事件编程分类

1.事件源
2.编写监听器
3.注册监听器

事件分类
点击相关的事件:

  • 单击点击的事件:onclick
  • 双击点击的事件:onbclick

和焦点相关的事件:

  • 聚焦事件:onfocus
  • 失去焦点事件:onblur

选项卡发生变化的事件:

  • onchange事件:(省市联动)

和鼠标相关的事件:

  • 鼠标经过:onmouseover
  • 鼠标移出:onmouseout

当body中的内容加载完毕:

  • 页面载入事件:onload事件
  • 按键抬起事件 onkeyup

DOM编程

DOM编程是基于文档对象的编程模型,DOM编程的作用:通过文档对象(document)的一些属性和方法获取标签对象,然后通过标签对象更改他的属性来显示一些效果。

HTML在页面在被js引擎解析的时候,js引擎将html页面中每一个标签都封装成一个对象,通过操作这些对象在页面中显示效果。

html是以树状结构进行存储,每一个标签对象代表一个节点(Node),每个节点都有一个属性:nodeName

获取标签对象的途径:

1.通过document的集合属性获取标签对象:
document.all返回当前页面中所有的标签对象集合
document.forms获取当前页面中以源顺序排列的所有的form标签对象的集合
document.images获取当前页面中以源顺序排列的所有的img标签对象的集合
document.links获取当前页面中以源顺序排列的所有的a标签对象的集合

通过查询节点来获取标签对象

1.通过document调用属性获取当前标签对象node;
节点关系:
node.parentNode:父节点
node.childNodes:当前节点的所有字节点

  • 属性:查看节点类型nodeType

空格换行nodeType:3 ; nodeName为:#text;
标签nodeType:1 ; nodeName为:对应标签
html注释nodeType: 8 ; nodeName为:#comment

node.firstChild:第一个子节点

  • 属性:查看节点类型nodeType
    node.lastChild:最后一个子节点
  • 属性:查看节点类型nodeType

node.sibling:兄弟节点
node.nextSibling:下一个兄弟节点
node.previousSibling:上一个兄弟节点

通过document方法获取标签对象

1.通过id属性getElementById(""id属性);//id要唯一获取单个标签对象
2.通过name属性getElementByName("name属性值");返回标签对象集合
3.通过标签名称getElementByTagName("标签属性");获取标签对象集合
4.通过类选择器getElementByClassName("class属性值")获取标签对象

ducument操作标签对象的其他方法

添加元素相关的方法 document.creatElement("标签元素名称")

  • 添加元素后设置属性值:元素对象.setAttribute("属性名称","属性值")

插入相关的方法:
在父节点中调用为其插入子节点:appendChild(指定元素对象);
在指定对象前面插入这个新对象:

指定对象节点.insertBefore(新元素对象,指定元素对象)

删除相关的方法:
删除子节点:removeChild(子节点对象)

javascript的正则表达式

定义正则的格式:
var reg=/正则表达式/

数量词:

  • x?:0次或1次
  • x+:出现一次或多次
  • x{n}:x字符恰好出现n次
  • x{n,m}:x至少出现n次,但是不超过m次

test():用户输入的内容是否和当前规定的正则匹配:如果匹配,返回true,否则返回false

	<script type="text/javascript">
			var str="12";
			//正则表达式含义:字母a到z,A到Z,0到9,定义两次
			var reg=/[a-zA-Z0-9]{2}/;
			
			//如果用户输入的内容是否和当前规定的正则匹配:如果匹配,返回true,否则返回false
			//由于js是弱类型语言,只要字符串内容和正则存在匹配内容就会返回true
			//如果想让js正则规则严谨:加上边界匹配符号^$
			
			if(reg.test(str)){
				alert("条件成立");
				
			}else{
				alert("条件不成立");
			}
		</script>

综合应用:注册表单的前端验证

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<script type="text/javascript">
		function checkUsername(){
		//校验用户名
//1.获取用户名内容
var username=document.getElementById("username").value;
var reg=/^[a-zA-Z0-9]{4,14}$/;
//2.获取id="name_span"的标签对象
var nameSpan=document.getElementById("name_span");
if(reg.test(username)){
	//成功:设置nameSpan的innerHTML属性
	nameSpan.innerHTML="当前用户名可用".fontcolor("green");
	return true;
	
}else{
	nameSpan.innerHTML="当前用户名不可用".fontcolor("red");
	return false;
	
}

}
function checkPwd(){
	
//1.获取用户名内容
var pwd=document.getElementById("pwd").value;
var reg=/^[a-zA-Z0-9]{4,14}$/;
//2.获取id="name_span"的标签对象
var pwdSpan=document.getElementById("pwd_span");
if(reg.test(pwd)){
	//成功:设置nameSpan的innerHTML属性
	pwdSpan.innerHTML="当前密码可用".fontcolor("green");
	return true;
}else{
	pwdSpan.innerHTML="当前密码不可用".fontcolor("red");
	return false;
}
	
}
function checkRepwd(){
	var pwd=document.getElementById("pwd").value;
	var repwd=document.getElementById("repwd").value;
	var repwdSpan=document.getElementById("repwd_span");
	
	if(pwd.valueOf(repwd)){
		repwdSpan.innerHTML="两次输出密码一致".fontcolor("green");
		return true;
	}else{
		repwdSpan.innerHTML="两次输出密码不一致".fontcolor("red");
		return false;
	}
}
		function checkEmail(){
			//获取邮箱内容
			var email=document.getElementById("email").value;
    		//邮箱:数字或字母(可出现多次)@数字或字母(.cn/.com/...)
			
		var reg=/^[a-zA-Z0-9]+@[A-Za-z0-9]+(\.[a-z-A-Z]{2,3}){1,2}$/;
		//获取id_span
	var emailSpan=	document.getElementById("email_span");
		if(reg.test(email)){
			emailSpan.innerHTML="当前邮箱可用".fontcolor("green");
			return true;
			
		}else{
			emailSpan.innerHTML="当前邮箱不可用".fontcolor("red");
			return false;
		}
		}
		
		
		//校验全部表单,如果都通过,才能提交
function checkAll(){
	if(checkUsername()&&checkPwd()&&checkRepwd()&&checkEmail()){
		return true;
	}else{
		return false;
	}
}
	</script>
	<body >
		<!--
        	作者:offline
        	时间:2019-04-11
        	描述:onsubmit:表单数据是否能提交:true 提交
        									false 不能提交
    		script定义正则的规则:
    		用户名:4--14为数字或字母组成
    		密码:6--16位数字或字母组成
    		确认密码和密码一致
    		邮箱:数字或字母(可出现多次)@数字或字母
        -->
		<form action="切换图片.html" method="post" onsubmit="return checkAll()">
			
			用户名:<input type="text" id="username" value="" onblur="checkUsername()"/><span id="name_span"></span>
			<br />
			密码:<input type="password" name="" id="pwd" value="" onblur="checkPwd()"/><span id="pwd_span"></span>
			<br />
			确认密码:<input type="password" name="" id="repwd" value="" onblur="checkRepwd()"/><span id="repwd_span"></span>
			<br />
			邮箱:<input type="text" name="" id="email" value="" onblur="checkEmail()"/><span id="email_span"></span>
			<br />
			<input type="submit" name="" id="" value="注册" />
		</form>
	</body>
</html>

猜你喜欢

转载自blog.csdn.net/weixin_42962924/article/details/89002831
今日推荐