BOM对象

BOM对象

1.window对象

1.1 窗口大小

innerWidth、innerHeight:页面视口大小(包含滚动条)
outerWidth、outerHeight:浏览器自身大小

document.documentElement.clientWidth
document.documentElement.clientHeight:页面视口(document)的宽高(不包含border)

document.documentElement.offsetWidth
document.documentElement.offsetHeight:包含边框

let pageWidth = window.innerWidth,
pageHeight = window.innerHeight;
if (typeof pageWidth != "number") {
	if (document.compatMode == "CSS1Compat"){
		pageWidth = document.documentElement.clientWidth;
		pageHeight = document.documentElement.clientHeight;
} 	else {
		pageWidth = document.body.clientWidth;
		pageHeight = document.body.clientHeight;
	}
}

1.2 视口位置

window.pageXoffset/window.scrollX

window.pageYoffset/window.scrollY

// 相对于当前视口向右滚动40像素
window.scrollBy(40, 0);
// 滚动到页面左上角
window.scrollTo(0, 0);

//这几个方法也都接收一个ScrollToOptions字典,除了提供偏移值,
//还可以通过behavior属性告诉浏览器是否平滑滚动。 auto正常,smooth平滑
window.scrollTO({
    left: 100,
    top: 100,
    behavior: 'smooth'
});

1.3 打开新窗口

window.open()可以导航与打开新窗口,这个方法接收4个参数:要加载的URL、目标窗口、 特性字符串和表示新窗口在浏览器历史记录中是否替代当前加载页 面的布尔值。

//<iframe src="" name="iframe_a" width="400px" height="300px"></iframe>

// 与<a href="http://www.wrox.com" target="iframe_a"/>相同
window.open("http://www.wrox.com/", "iframe_a");

会在窗格中打开URL,如果没有此窗格则会打开新窗口,这个参数也可以是 _self、 _parent、_top或_blank。

  • 第三个参数,特性字符串只在弹出新窗口时适用,width、toolar(是否显示工具类)、status(状态栏)、
    scrollbars(滚动)、resizable(调整大小)、Menubar(菜单栏)、location(地址栏)

    window.open("http://www.wrox.com/",
    "wroxWindow",
    "height=400,width=400,top=10,left=10,resizable=yes");
    

  • window.open()方法返回一个对新建窗口的引用,以方便控制和传递信息

    新窗口可以使用top.close() 关闭自己,还有一个opener属性指向打开它的窗口


1.4 定时器

setTimeout()用于指定在一定时间后执行某些代码,而setInterval()用于指 定每隔一段时间执行某些代码。

setTimeout()方法通常接收两个参数:要执行的代码和在执行回调函数前等待的时间(毫秒)。第一个参数可以是包含JavaScript代码的字符串(类似于传给eval()的字符串)或者一个函数。第二个参数是要等待的毫秒数,而不是要执行代码的确切时间。

JavaScript是单线程的,所以每次只能执行一段代码。为了调度不同代码的执行,JavaScript维护了一个任务队列。其中的任务会按照添加到队列的先后顺序执行。setTimeout()的第二个参数只是告诉JavaScript引擎在指定的毫秒数过后把任务添加到这个队列。 如果队列是空的,则会立即执行该代码。如果队列不是空的,则代码必须等待前面的任务执行完才能执行。

// 设置超时任务
let timeoutId = setTimeout(() => alert("Hello world!"), 1000);
// 取消超时任务
clearTimeout(timeoutId);

所有超时执行的代码(函数)都会在全局作用域中的一个匿名函数中运行,因此函数中的this值在非严格模式下始终指向window,而在严格模式下是undefined。如果给setTimeout()提供了一个箭头函数,那么this会保留为定义它时所在的词汇作用域。


1.5 对话框

alert()、confirm()、prompt()、print() 打印功能

alert() 为警告框

confirm() 确认框 有两个”确定‘和“取消“按钮

// 可以通过返回值判断用户的点击
if (confirm("Are you sure?")) {
	alert("I'm so glad you're sure!");
} else {
	alert("I'm sorry to hear you're not sure.");
}

prompt() 提示框 可以让用户输入信息

//了OK按钮,则prompt()会返回文本框中的值。如果
//用户单击了Cancel按钮,或者对话框被关闭,则prompt()会返回 null
let result = prompt("What is your name? ", "");
if (result !== null) {
	alert("Welcome, " + result);
}

2.location对象

window.location和document.location指向一个对象

假设当前URL为http://foouser:barpassword@www.wrox.com/WileyCDA/?q=javascript#contents

hash、host、href、pathName、port、protocol、origin

2.1 操作地址

//下面三个方法相同会更改地址(刷新)
location.assign("http://www.example.com");
window.location = "http://www.example.com";
location.href = "http://www.example.com";

更改除了hash的属性都会让页面刷新

还可以使用replace()方法不会产生历史记录(无回退按钮)

reload() 刷新:

location.reload(); // 重新加载,可能是从缓存加载
location.reload(true); // 重新加载,从服务器加载

3. navigator对象

本章略

4. screen对象

availWidth、availHeight 当前屏幕最大可用宽高

width、height屏幕宽高


5. history对象

// 后退一页
history.go(-1);
// 前进两页
history.go(2);

// 后退一页
history.back();
// 前进一页
history.forward();

history对象还有一个length属性,表示历史记录中有多个条目。

5.1 历史状态管理(单页面)

用户 每次点击都会触发页面刷新的时代早已过去,为解决这个问题

最开始时开发者利用更改hash不刷新的特性配合hashchange事件,实现伪刷新。而history的状态管理可以修改URL而不刷新页面。

history.pushState()方法。
这个方法接收3个参数:一个state对象、一个新状态的标题和一个(可选的)相对URL

let stateObject = {foo:"bar"};
history.pushState(stateObject, "My title", "baz.html");

pushState()方法执行后,状态信息就会被推到历史记录中,浏览器地址栏也会改变以反映新的相对URL。

第一个参数应该包含正确初始化页面状态所必需的信息。通常在500KB~1MB以内。
第二个参数并未被当前实现所使用,因此既可以传一个空字符串也可以传一个短标题。

在点击前进和后退按钮时会触发popstate事件,该事件的事件对象有一个state属性->之前设置的初始化对象

window.addEventListener("popstate", (event) => {
	let state = event.state;
	if (state) { // 第一个页面加载时状态是null
		processState(state);
	}
});

history.state获取当前页面的状态对象
还可以使用replaceState()并传入与pushState()同样的前两个参数来更 新状态。

history.replaceState({newFoo: "newBar"}, "New title");

传给pushState()和replaceState()的state对象应该只包含可以被序列化的信息。因此,DOM元素之类并不适合放到状态对象里保存。

使用HTML5状态管理时,要确保通过pushState()创建的每个“假”URL背后都对应着服务器上一个真实的物理URL。否则,单击“刷新”按钮会导致404错误。所有单页应用程序(SPA,Single Page Application)框架都必须通过服务器或客户端的某些配置解决这个问 题。

上一篇:【前端】JavaScript学习笔记(五)——操作BOM与DOM对象


下一篇:自动化操作——JS