BOM操作及DOM表单案例练习

BOM

BOM是什么

BOM的全称为Browser Object Model,被译为浏览器对象模型。
BCM提供了独立于HTML页面内容,而与浏览器相关的一系列对象。主要被用于管理浏览器窗口及
与浏览器窗口之间通信等功能。
BOM由一系列对象构成,这些对象可以简单理解为是由各个浏览器所提供的,例如Window对象等。

UTOOLS1589244769877.png

Window对象是什么

BOM中最核心的对象就是Window对象,该对象表示运行HTML页面的浏览器窗口。
在浏览器环境中,Window对象具有双重角色。该对象既是允许JavaScript逻辑访问浏览器窗口的一
个对象,又是ECMAScript规范中的Global全局对象。
这就说明了,在浏览器环境中运行、JavaScript逻辑时,在全局作用域中定义的对象、变量和函数都是
Window对象的属性和方法。
也可以通过Window对象访问Global全局对象的属性和方法。例如NaN、undefined和parselnt()方
法等。

window对象示例代码:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>window对象</title>
	</head>
	<body>
		<script type="text/javascript">
			// window对象是浏览器窗口中的顶级(全局)对象
			
			// 全局变量 - window对象的属性
			var v = 100;
			console.log(v)
			console.log(window.v)
			// 函数 - window对象的方法
			function fun() {
				console.log("this is function...")
			}
			fun()
			window.fun()
			
			// 删除对象的属性
			// delete window.v
			// console.log(window.v)
			
			// window对象的属性和方法在调用时 - 允许省略"window."
			console.log(window.document)
		</script>
	</body>
</html>

实现效果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dLCN1IpV-1589293560311)(C:\Users\20445\AppData\Roaming\Typora\typora-user-images\image-20200512093826499.png)]

Window对象的属性

Window对象的属性数量较多,包含了浏览器窗口的基本信息、也包含了一些复杂的信息。可以人为
将Window对象分为以下三类:

  1. BOM中其他对象,例如Navigator对象等。
  2. 一 些有关浏览器窗口的基本信息等,这些属性多属于DOM 0级别,并不是W3C标准规范。
  3. 包含了大量有关HTML 5版 本新增的功能等。

浏览器窗口的宽带和高度

Window对象提供的属性中可以获取当前浏览器窗口的宽度和高度,具有两组:

  • innerWidth和innedHeight属性
    只读属性,返回当前浏览器窗口的可视宽度和高度。如果存在滚动条,也包含滚动条。
  • outterWidth和outterHeight属性
    只读属性,返回当前浏览器窗口的整个宽度和高度。

图片跟随窗口变化示例代码:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>图片跟随窗口变化</title>
	</head>
	<body>
		<img id="img" src="img/th.jpg" >
		<script type="text/javascript">
			var img = document.getElementById("img")
			// resize事件 - 当窗口大小变化时触发
			window.addEventListener("resize", () => {
				console.log(window.innerWidth, window.innerHeight)
			})
		</script>
	</body>
</html>

实现效果:

UTOOLS1589247584577.png

Window对象与self属性

Window对象的self属性返回当前浏览器窗口的只读属性。换句话讲,self 属性返回的是Window对象
的引用。

console.log(window == window.self);

也可以通过以下代码判断当前浏览器是否是最顶层窗D:

if (window.top != window.self) {
	console.log("这个窗口不是最顶层窗口"); 
}else{
	console.log("这个窗口是最顶层窗口");
}

Window对象的方法

Window对象的方法,主要从以下几方面进行学习:

  • 系统提示框: alert()方法、 confirm()方 法和prompt()方法
  • 打开与关闭窗口: open()与close(方法 、showModalDialog()
  • DOM规范标准0级别的一些方法
  • 定时器: setTimeol ut()与clear Timeout()、setinterval()与cleadnterval()

Navigator对象

Navigator对象包含了一些有 关浏览器状态的信息。可以通过window.navigatoc属性得到Navigator
对象。
Navigator对象提供一系列常 用属性,获取当前浏览器的信息。

属性名称描述
appCodeName浏览器的代码名
appName浏览器的名称
appVersion浏览器的平台和版本信息
platform运行浏览器的操作系统平台
console.log('浏览器的代码名: ' + navigator.appCodeName);
console.log('浏览器的名称: ' + navigator.appName);
console.log('浏览器的平台和版本信息:' + navigator.appVersion);
console.log('运行浏览器的操作系统平台:' + navigator.platform);

userAgent属性

Navigator对象的userAgent属性返回由客户机发送服务器的Jser - agent头部的值。userAgent属
性是一个只读的字符串,声明了浏览器用于HT TP请求的用户代理头的值。

浏览器产品userAgent属性值
FirefoxMoilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0
ChromeMoilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36
IE 8Moilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/7.0;SL CC2; .NET CL _R 2.0.50727; NET CL R 3.5.30729; NET CL R 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)
IE 11Moilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; SL CC2; NET CL R 2.0.50727; .NET CL R 3.5.30729; .NET CL R 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; rv:11.0) like Gecko
SafariMoilla/5.0 (Macintosh; Intel Mac OS X 10124) AppleWebkit/603.1.30 (KHTML, like Gecko) Version/10.1 Safari/603.1.30
var ua = navigator.userAgent
if (/firefox/i.test(ua)) {
    console.log("当前使用的是 Firefox 浏览器")
} else if (/chrom/i.test(ua)) {
    console.log("当前使用的是Chrome浏览器")
} else if(/safari/i.test(ua)){
    console.log("当前使用的是Safari 浏览器")
} else if(/msie/i.test(ua)){
    console.log("当前使用的是IE 11之前版本的浏览器")
} else if("ActiveXObject." in window){
    console.log("当前使用的是IE 11浏览器")
}

if (/windows/i.test(ua)){
    console.log("当前使用的是Windows操作系统");
}else if (/mac/i.test(ua)){
    console.log("当前使用的是Mac操作系统");
}else if (/android/i.test(ua)){
    console.log("当前使用的是Android操作系统");
}else if (/iphone/i.test(ua)){
    console.log("当前使用的是iPhone操作系统");
}

History对象是什么

History对象包含用户在浏览器中访问过的URL (网址)。

  • length属性: History对 象的length属性可以获取用户在浏览器中访问网址的数量。

    console.log('用户访问的网址数量为:'+ history.length);
    
  • History对象 还提供了以下方法实现浏览器前进和后退功能。

方法名称描述
forward()实现跳转下一个页面,作用和浏览器的前进按钮一样
back()实现转跳到上一个页面,作用和浏览器的回退按钮一样
go()实现跳转到指定的页面。如果为负数表示后退,如果为正数表示前进

Location对象是什么

Location对象包含了浏览器的地址栏中的信息,该对象主要用于获取和设置地址。
Location对象很特别,因为该对象既是Window对象的属性,又是Document对象的属性。

console.log(window.location == document.location);// true

Location对象的属性

Location对象不仅存储了地址栏中的信息,还提供了解析功能。可以通过不同的Location对象的属性
访问不同的地址栏中的信息。

属性名称描述
host返回服务器名称和端口号
hostname返回服务器名称
href返回当前加载页面的完整URL
pathname返回当前JRL .中的目录和文件名
port返回当前URL中的端口号
protocol返回页面使用的网络协议

通过可以获取和设置浏览器的地址栏中的地址信息。

//获取当前浏览器窗口的地址栏信息
console.log('Location对象为: ' + window.locaticn); 
//设置当前浏览器窗口的地址栏信息
window.location = 'http://www.wolongxueyuan.com';

上述功能同样可以通过L ocation对象的bref属性完成。

//获取当前浏览器窗口的地址栏信息
console.log('Location对象的href属性为: ' + location.href);
//设置当前浏览器窗口的地址栏信息
location.href = 'http://www.wolongxueyuan.com'; 

查询字符串参数

L ocation对象提供了search属性,用于返回JRL包含的查询字符串。

//取得查询字符串并去掉开头的问号
var qs = location.search.length > 0 ? location.search.substring(1) :";

Locaton对象的方法

Location对象提供了以下方法:

方法名称描述
assign()载入一个新的文档,作用和直接修改Location相同
reload()重新载入当前文档,作用和刷新按钮一样。参数为true时,则会强制清空缓存刷新页面
replace()用新的文档替换当前文档(不会生成历史记录,不能使用回退按钮回退)

刚学完DOM表单,就顺便写个案例练习一下~

表单验证案例

完整代码:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>表单验证案例</title>
	</head>
	<style type="text/css">
		* {
			box-sizing: border-box;
		}
		
		body {
			background-image: url(img/2015263.jpg);
			background-repeat: no-repeat;
		}
		
		#form {
			width: 500px;
			height: 800px;
			margin: 50px auto;
		}
		
		#form h1 {
			color: #DCD75F;
		}
		
		.model {
			width: 480px;
			height: 52px;
			margin-bottom: 40px;
			position: relative;
		}
		
		.model input {
			width: 100%;
			height: 100%;
			border: 1px solid #aaa;
			border-radius: 4px;
			font-size: 20px;
			color: #aaa;
			padding-left: 20px;
			outline: none;
		}
		
		.model input:focus {
			border: 1px solid #549df8;
		}
		
		#submit {
			width: 480px;
			height: 60px;
			background-color: #3083ff;
			border: none;
			outline: none;
			border-radius: 4px;
			box-shadow: 0 5px 8px 0 rgba(24,95,255,.1);
			text-align: center;
			font-weight: lighter;
			color: #fff;
			font-size: 24px;
		}
		
		.model .error {
			color: red;
			display: none;
		}
		
		.model .success {
			width: 40px;
			height: 100%;
			position: absolute;
			top: 0px;
			left: 440px;
			border-radius: 4px;
			background-image: url(img/benefits.png);
			background-size: 100%;
			background-position: 0;
			display: none;
		}
		
		.model .tips {
			display: none;
		}
	</style>
	<body>
		<form id="form" action="#">
			<h1>欢迎注册我的网页</h1>
			<div class="model">
				<!-- 
					placeholder - 点击输入框 输入框中的原提示文字不消失 光标停留在前面,开始输入文字后消失
				 -->
				<input type="text" id="username" placeholder="用户名">
				<div class="error name_error"></div>
				<div class="success name_success"></div>
			</div>
			<div class="model" id="pwd_model">
				<input type="password" id="password" placeholder="密码">
				<div class="error pwd_error"></div>
				<div class="success pwd_success"></div>
				<div class="tips">不能包括空格</div>
				<div class="tips">长度为8-16个字符</div>
				<div class="tips">必须包含字母、数字、符号中至少2种</div>
			</div>
			<div class="model">
				<input type="password" id="confirm_password" placeholder="重复密码">
				<div class="error confirm_error"></div>
				<div class="success confirm_success"></div>
			</div>
			<input type="submit" id="submit" value="立即注册">
		</form>
		<script type="text/javascript">
			// 获取所有的input输入框
			var username = document.getElementById("username")
			var password = document.getElementById("password")
			var confirmPassword = document.getElementById("confirm_password")
			var submit = document.getElementById("submit")
			
			// 获取到所有的错误提示div
			var nameError = document.getElementsByClassName("name_error")[0]
			var pwdError = document.getElementsByClassName("pwd_error")[0]
			var confirmError = document.getElementsByClassName("confirm_error")[0]
			
			// 获取到所有的正确提示div
			var nameSuccess = document.getElementsByClassName("name_success")[0]
			var pwdSuccess = document.getElementsByClassName("pwd_success")[0]
			var confirmSuccess = document.getElementsByClassName("confirm_success")[0]
			
			// 获取密码规则的温馨提示
			var tips = document.getElementsByClassName("tips")
			
			// 获取密码model
			var pwdModel = document.getElementById("pwd_model")
			
			
			
			// 用户名随便写~(但是不能为空)
			// username获得焦点时,提示
			username.addEventListener("focus", function() {
				// 点击这个输入框后,先把字体变成黑色的
				username.style.color = "#000"
			})
			// username失去焦点时,验证
			username.addEventListener("blur", checkName)
			
			/* 点击密码框,提示信息
				* 获取焦点时,提示用户密码规则
				* 失去焦点时,验证密码规则
					* 如果错误则提示哪错了
					* 如果正确则验证正确
					* 如果密码为空,提示
			*/
		   password.addEventListener("focus", function() {
			   // 点击这个输入框后,先把字体变成黑色的
			   password.style.color = "#000"
			   
			   pwdError.textContent = ""
			   for (var i = 0; i < tips.length; i++) {
				   var tip = tips[i]
				   tip.style.display = "block"
				   pwdModel.style.marginBottom = "66px"
			   }
		   })
		   
		   // 设置规则
		   /*
			* 不能包含空格
			* 长度为8-16个字符
			* 必须包含字母、数字、符号中至少2种
		   */
		   password.addEventListener("blur", checkPwd)
		   
		   // 重复密码
		   /*
			比较是否和上面设置的密码一致
		   */
		   confirmPassword.addEventListener("focus", function() {
			   // 点击这个输入框后,先把字体变成黑色的
			   confirmPassword.style.color = "#000"
		   })
		   
		   confirmPassword.addEventListener("blur", checkConfirmPwd)
		   
		   function checkName() {
			  if (username.value === "") {
				  console.log("用户名为空")
				  nameError.textContent = "用户名不能为空"
				  nameError.style.display = "block"
				  nameSuccess.style.display = "none"
				  return false
			  } else {
				  nameError.textContent = ""
				  nameError.style.display = "none"
				  // 提示正确
				  nameSuccess.style.display = "block"
				  return true
			  }
		   }
		   
		   function checkPwd() {
			   for (var i = 0; i < tips.length; i++) {
				   var tip = tips[i]
				   tip.style.display = "none"
			   }
			   pwdModel.style.marginBottom = "40px"
			   
			   
			   var noSpaceReg = /^[^\s]+$/
			   var lenReg = /.{8,16}$/
			   var leastTwoReg = /(?!.*\s)(?!^[\u4e00-\u9fa5]+$)(?!^[0-9]+$)(?!^[A-z]+$)(?!^[^A-z0-9]+$)^.{8,16}$/
			   
			   var pwdValue = password.value
			   if (password.value === "") {
				   pwdError.textContent = "密码不能为空"
				   pwdError.style.display = "block"
				   pwdSuccess.style.display = "none"
				   return false
			   } else if (!noSpaceReg.test(pwdValue)) {
				   pwdError.textContent = "密码中不能包含空格"
				   pwdError.style.display = "block"
				   pwdSuccess.style.display = "none"
				   return false
			   } else if (!lenReg.test(pwdValue)) {
				   pwdError.textContent = "密码长度为8-16位字符"
				   pwdError.style.display = "block"
				   pwdSuccess.style.display = "none"
				   return false
			   } else if (!leastTwoReg.test(pwdValue)) {
				   pwdError.textContent = "密码中必须包含字母、数字、符号中至少2种"
				   pwdError.style.display = "block"
				   pwdSuccess.style.display = "none"
				   return false
			   } else if (noSpaceReg.test(pwdValue) && lenReg.test(pwdValue) && leastTwoReg.test(pwdValue)) {
				   pwdError.textContent = ""
				   pwdError.style.display = "none"
				   // 提示正确
				   pwdSuccess.style.display = "block"
				   return true
			   }
		   }
		   
		   function checkConfirmPwd() {
			   if (password.value !== confirmPassword.value) {
				   confirmError.textContent = "密码不一致,请重新输入"
				   confirmError.style.display = "block"
				   confirmSuccess.style.display = "none"
				   return false
			   } else {
				   confirmError.textContent = ""
				   confirmSuccess.style.display = "block"
				   return true
			   }
		   }
		   
		   // 提交注册
		   submit.addEventListener("click", function(event) {
			   if (!checkName() || !checkPwd() || !checkConfirmPwd()) {
				   // 说明其中肯定有一项是不符合规则的,则不能提交
				   event.preventDefault()
			   }
		   })
		</script>
	</body>
</html>

效果图:
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码小余の博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值