一.BOM浏览器对象模型
1.BOM思想
BOM:Browser Object Model 浏览器对象模型
把浏览器的各个组成部分看做一个对象。
BOM:Browser Object Model 浏览器对象模型
* 概念:
* 将浏览器的各个组成部分封装为对象
* 特点:
* BOM对象不能自己创建,当HTML文档加载进内存,浏览器自动创建。
* 组成:
* Window(*****):窗口对象
* Location(**):地址栏对象
* History(*):历史记录(当前窗口)对象
* Navigator :浏览器对象 基本不用仅作了解
* Screen:显示器屏幕 基本不用仅作了解
availHeight 获取系统屏幕的工作区域高度,排除 Microsoft Windows 任务栏。
availWidth 获取系统屏幕的工作区域宽度,排除 Windows 任务栏。
height 获取屏幕的垂直分辨率。
width 获取屏幕的水平分辨率。
2.window中有关弹框的方法
注:window对象可以省略不写
alert()弹出一个警告框
confirm()弹出一个确认取消框。点击确定返回true 点击取消返回false;
prompt()弹出一个输入框
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script type="text/javascript">
//alert()弹出一个警告框
window.alert("芜湖");
//confirm()弹出一个确认取消框。点击确定返回true 点击取消返回false;
var v=window.confirm("外币外币");
document.write(v);
//prompt()弹出一个输入框
var v2=window.prompt("请输入你的姓名");
document.write(v2);
</script>
</body>
</html>
3.window对象中的属性
所有浏览器都支持 window 对象。它表示浏览器窗口。
location获取url信息
screen获取屏幕信息
document获取HTML文档对象
history获取到历史记录对象
navigator获取到浏览器对象
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
</body>
<script type="text/javascript">
//获取url信息
var location = window.location;
//获取屏幕信息对象
var screen = window.screen;
//console.log(screen);
//获取HTML文档对象。
var doc = window.document;
//获取到历史记录对象
var history=window.history;
//console.log(history);
//获取到浏览器对象
var nav = window.navigator;
</script>
</html>
4.window对象
所有浏览器都支持 window 对象。它表示浏览器窗口。
所有 JavaScript 全局对象、函数以及变量均自动成为 window 对象的成员。
全局变量是 window 对象的属性。
全局函数是 window 对象的方法。
甚至 HTML DOM 的 document 也是 window 对象的属性之一:
1.尺寸:
innerHeight浏览器的高度
innerWidth浏览器的宽度
document浏览器的文档对象
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
</body>
<script type="text/javascript">
//window的尺寸
var height=window.innerHeight;
document.write(height);//657
document.write(window.innerWidth);//1366
document.write(window.document);//[object HTMLDocument]
</script>
</html>
5.navigator对象
window.navigator 对象在编写时可不使用 window 这个前缀。
浏览器对象,封装了浏览器的信息,了解即可.
appCodeName 浏览器代号
appName 浏览器名称
appVersion 浏览器版本
cookieEnabled 浏览器是否启用了cookie
platform浏览器硬件平台
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
</body>
<script type="text/javascript">
document.write(window.navigator.appCodeName); //Mozilla
document.write("<br>");
document.write(window.navigator.appName);//Netscape
document.write("<br>");
document.write(window.navigator.appVersion);//5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
document.write("<br>");
document.write(window.navigator.cookieEnabled);//true
document.write("<br>");
document.write(window.navigator.platform);//Win32
</script>
</html>
6.screen对象
屏幕对象,封装了浏览器屏幕的信息
availHeight 返回屏幕的高度(不包括Windows任务栏)
availWidth 返回屏幕的宽度(不包括Windows任务栏)
colorDepth 返回目标设备或缓冲器上的调色板的比特深度
height 返回屏幕的总高度
pixelDepth 返回屏幕的颜色分辨率(每象素的位数)
width 返回屏幕的总宽度
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
</body>
<script type="text/javascript">
/*
availHeight 返回屏幕的高度(不包括Windows任务栏)
availWidth 返回屏幕的宽度(不包括Windows任务栏)
colorDepth 返回目标设备或缓冲器上的调色板的比特深度
height 返回屏幕的总高度
pixelDepth 返回屏幕的颜色分辨率(每象素的位数)
width 返回屏幕的总宽度 */
document.write(screen.width); //1366
document.write("<br>");
document.write(screen.availHeight);//728
document.write("<br>");
document.write(screen.availWidth);//1366
document.write("<br>");
document.write(screen.colorDepth);//24
document.write(screen.pixelDepth);//24
</script>
</html>
7.location对象
地址栏信息对象,用于获得当前页面的地址 (URL),并把浏览器重定向到新的页面。
注:浏览器会对地址栏中的URL中的中文字符,进行URL编码。
location.href当前载入页面的完整URL
decodeURIComponent解码
encodeURIComponent()编码
location.hostname 返回 web 主机的域名
location.pathname 返回当前页面的路径和文件名
location.port 返回 web 主机的端口 (80 或 443)
location.protocol 返回所使用的 web 协议(http: 或 https:)
属性:search 属性是一个可读可写的字符串,可设置或返回当前 URL 的查询部分(问号 ? 之后的部分)。
浏览器为什么要对地址中的URL中的中文进行编码?
答:
有规范,在参数值中出现&字符会截断参数
url中文的问题,编码客转换为英文
也是第一种情况,url中有个参数值是url,传输的时候会出现错误
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>location对象</title>
</head>
<body>
</body>
<script type="text/javascript">
/*
地址栏:127.0.0.1:8848/20200713-下午-博客/location对象
解析过的:http://127.0.0.1:8848/20200713-%E4%B8%8B%E5%8D%88-%E5%8D%9A%E5%AE%A2/location%E5%AF%B9%E8%B1%A1.html
*/
document.write(window.location.href); //获取解析过的地址栏对象
document.write("<br>");
var text = location.href;
document.write(text);
//url解码 decodeURIComponent
var url = decodeURIComponent(text);
document.write(url);
document.write("<br>");
//url编码 encodeURIComponent()编码
var text2 = encodeURIComponent(url);
document.write(text2);
document.write("<br>");
/* location.hostname 返回 web 主机的域名
location.pathname 返回当前页面的路径和文件名
location.port 返回 web 主机的端口 (80 或 443)
location.protocol 返回所使用的 web 协议(http: 或 https:)
*/
document.write(location.host)//127.0.0.1:8848
document.write("<br>");
document.write(location.pathname)
document.write("<br>");
document.write(location.hostname)
document.write("<br>");
document.write(location.protocol)
//设置地址栏中的内容,可以跳转页面
function toPage(){
//window.open();
location.href="http://www.baidu.com" //DNS
//http://www.godsince.com:8080/news/index.asp?boardID=5&ID=24618&page=1#r_70732412
}
</script>
<a href="javascript:void(toPage())">进入百度</a>
</html>
8.history对象
为了保护用户隐私,对 JavaScript 访问该对象的方法做出了限制。
方法:
history.back() - 与在浏览器点击后退按钮相同,相当于go(-1);
history.forward() - 与在浏览器中点击向前按钮相同
二.定时器
1.window中关于定时器的方法
setTimeout()设置延时执行一次的定时器
setInterval()设置循环定时器
<!DOCTYPE html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script type="text/javascript">
/* setTimeout()定时器 */
function show() {
alert("定时器");
}
//设置延时执行一次的定时器,单位是毫秒,延迟2s,返回的是定时器的id
//间隔2s执行定时器
var id = window.setTimeout(show, 2000);
//根据定时器的id取消定时器
window.clearTimeout(id);
/* setInterval()设置循环定时器 */
var i = 1;
function show2() {
document.write("芜湖");
i++;
}
var timeId = window.setInterval(show2, 1000);
//匿名函数也可以作参数
var timeid2 = window.setInterval(function() {
//在控制台输出
console.log(i);
}, 1000);
//根据id关掉定时器
/* window.clearInterval(timeId);
window.clearInterval(timeId2); */
function clear() {
window.clearInterval(timeId);
window.clearInterval(timeId2);
}
</script>
<!-- <a href="javascript:void(clear())">停止定时器</a> -->
<button onclick="clearInterval(timeId)">关闭定时器</button>
</body>
</html>
2.页面时钟
获取当前页面的时间:
js中innerHTML和innerText的区别
innerHTML
innerHTML 会将标签和标签中的内容否获取回来
innerHTML .innerHTML = ‘<p></p>’; 只会将文本内容解析出来,不会显示标签
innerText
innerText 只会将标签中的内容获取回来,不会获取标签
innerText 有参数, .innerText = ‘<p></p>’, 会将标签和内容都解析到网页中
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="js/moment.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<h1 id="time">2020-07-13 23:04:30</h1>
</body>
<script type="text/javascript">
function showTime(){
var myh = document.getElementById("time");
//alert(myh);
//var timeStr = new Date().toLocaleString();
myh.innerText =moment().format('YYYY-MM-DD HH:mm:ss');
}
showTime();
//隔1s展示一次
window.setInterval(showTime,1000);
</script>
</html>
三.JS总结
1.数据类型
(1)number
JS中不区分大小写
123 整数
3.41 小数
1.133e3科学计数法
-99负数
NaN not a number
infinity 无穷大
(2)比较运算符
=赋值
==等于,类型不同值一样,结果仍为true
===绝对等于,类型一样,结果才为true
注意:
NaN==NaN,false,这个与所有的数值都不相等,包括自己
只能通过isNaN(NaN)来判断这个数是否是NaN
进来避免使用浮点数
2.严格检查模式
局部变量建议都使用let关键字
严格检查模式:'use strict';预防JavaScript的随意性导致产生的一些问题,它必须写在script的第一行
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script type="text/javascript">
//没有var时,默认是全局变量
//var i=1;
//在ES6中,局部变量建议都使用let关键字
'use strict';
i=1;
console.log(i);
</script>
</body>
</html>
3.ES6支持多行字符串编写
使用`来支持多行字符串的编写功能
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script type="text/javascript">
//没有var时,默认是全局变量
//var i=1;
//在ES6中,局部变量建议都使用let关键字
'use strict';
//使用`来支持多行字符串的编写功能
var msg=`nihao
芜湖
aaa
111
`;
console.log(msg);
</script>
</body>
</html>
4.模板字符串
let name="libai";
let age=19;
let msg=`你好,${name}`;
5.JS中的对象
JS中所有的键都是字符串,值是任意对象
若干个键值对
var 对象名={
属性名1:属性值1,
属性名2:属性值2,
属性名3:属性值3
}
注意:
1.键值对中间以:分隔
2.多个键值对以,分隔
3.最后一个键值对没有,
4.方法也是一个属性
//定义了person对象,他有四个属性
var person={
name:"张三",
age:3,
emial:"2402636221@qq.com",
score:0
}
总结:js中的对象以{}包起来,键值对描述属性,多个属性间使用逗号隔开,最后一个属性之间不加逗号
1.对象的赋值
person.name="lisi";
2.使用一个不存在的对象属性,不会报错,undefined
person.data
undefined
3.动态的删减属性
JS通过delete删除对象的属性
delete person.name
true
person
{age: 3, emial: "2402636221@qq.com", score: 0}
4.动态的增加属性,直接给新添加的属性赋值即可
person.haha="haha";
person
5.判断属性值是否在这个对象中 xxx in xxxx
注意:JS中所有的键都是字符串,值是任意对象
'name' in person
true
//相当于继承
'toString' in person
true
6.判断一个属性是否是这个对象自身拥有的
person.hasOwnProperty('toString')
false
person.hasOwnProperty('age')
true
6.流程控制
if()else...语句
while()循环,避免死循环
for()循环
JS中的foreach()循环:5.1引入
var arr=[11,222,33,5,888,900];
//函数,e代表每一个元素
arr.forEach(function(e){
console.log(e);
})
JS中的for()...in语句:
语法:
for (变量 in 对象)
{
在此执行代码
}
for(var index in arr){
console.log(index);
}
JS中的for...of语句
语法:打印每一个元素
var arr=[1,2,3,4];
for(var x of arr){
console.log(x);
}
建议使用for ... of ,for ...in存在bug
四.JS语法
1.Map和Set
ES6增加的特性,使用idea需要配置符合ES6标准
Set 无序不重复集合
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script type="text/javascript">
//里面是一个二维数组
var map=new Map([['zs',22],['ls',33],['ww',44]]);
//通过键来获得值
var score=map.get('zs');
//设置值
map.set('wuhu',55);
document.write(score);//22
map.delete('ls');
var set=new Set([1,3,3,3,3]);//[1,3] set集合会去重
set.add(2);
set.delete(2);
//是否包含某个元素
document.write(set.has(3));
</script>
</body>
</html>
2.函数中的rest()和arguements
获取除了已经定义的参数之外的所有参数,rest()必须写在最后且以...标识
arguements是一个数组,存放了函数的所有形参
function test(a,b,...rest){
console.log(a);
console.log(b);
console.log(rest);
}
test(1,2,3,4,54634,45543,342)
1
2
(5) [3, 4, 54634, 45543, 342]
3.变量的作用域
1.
JS中只有块级作用域和全局作业域,全局对象window,默认所有的全局变量,都会绑定在window下,
假设在函数体中申明,则只能在函数体内使用,在函数体外不可以使用
由于我们的所有全局变量都绑定在了我们的window上,如果不同的js文件,使用了相同的全局变量,将产生冲突? 如何解决?
把自己的代码全部放入自己定义的唯一空间名字中,降低冲突
注意:
方法也是变量,因为:
var test3=function(){
...
}
//唯一全局变量
var onlyOne={};
//定义全局变量
onlyOne.name='颤三';
onlyOne.age='18';
onlyOne add=function(a,b){
return a+b;
}
//把自己的代码全部放入自己定义的唯一空间名字中,降低冲突
2.局部作用域let关键字 es6
下面一段代码:
function test(){
for(var i=1;i<100;i++){
console.log(i);
}
console.log(i+1);//101
}
出现一个问题:
i出了作用域还可以使用,为了解决这个问题,es6引入let关键字,解决后就是i is not defined
3.常量const es6
在es6之前,怎么定义常量?大家约定一个格式,全部大写字母命名的变量就是常量,建议不做修改
但是这样不想遵守规范的人直接就修改了,安全性太低,在es6引入了常量关键字const
var PI='3.1415';
PI='200';
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script type="text/javascript">
//里面是一个二维数组
var map=new Map([['zs',22],['ls',33],['ww',44]]);
//通过键来获得值
var score=map.get('zs');
//设置值
map.set('wuhu',55);
document.write(score);//22
map.delete('ls');
var set=new Set([1,3,3,3,3]);//[1,3] set集合会去重
set.add(2);
set.delete(2);
//是否包含某个元素
document.write(set.has(3));
var arr=[1,2,3,4];
for(var x of arr){
console.log(x);
}
function test(){
var x=1;
///内部函数可以访问外部函数的成员,外部函数不能访问内部函数的成员
function test2(){
var y=x+1;
}
//报错
var z=y+1;
}
</script>
</body>
</html>
4.变量作用域提升
function tets(){
var x='x'+y;
console.log(x);
var y='y';
}
结果:
xundefined 证明y是存在的,只是没有赋值等价于:
function tets2(){
var y;
var x='x'+y;
console.log(x);
y='y';
}
说明:js执行引擎,自动提升了y的声明,但是不会提升y的赋值
这是在JavaScript存在之初就有的特性,习惯将所有变量定义放在函数的头部,如:
function aaa(){
var x=1;
y=x+1;
a,b,c//undefined
//要使用时直接赋值
a=1;
}
5.方法的定义和调用
方式1:
注意,方法也是一个变量
方法就是把函数放在对象里面,对象只有属性和方法
//定义一个对象
var student={
name:"zhangsna",
birth:1998,
//方法也是一个变量
age:function(){
var now=new Date().getFullYear();
return now-this.birth;
}
}
//属性
student.name;
//方法,要带()标识方法
student.age()
方式2:
function getAge(){
var now=new Date().getFullYear();
return now-this.birth;
}
var student={
name:'lsio',
birth:1998,
age:getAge
}
document.write(student.age());//22
document.write(getAge());//NaN,使用了window对象,window对象里没有birth
六.面向对象编程
1.原型
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script type="text/javascript">
//定义一个对象
var student={
name:"zs",
age:18,
run:function(){
console.log(this.name+"is Running");
}
}
//创建具体的学生:ls
var ls={
name:'lisi'
}
//ls的原型是studnet,相当于从他里面继承方法来使用
ls.__proto__=student;
var Bird={
fly:function(){
console.log(this.name+"is Flyfly");
}
}
ls.__proto__=Bird;
</script>
</body>
</html>
2.class继承
class关键字是在es6引入的
原型链:原型是无界限的,等同于Java的继承
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script type="text/javascript">
class Student {
//构造方法
constructor(name) {
this.name = name
}
hello() {
alert('hello');
}
}
var student1=new Student('张三');
var student2=new Student('李四');
/* 本质是 ls.__proto__=student; */
class MyStudent extends Student{
constructor(name,grade) {
super(name),
this.grade=grade;
}
mygr(){
alert("111");
}
}
var s1=new MyStudent("梁丽丽",1);
</script>
</body>
</html>