BOM
的核心是window
对象,表示浏览器的实例。window
对象在浏览器中有两重身份,一个是ECMAScript
中的Global
对象,另一个就是浏览器窗口的JavaScript
接口。这意味着网页中定义的所有对象、变量和函数都以window
作为其Global
对象,都可以访问其上定义的parseInt()
等全局方法。
var age = 29;
var sayAge = () => alert(this.age);
alert(window.age); // 29
sayAge(); // 29
window.sayAge(); // 29
如果使用let
或const
替代var
,则不会把变量添加给全局对象。
另外,访问未声明的变量会抛出错误,但是可以在window
对象上查询是否存在可能未声明的变量。
// 这会导致抛出错误,因为 oldValue 没有声明
var newValue = oldValue;
// 这不会抛出错误,因为这里是属性查询
// newValue 会被设置为 undefined
var newValue = window.oldValue;
JavaScript
中有很多对象都暴露在全局作用域中,比如location
和navigator,因而它们也是window
对象的属性。
浏览器窗口打开/关闭
:::info
window.open()
用来打开一个指定url
的窗口。
参数1:要打开的url
参数2:窗口的name
参数3:窗口属性(详见点击)
参数4:新窗口在浏览器历史记录中是否替代当前加载页面的布尔值
📌 **window.open()**
方法返回一个对新建窗口的引用。这个对象与普通**window**
对象没有区别,只是为控制新窗口提供了方便。
:::
widnow.open('url', 'page2', 'width=500,height=500', false);
// 窗口的 nage 也可以是个特殊的 name
// 可选值有 _self、_parent、_top、_blank
window.open('url', '_blank', 'width=500,height=500', false);
var win = widnow.open("https://baidu.com", "width=500,height=500");
console.log(win);
:::info
window.close()
用来关闭window.open()
打开的窗口。
:::
window
对象还有name
、opener
和closed
属性可以获取window
窗口的信息。
// 获取 window.name
var win = window.open('url', 'test', 'width=500,height=500', false);
console.log(win.name)
// window.opener 指向打开新窗口的窗口
window.name = "page1";
var win = window.open("","page2");
console.log(win.opener.name, win.name); // page1 page2
// closed 表示新窗口是否关闭
var win = window.open("","page2");
if(win.closed){
// do...
}
窗口的位置
window.moveTo(坐标x, 坐标y)
window.moveBy(向下移动的像素, 向右移动的像素)
var win = widnow.open("https://baidu.com", "width=500,height=500");
win.moveTo(200, 200);
win.moveBy(10, 10);
窗口的大小
window.innerHeight/window.innerWidth
返回浏览器窗口可视窗口的高/宽度(不包含浏览器边框和工具栏)window.outerHeight/window.outerWidth
回浏览器窗口可视窗口的高/宽度(包含浏览器边框和工具栏) 相关文章:滚动距离、视口尺寸、偏移尺寸
console.log(window.innerHeight);
console.log(window.innerWidth);
window.log(window.outerHeight);
window.log(window.outerWidth);
resizeTo(宽度值, 高度值)
resizeBy(宽度像素, 高度像素)
var win = widnow.open("https://baidu.com", "width=500,height=500");
win.resizeTo(200, 200);
win.resizeBy(10, 10);
窗口的关系
window.top
获取最上层窗口window.parent
获取当前窗口的父窗口window.self
获取当前窗口(之所以还要暴露 self,就是为了和 top、parent 保持一致)
举个例子 🌰:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<h2>这是Page1</h2>
<iframe src="./page2.html"></iframe>
</body>
</html>
<script>
window.name = "page1";
console.log(window.top.name); // page1
console.log(window.parent.name); // page1
console.log(window.self.name); // page1
</script>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<h2>这是Page2</h2>
<iframe src="./page3.html"></iframe>
</body>
</html>
<script>
window.name = "page2";
console.log(window.top.name); // page1
console.log(window.parent.name); // page1
console.log(window.self.name); // page2
</script>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<h2>这是Page3</h2>
</body>
</html>
<script>
window.name = "page3";
console.log(window.top.name); // page1
console.log(window.parent.name); // page2
console.log(window.self.name); // page3
</script>
窗口获取滚动距离和操作滚动距离
:::success
window.pageXoffset
返回浏览器X
轴滚动的距离window.pageYoffset
返回浏览器Y
轴滚动的距离
:::
console.log(window.pageXoffset);
console.log(window.pageYoffset);
:::success
window.scroll(滚动X坐标, 滚动Y坐标)
window.scrollTo(滚动X坐标, 滚动Y坐标)
window.scrollBy(滚动X像素, 滚动Y像素)
:::
// 滚动到页面左上角
window.scrollTo(0, 0);
// 当前视口向下滚动 100 像素
window.scrollBy(0, 100);
这几个方法也都接收一个ScrollToOptions
字典,除了提供偏移值,还可以通过behavior
属性告诉浏览器是否平滑滚动。
// 正常滚动
window.scrollTo({
left: 100,
top: 100,
behavior: 'auto'
});
// 平滑滚动
window.scrollBy({
left: 100,
top: 100,
behavior: 'smooth'
});
系统对话框
:::warning
window.alert("提示的内容")
该方法在使用的时候可以不带window
页面上显示一个提示框,会阻塞程序的执行
:::
window.alert("输入错误!");
alert("输入错误!");
:::warning
window.confirm("提示的内容")
该方法在使用的时候可以不带window
页面上显示一个确认框,返回一个布尔值,会阻塞程序的执行
:::
let res = window.confirm("确认删除?");
let res = confirm("确认删除?");
if(res){
// del...
}
:::warning
window.prompt("提示的内容")
该方法在使用的时候可以不带window
页面上显示一个输入框,返回输入的字符串,会阻塞程序的执行
:::
let res = window.prompt("请输入姓名");
let res = prompt("请输入姓名");
console.log(res);
:::warning
window.print()
该方法在使用的时候可以不带window
将页面进行打印
:::
window.print();
print()
定时器
JavaScript
在浏览器中是单线程执行的,但允许使用定时器指定在某个时间之后或每隔一段时间就执行相应的代码。
setTimeout()
表示一定时间后做某事(延迟器) 返回一个延时的
ID
参数1:要执行的回调函数 参数2:要延迟的时间(毫秒)
// 在 1 秒后显示警告框
setTimeout(() => alert("Hello world!"), 1000);
setTimeout(function(){
// do...
}, 2000);
JavaScript 是单线程的,所以每次只能执行一段代码。为了调度不同代码的执行,JavaScript 维护了一个任务队列。其中的任务会按照添加到队列的先后顺序执行。setTimeout() 的第二个参数只是告诉 JavaScript 引擎在指定的毫秒数过后把任务添加到这个队列。如果队列是空的,则会立即执行该代码。如果队列不是空的,则代码必须等待前面的任务执行完才能执行。
clearTimeout()
用于取消销毁
setTimeout()
延时器 参数1:setTimeout()
返回的ID
// 设置超时任务
let timeoutId = setTimeout(() => alert("Hello world!"), 1000);
// 取消延时器
clearTimeout(timeoutId);
注意 ⚠️ 所有超时执行的代码(函数)都会在全局作用域中的一个匿名函数中运行,因此函数中的
this
值在非严格模式下始终指向 window,而在严格模式下是 undefined。如果给setTimeout()
提供了一个箭头函数,那么this
会保留为定义它时所在的词汇作用域。
setInterval()
表示每隔一定时间后做某事,直到定时器被取消销毁(定时器) 返回一个定时器的
ID
参数1:要执行的回调函数 参数2:要定时等待的时间(毫秒)
setInterval(() => alert("Hello world!"), 10000);
注意 ⚠️ 这里的关键点是,第二个参数,也就是间隔时间,指的是向队列添加新任务之前等待的时间。比如,调用 setInterval() 的时间为 01:00:00,间隔时间为 3000 毫秒。这意味着 01:00:03 时,浏览器会把任务添加到执行队列。浏览器不关心这个任务什么时候执行或者执行要花多长时间。因此,到了 01:00:06,它会再向队列中添加一个任务。由此可看出,执行时间短、非阻塞的回调函数比较适合 setInterval()。
clearInterval()
用于取消销毁
setInterval()
定时器 参数1:setInterval()
返回的ID
// 设置延迟执行任务
let timeoutId = setInterval(() => alert("Hello world!"), 1000);
// 取消超时任务
clearInterval(timeoutId);
相对于**setTimeout()**
而言,取消定时的能力对**setInterval( )**
更加重要。毕竟,如果一直不管它,那么定时任务会一直执行到页面卸载。