BOM操作
BOM 即 Browser Object Model(浏览器对象模型),浏览器模型提供了独立于内容的、可以与浏览器窗口进行滑动的对象结构,就是浏览器提供的 API
window对象是js中的顶级对象(全局对象),所有定义在全局作用域中的变量、函数都会变成window对象的属性和方法,在调用的时候可以省略window。
BOM>window>document>getElementById()

一、window对象
三个弹框:不建议使用,会阻塞代码执行---仅接收纯文本消息
1 window.alert('警告框') 2 window.confirm('确认框') if(isFlag){log(确认键)}else{log(取消键)} 3 window.prompt('请输入一个数字') 输入框 返回内容
宽高表示:
// 窗口的可视宽度和可视高度 console.log(window.innerHeight); console.log(window.innerwidth); // html的宽度和高度 console.log(document.documentElement.clientWidth); console.log(document.documentElement.clientHeight);
窗口的打开关闭移动:
open:URL,name,features,replace
1 // 打开一个新窗口 _self在自己原本的窗口打开页面"_blank"在新窗口打开页面 2 // window.open("http://www.baidu.com","_self") 3 window.open("2.html","_blank","width:200;height:300") 4 // 关闭当前窗口 5 window.close() 6 // 把窗口移动到距离电脑显示屏左上的坐标 ie可用,火狐、谷歌不可用 7 window.moveTo(100,100) 8 // 重新调整浏览器窗口大小 ie可用,火狐、谷歌不可用 9 window.resizeTo(200,200)
| 属性 | 说明 |
|---|---|
alert() |
系统警告对话框,接收字符串参数并显示 |
confirm() |
系统确认对话框,可提供确认或取消两种事件 |
prompt() |
提示对话框,可对用户展示确认、取消事件外,还可提供文本域 |
open() |
可导航至特定的 url,又可打开一个新的浏览器窗口window.open(要加载的url, 窗口目标, 一个特定字符串, 一个新页面是否取代浏览器历史记录中当前加载页面的布尔值) |
onerror() |
事件处理程序,当未捕获的异常传播到调用栈上时就会调用它,并把错误消息输出到浏览器的 JavaScript 控制上。window.onerror(描述错误的一条消息, 字符串--存放引发错误的JavaScript代码所在的文档url, 文档中发生错误的行数) |
setTimeout() |
超时调用——在指定的时间过后执行代码window.setTimeout(function(){...}, 毫秒) |
setInterval() |
间歇调用——每隔指定的时间就执行一次window.setInterval(function(){...}, 毫秒) |
确认窗口位置及大小
获取窗口位置的属性与方法
| 属性 | 说明 | 兼容性 |
|---|---|---|
screenLeft |
窗口相对于屏幕左边的位置 |
适用于IE、Safari、Chrome |
screenTop |
窗口相对于屏幕上边的位置 |
适用于IE、Safari、Chrome |
screenX |
窗口相对于屏幕左边的位置 |
适用于Firefox |
screenY |
窗口相对于屏幕上边的位置 |
适用于Firefox |
moveBy(x,y) |
接收的是在水平和垂直方向上移动的像素数 | 全兼容 |
moveTo(x,y) |
接收的是新位置的x和y坐标值 | 全兼容 |
跨浏览器获取窗口左边和上边位置
窗口大小属性与方法
| 属性 | 说明 |
|---|---|
innerWidth innerHeight
|
IE9+、Safari、Firefox、Opera: 该容器中页面视图区的大小 Chrome: 返回视口大小 移动设备: 返回可见视口(即屏幕上可见页面区域的大小) 移动IE浏览器: 不支持该属性,当移动IE浏览器将布局视口的信息保存至 document.body.clientWidth与document.body.clientHeight中 |
outerWidth outerHeight
|
IE9+、Safari、Firefox: 返回浏览器窗口本身的尺寸 Opera: 返回页面视图容器的大小 Chrome: 返回视口大小 |
resizeTo(width, height) |
接收浏览器窗口的新宽度与新高度 |
resizeBy(width, height) |
接收新窗口与原窗口的宽度与高度之差 |
二、navigator对象
navigator:包含客户端浏览器的信息 主要用来检测浏览器、检测插件
1 navigator.appCodeName //浏览器的代码名称 2 navigator.appName //返回浏览器的名称 3 navigator.appVersion // 返回浏览器的平台和版本信息 4 navigator.language // 返回浏览器的语言 5 navigator.onLine // 返回指明系统是否处于脱机状态下的布尔值 6 navigator.userAgent // 运营商/浏览器的名称 7 navigator.platform //返回运行操作系统的平台
三、location对象
location:包含当前网页的URL信息 主要应用场景:
1、解析 url 查询字符串参数,并将其返回一个对象,可通过循环、正则来实现,方法有很多,实现的大体思路是:
通过location的search属性来获取当前 url 传递的参数,如果 url 中有查询字符串的话就将其问号截取掉,然后再遍历里面的字符串并以等号为断点,使用decodeURIComponent()方法来解析其参数的具体数值,并将其放在对象容器中,并将其返回
2、载入新的文档,也可以说是刷新页面,主要有三个方法:
-
assign(): location.assign("http://www.xxx.com")就可立即打开新 url 并在浏览器是我历史中生成一条新的记录, 在一个生成了 5 条浏览记录的页面中,然后使用 assign()跳转 url 后,history 记录只剩两条,一条是通过 assign 跳转的页面,另一条则是上一个页面(使用 assign()跳转方法的页面),其余的所有页面都被清除掉了 -
replace(): location.replace("http://www.bbb.com")只接受 url 一个参数,通过跳转到的 url 界面不会在浏览器中生成历史记录,就是 history 的 length 不会+1,但是会替代掉当前的页面 -
reload(): 其作用是重新加载当前显示的页面,当不传递参数的时候,如果页面自上次请求以来并没有改变过,页面就会从浏览器中重新加载,如果传递true,则会强制从服务器重新加载
| 属性名 | 例子 | 说明 |
|---|---|---|
hash |
" #host " | 返回 url 中的 hash(#后字符>=0) |
host |
" juejin.im:80 " | 服务器名称+端口(如果有) |
hostname |
" juejin.im " | 只含服务器名称 |
href |
" https://juejin.im/book/5a7bfe... " | 当前加载页面的完整的 url |
pathname |
" /book/5a7bfe595188257a7349b52a " | 返回 url 的的目录和(或)文件名 |
port |
" 8080 " | url 的端口号,如果不存在则返回空 |
protocol |
" https: (or http:) " | 页面使用的协议 |
search |
" ?name=aha&age=20 " | 返回 url 的查询字符串, 以问号开头 |
四、history对象
history:包含浏览器窗口访问过的URL信息 history 对象保存着用户上网的历史记录,从窗口被打开的那一刻算起,history 对象是用窗口的浏览历史用文档和文档状态列表的形式表示。history 对象的 length 属性表示浏览历史列表中的元素数量,但出于安全考虑,脚本不能访问已保存的 url
| 属性 | 说明 |
|---|---|
go() |
1、以在用户的历史记录中任意跳转,go(n)表示前进 n 页, go(-n)表示后退 n 页(n>0) 2、go()可以传递字符串参数,浏览器历史中如果有这条 url 则实现跳转至包含该字符串的第一个位置,否则什么也不做 |
back() |
后退一页 |
forword() |
前进一页 |
length |
保存历史记录的数量,可用于检测当前页面是否是用户历史记录的第一页(history.length === 0) |
五、screen对象
screen:包含客户端显示屏的信息 其提供有关窗口显示的大小和可用的颜色输入信息。

六、document对象
document:包含整个HTML文档,可悲用来访问文档内容,及其所有的页面元素
选择器:
1 var btn = document.getElementById("btn") 2 var btn = document.getElementsByClassName("btn") 3 var btn = document.getElementsByTagName("btn") 4 var btn = document.getElementsByTagNameNS("btn") 5 var btn = document.querySelector("btn") 6 var btn = document.querySelectorAll("btn")
window的几个零碎知识点:
1 <body>
2 <input type="button" value="closeTimerId" id="btn">
3 <script>
4 var btn = document.getElementById("btn");
5 var timerId = setTimeout(function () {
6 alert("23333");
7 }, 3000);
8 btn.onclick = function () { //在设置的时间之前(3s内)点击可以取消定时器
9 clearTimeout(timerId);
10 }
11 </script>
12 </body>
1 <body>
2 <input type="button" value="倒计时开始10" id="btn" disabled/>
3 <script>
4 var btn = document.getElementById("btn");
5 var num = 10;
6 var timerId = setInterval(function () {
7 num--;
8 btn.value = "到时器开始" + num;
9 if (num == 0) {
10 clearInterval(timerId);
11 btn.disabled = false;
12 btn.value = "同意,可以点了";
13 }
14 },1000);
15 </script>
16 </body>
|
offsetWidth和offsetHeight
|
offsetHeight的构成
|
offsetHeight = height + padding + border
offsetWidth相同
|
|
offsetHeight和style.height的区别
|
1. demo.style.height只能获取行内样式,否则无法获取到
2. .style.height是字符串(有单位px), offsetHeight是数值(无单位)
3. .style.height可以设置行内样式,但offsetHeight是只读属性,不可设置
所以:demo.style.height获取 某元素的真实高度/宽度,用.style.height来设置高度/宽度
|
|
|
offsetLeft和offsetTop
|
offsetLeft的构成
|
1,到距离自身最近的(带有定位的)父元素的 左侧/顶部
2,如果所有父级元素都没有定位,则以body为准
3,offsetLeft是自身border左侧到父级padding左侧的距离
|
|
offsetLeft和style.left的区别
|
1,style.left只能获取行内样式
2,offsetLeft只读,style.left可读可写
3,offsetLeft是数值,style.left是字符串并且有单位px
4,如果没有定位,style.left获取的数值可能是无效的
5,最大的区别:offsetLeft以border左上角为基准, style.left以margin左上角为基准
|
|
|
offsetParent
|
构成
|
1. 返回该对象距离最近的带有定位的父级元素
2. 如果当前元素的所有父级元素都没有定位(position为absolute或relative),那么offsetParent为body
3. offsetLeft获取的就是相对于offsetParent的距离
|
|
|
与parentNode的区别
|
parentNode始终指向的是当前元素的最近的父元素,无论定位与否 |

| scrollHeight和scrollWidth | 对象内部的实际内容的高度/宽度(不包括border) |
| scrollTop和scrollLeft | 被卷去部分的顶部/左侧 到 可视区域 顶部/左侧 的距离 |
| onscroll事件 | 滚动条滚动触发的事件 |
| 页面滚动坐标 | var scrollTop = window.pageYoffset || document.documentElement.scrollTop || document.body.scrollTop || 0; |


1 function client() {
2 return {
3 clientWidth: window.innerWidth || document.body.clientWidth || document.documentElement.clientWidth || 0;
4 clientHeight: window.innerHeight || document.body.clientHeitght || document.documentElement.clientHeight || 0;
5 };
6 }
|
e.pageX和e.pageY
|
获取鼠标在页面中的位置(IE8中不支持pageX和pageY,支持window.event获取参数事件) | pageX = clientX + 页面滚动出去的距离 |
| w3c标准 | window.get ComputedStyle(element, null)[属性] |
| IE浏览器 | element.currentStyle[属性] |
| 封装浏览器兼容性函数 |
function getStyle(element, attr) {
if(window.getComputedStyle) {
return window.getComputedStyle(element, null)[attr];
} else {
return element.currentStyle[attr];
}
}
|
- 注册事件
- 注册事件的性能问题
- 移除事件
- 事件冒泡
- 事件捕获 事件的三个阶段
- 事件对象的常见属性
| target | 始终是点击的元素(IE8及之前是srcElement) |
| currentTarget | 执行事件处理函数的元素 |
| this | 始终和currentTarget一样 |
1 <body>
2 <ul id="ul">
3 <li>我是第1个li标签</li>
4 <li>我是第2个li标签</li>
5 <li>我是第3个li标签</li>
6 <li>我是第4个li标签</li>
7 </ul>
8 <input type="button" value="insertLi" id="btn">
9 <script>
10 var ul = document.getElementById("ul");
11 var btn = document.getElementById("btn");
12 //把本来应该给li注册的事件,委托给ul,只需要给一个元素注册事件
13 //动态创建的li,也会执行预期的效果
14 ul.addEventListener("click", test, false); //注册点击事件
15 btn.onclick = function () { //点击同样会有alert
16 var li = document.createElement("li");
17 li.innerHTML = "我是新插入的li标签";
18 ul.appendChild(li);
19 };
20 //函数写在注册事件代码之外,提高性能
21 function test(e) {
22 alert(e.target.innerText);
23 }
24 </script>
25 </body>
| e.stopPropagation( ) | IE8及之前: event.cancleBubble = true; |
| e.preventDefault() | IE8及之前: event.returnValue = false; |
1 <body>
2 <a href="http://www.baidu.com" id="link">百度</a>
3 <script>
4 var link = document.getElementById("link");
5 link.addEventListener("click", fn, false);
6 function fn(e) {
7 e.preventDefault();
8 //若用return false; 不起作用,若用link.onclick = function();return false可以阻止
9 }
10 </script>
11 </body>
| e.type | 事件的类型,如click,mouseover |
| 事件的3个阶段 | 1 捕获阶段 2 目标阶段 3 冒泡阶段 |
| e.eventPhase | 事件阶段 |
| shiftKey/ctrlKey/altKey | 按下鼠标同时按下组合键 |
| button | 获取鼠标的按键 |
| e.clientX和e.clientY | 获取鼠标在可视区域的位置 |
| 1 元字符 |
. 匹配任何单个字符,除了换行
d 数字 \D 非数字 [0-9]
w 数字 字母 下划线 \W 非 [0-9a-zA-Z_]
\s 空白 \S 非空白
\n 换行
\t 制表符
|
| 2 范围-- 匹配的是一个字符 | [0-9] [0123] [a-z] [A-Z] 匹配的是一个字符 |
| 3 | 或者 | | 或者 |
| 4 量词 -只修饰一个字符 |
a+ 1个或多个a
a? 1个或0个a
a* 0个或多个a
a{x} x个n
a{x,} 至少x个a
a{x,y} x-y个a
|
| 5 开始结束 |
^a 以a开始
a$ 以a结束
|
| 6 ( ) 看成是一个整体,即分组 | |
| 7 匹配汉字 | [\u4e00-\u9fa5] |
| 8 参数 |
i 忽略大小写
g 全局匹配
|
| 9 ^在[ ]中的作用——取反 | |
| 10 贪婪模式和非贪婪模式 |
默认情况 贪婪模式 <.+>
非贪婪模式 <.+?>
|
1 <body>
2 <a href="http://www.baidu.com" id="link">百度</a>
3 <script>
4 // var regularExpression = new RegExp("\\d"); //第一种写法
5 var regularExpression = /\d/; //第二种写法
6 var str = "adfj23dald";
7 console.log(regularExpression.test(str)); //test就是匹配方法,结果是true
8 </script>
9 </body>
//验证电子邮箱
// abc@sohu.com
// 11111@qq.com
// aaaaa@163.com
// abc@sina.com.cn
var reg = /^\w+@\w+\.\w+(\.\w+)?$/;
var str = "abc@sina.com.cn";
console.log(reg.test(str));
1 var str = "张三: 1000,李四:5000,王五:8000。";
2 var reg = /\d+/g;
3 //默认情况下,找到第一个匹配的结果就返回,后面加个g,就是全局找
4 var arr = str.match(reg);
5 console.log(arr);
1 var str = "abc,efg,123,abc,123,a";
2 str = str.replace(/,/g,".");
3 console.log(str);
1 var str = "5=a, 6=b, 7=c";
2 str = str.replace(/(\d+)=(\w+)/g, "$2=$1");
3console.log(str);
|
方法
keydown 按下时
keypress 按下
keyup 抬起时
|
属性
keyCode 键盘码,只有数字和字母对应ASCII码
charCode 对应ASCII码,只有在keypress中才生效(IE9+)
|
1 <body>
2 <input type="text"><input type="text"><input id="t1" type="text"><input type="text"><input type="text"><input type="text"><inputtype="text"><input type="text"><input type="text"><input type="text">
3 <script>
4 var inputs = document.body.getElementsByTagName("input");
5 for(var i = 0, length = inputs.length; i < length ; i++) {
6 var input = inputs[i];
7 //回车键的keyCode是13
8 if(input.type === "text") {
9 //按下回车,让下一个文本框获得焦点
10 input.onkeydown = function (e) {
11 if(e.keyCode === 13) {
12 this.nextElementSibling.focus();//focus() 他触发了onfocus事件
13 }
14 }
15 }
16 }
17 </script>
18 </body>
1 var num = 5;
2 var arr = [];
3 console.log(num instanceof Array); //false
4 console.log(arr instanceof Array); //true

浙公网安备 33010602011771号