BOM(Browser Object Model)

BOM(浏览器对象模型),提供了一系列操作浏览器,获取浏览器信息的接口。这些接口在平时的工作中会经常用到,例如当前页面的刷新,获取url的参数等等。

BOM相关对象

注:图片来自 http://www.dreamdu.com/javascript/what_is_bom/

window对象

window对象是BOM的核心,表示的是浏览器的实例。

在全局作用域下声明的变量会变成window对象的属性,函数会变成window对象的方法。但是全局环境下声明的变量对比window对象的属性和方法还是有区别的。

  1. 访问不存在的全局变量会报错,但是访问 window 对象上不存在的属性会返回 undefined,并不会报错。
  2. 可以使用 delete 操作符删除 window 对象上的正常属性并返回结果为 true 删除成功,但是删除全局变量则返回结果为 false 删除失败。

frames

window 对象的 frames 属性里面有整个页面的全部框架的 window 对象,访问这些框架的 window 对象的方式可以是使用框架名称( iframe标签的name属性 <iframe name='frame1'></frame> ,同时 window.name 也可以获取当前框架的名称),也可以是按照从左到右从上到下的顺序(从0开始)来访问,同时可以在框架内使用 self 访问自身 window 对象,使用 parent 访问上级框架的 window 对象,使用 top 访问顶级框架的 window 对象(浏览器窗口)。在顶级环境中这三个属性是相等的(top === self && parent === self // true)。

在不同的框架中,因为每个框架都有自己的 window 对象并且 window 对象都包含原生类型的构造函数,这就意味着框架1的 {} 并不是框架2的 Object 的实例。

// a.html
<html><head></head><body><iframe src="b.html"></iframe><script>function a(){alert('a');}frames[0].onload = function(){  // 注意这里要等到框架加载完成才能取到框架的window对象this.b();}</script></body>
</html>
// b.html
<html><head></head><body><script>function b(){alert('b');}top.a();// 或者parent.a();</script></body>
</html>

上面代码的执行结果是先弹出 a 再弹出 b。这就说明可以通过 parent 来获取父框架,也可以使用 frames 属性获取当前页面内的框架。

注:涉及到跨页面操作,必须要通过服务器访问文件,并且两个页面要在同一域下才可。例如上面的文件a直接打开是不能正常运行的,需要将a文件和b文件放在一个服务器下然后通过域名或者ip来访问才能正常显示。

location

location的组成部分
location 对象是唯一一个既是 window 对象的属性也是 document 对象的属性 window.location === document.location

注:图片来自 http://www.dreamdu.com/javascript/window.location/

该属性中保存了浏览器窗口当前url地址的格式化信息,同时可以通过该属性提供的方法来指定浏览器当前窗口的页面跳转。

获取格式化好的search属性中的参数

function formatQuery(search){var qs = search.length ? search.slice(1) : '',qsArr = qs.length ? qs.split('&') : [],i = 0,len = qsArr,result = {};for( ; i < len; i++ ){var _item = qsArr[i].split('=');    result[decodeComponentURI(_item[0])] = decodeComponentURI(_item[0]); //不要忘记解码}return result;}

修改每一个属性(除了hash)都会刷新浏览器,并且都会(包括hash)生成一个历史记录。

注:location.toString() 得到的值就是当且页面的地址 location.toString() === location.href //true

location.reload()

使用 location.reload() 会刷新当前页面,但是有可能在缓存中读取页面,如果想要强制重新从服务器获取页面可以使用 location.reload(true)

location.assign()

指定页面跳转地址,对 location.href(也可以直接对 location 赋值 window.location = url)赋值跳转就是调用该方法。

注:该方法并不能完成当前页面的刷新 location.assign(location.href),并不会刷新页面。

location.replace()

该方法和 location.assign() 一样,但是会 替换当前的地址记录,也就是说使用该方法跳转 页面history.length 并不会加一 ,并且 history.back()不能回到上一个页面

a.html —-> b.html –replace–> c.html –back–> a.html

注:同上并不能用于页面的刷新,也就是说使用 location 对象实现刷新必须要使用 reload 方法

history

history对象里面记录了浏览器该窗口访问的历史记录栈,但是由于隐私的问题并不能获取浏览器到底访问了哪些页面,但是可以通过history.length知道历史栈里面的记录条数。

history.back();  // 如果有就加载历史记录中后一个链接history.forward(); // 如果有就加载历史记录中前一个链接history.go(0); // 刷新当前页history.go(1); // 同 history.forward();history.go(-1); // 同 history.back();history.go(n); // 正数向前,负数向后。值就表示从当前记录开始第n条记录

注:history 对象的这三个方法并不会改变 length 的长度,也就是说 back 并不会删除当前页面的记录,还可以通过 forward 回来,但是如果 back 了并且打开了别的链接,那么在 back 之前的页面记录在 history 中就没有了。
a.html —-> b.html —-> c.html –back–> b.html –forward —-> c.html –back–> b.html –back–> a.html —-> e.html –back–> a.html –forward–> e.html –forward–> e.html

navigator

userAgent属性是用户代理头的字符串表示,经常被用于判断设备。比如是否是在微信中,是什么浏览器等。

navigator.userAgent // "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1"

但是userAgent的信息并不十分可靠,应为这个属性是可写的,也就是说会被伪造。

cookieEnabled属性返回表示cookie是否启用,cookie返回true表示启用,否则返回false表示未启用。

navigator.cookieEnabled // true

navigator对象除了上面两个常用的属性外还有很多其他的属性具体看文末参考。

screen

可以通过screen对象获取电脑屏幕的相关信息。

width:屏幕的宽度

height: 屏幕的高度

availHeight:屏幕可用高度,应为系统会有任务栏等并不能全部都给浏览器用,所以这个值可能和screen.height不一致

availWidth:屏幕可用宽度

计时器

setTimeout方法 超时调用

超时调用:是指在规定时间( 时间是以毫秒为单位)后执行指定函数。

var id = setTimeout(function(){console.log('1秒后')
}, 1000); // 1秒后打印 '1秒后'

该方法会返回一个 int 类型的数据,可以通过该值去取消定时器的执行。

clearTimeout(id); // 这样就会不打印 '1秒后' 

setInterval方法 间歇调用

间歇调用:指定的时间间隔重复执行指定函数。

var id = setInterval(function(){console.log('1秒后')
}, 1000); // 每间隔 1 秒就会答应出 '1秒后'
clearInterval(id); // 停止打印

使用场景:

  1. 倒计时(验证码获取)
  2. 动画
  3. 数字时钟
  4. 等等

打开新窗口

我们知道可以通过a标签的 target="_blank" 来让浏览器打开一个新窗口,那么怎么使用js来打开新的窗口?

可以使用 window.open( url, target, features ) 返回值是一个新窗口的window对象,可以用于关闭新打开的窗口(newWindow.close()

window.open('http://www.baidu.com', '_blank', 'height=600,width=600'); // 这样就在浏览器中打开了一个新窗口
//如果没有第三个参数就是打开一个新标签页,如果第二个属性不是 _blank 不会打开一个新窗口

type:值可以是 _blank、_self、_top、_parent和页面中的框架名称中的一个。

features:字段的要求是用逗号分割属性并且属性之间不能使用空格,除了height、width等基本属性还有其它属性详见参考。

系统对话框

系统对话框可以提示用户相关信息或者做出简单的交互。弹出系统对话框的时候js代码是暂停运行的,只有用户做出响应之后才会继续执行,这是同步的。

alert(msg) 会将msg展示出来,并且只有一个确定按钮

var a = alert('控制台没有打印"a"'); // 没有返回值
console.log("关闭对话框后,控制台打印了'a'", "我是alert的返回值:" + a);

confirm(msg) 会展示msg,并且有确定和取消,确定返回 true,取消返回false

var res = confirm('努力学习就会进步吗?');
if( res ){console.log('努力学习就会进步');
}else{console.log('努力学习不会进步');
}

prompt(msg) 会展示一个msg并且提供一个输入框,返回值就是输入的值

var res = prompt('请输入年龄');  // 如果点击了取消返回值是null,点击确定返回值就是输入框的值。if( res ){console.log('年龄是:' + res);
}

尺寸

获取浏览器可视窗口的尺寸并不包括工具栏和滚动条

// 现代浏览器
window.innerHeight// IE6/7/8
document.documentElement.clientHeight
// 或者
document.body.clientHeight// 完整方案
var h = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
var w = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;

参考

http://www.jb51.net/article/97904.htm

http://www.w3school.com.cn/jsref/dom_obj_navigator.asp

http://www.dreamdu.com/javascript/bom/

https://itbilu.com/javascript/js/4k9JcnZRl.html#BOM-screen

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362239.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

入门 IT 行业,该具备哪些技能?

对于刚开始进入IT的新人来说&#xff0c;“必备技能”往往意味着一个长长的、标有重要度的学习列表&#xff0c;但是过长的列表通常会导致新人不知如何开始学习&#xff0c;压力倍增。本文尝试列举出最重要的几个技能&#xff0c;也期望通过此列表能给新人一个比较明确的学习重…

实验七作业

Part 1:验证性实验 将line29&#xff1a;for(i0;i<N;i)改为while(!feof(fp)) // 从文本文件file1.dat中读取数据&#xff0c;找出最高分和最低分学生信息&#xff0c;并输出在屏幕上 #include <stdio.h> #include <stdlib.h>#define N 10// 定义一个结构体类型…

块级格式化上下文(Block Formatting Context)

CSS块级格式化上下文是块级盒子的一种能力&#xff0c;这种能力并不是直接通过css属性声明而获得的&#xff0c;而是添加css的一部分相关属性之后自动获得的能力&#xff0c;也就是说没有一个明确的属性就是生成块级格式化上下文的。 块级格式化上下文的能力就是让具有该能力的…

这是最后的讨论!

Pun打算……让我们讨论Java final 。 最近&#xff0c;我们广受欢迎的博客文章“编码Java时的十个微妙的最佳实践”在JavaWorld的摘要和链接中有了很大的复兴&#xff0c;并提出了一组新的评论。 尤其是&#xff0c;JavaWorld编辑对我们对Java关键字“ final ”的观点提出了质…

前端性能优化方法总结

一个网站前端性能的好坏很大程度上影响了用户愿不愿意使用访问这个网站&#xff0c;因此对前端进行性能优化是个很重要的事情。  对于前端性能优化这个问题&#xff0c;主要学习自yahoo前端性能团队总结的35条黄金定律总结&#xff0c;觉得很全很赞&#xff0c;做个学习总结和…

JS中的数据类型转换

ES5中一共有6种数据类型&#xff0c;其中5种基本类型&#xff08;String、Number、Boolean、Null、Undefined&#xff09;&#xff0c;1种引用类型&#xff08;Object&#xff09;。基本类型值可以相互换转换&#xff0c;并且引用类型值也可以通过某种方式转换成基本类型值。 …

拯救我的操作系统

最近公司新装操作系统image都强制装win7&#xff0c;公司电脑一直拖着没有升级&#xff0c;家里也一直是用番茄花园版的xp&#xff0c;突然心血来潮去买了个win7的碟&#xff0c;心想最好是破解版的&#xff0c;回来一装&#xff0c;发现是所谓的旗舰版的&#xff0c;可恶的是这…

Hazelcast的MapLoader陷阱

Hazelcast提供的核心数据结构之一是IMap<K, V> &#xff0c;它扩展了java.util.concurrent.ConcurrentMap它基本上是一个分布式地图&#xff0c;通常用作缓存。 您可以将此类地图配置为使用自定义MapLoader<K, V> -每次尝试从该地图&#xff08;通过键&#xff09;…

《Android开发从零开始》——22.数据存储(1)

本节课的主要内容有&#xff1a;1.介绍Android中数据存储方式2.介绍SQLite3.讲解SQLite数据类型4.讲解基本SQL命令 课程下载地址&#xff1a;http://u.115.com/file/clc4te8w课件及源码下载地址&#xff1a;http://u.115.com/file/clc41tt5转载于:https://www.cnblogs.com/cool…

计划Java EE 7批处理作业

Java EE 7添加了使用JSR 352以标准方式执行批处理作业的功能。 <job id"myJob" xmlns"http://xmlns.jcp.org/xml/ns/javaee" version"1.0"><step id"myStep"><chunk item-count"3"><reader ref"…

webpack配置说明

webpack是一个现代JavaScript应用程序的静态模块打包器。 它有几个核心概念&#xff1a; 一、entry&#xff08;入口&#xff09; 指示webpack应该使用哪个模块&#xff0c;来作为构建其内部依赖图的开始&#xff0c; 可以在webpack.config.js中配置entry属性&#xff0c;来指…

poj 2137

题目大意&#xff1a; 农夫FJ想把他所有的牛在它们吃草的时候用一根绳子连起来&#xff08;就是1-2-3-1按顺序连接起来&#xff09;&#xff0c;每头牛有若干个吃草的位置&#xff0c;它们必须要在这些位置吃草。 用绳子连接两头牛需要绳子的长度公式为 Sqrt( Sqr( x1-x2 ) Sq…

JS中捉摸不透的==(宽松等于)

首先来看一个有意思的面试题&#xff1a; if(a 3 && a 4){//... }第一眼看到这个面试题我是拒绝的&#xff0c;这个等式根本不会成立&#xff0c;怎么会存在一个值既等于3并且还同时等于4呢&#xff1f;根本不可能。 但是在神奇的javascript中这个a是存在的。&…

vue脚手架的使用

安装&#xff1a;1.全局安装脚手架&#xff1a;cnpm install -g vue/cli 使用&#xff1a;2.新建文件夹,在当前目录执行命令 vue create "项目名称"3.配置&#xff1a;选择Manually select feautures--》空格选择Babel和CSS Pre-procesors--》选择Sass/SCSS(with dar…

Akka笔记–演员介绍

过去做过多线程的任何人都不会否认管理多线程应用程序有多么艰辛和痛苦。 我说管理是因为它一开始很简单&#xff0c;一旦您开始看到性能改进&#xff0c;它就会变得非常有趣。 但是&#xff0c;当您发现没有一种简单的方法可以从子任务中的错误或难以发现的僵尸错误中恢复时&a…

浏览器的同源策略与跨域

本文所有案例在本地址都可找到&#xff1a;https://github.com/dancingZhou/sameOrigin/tree/dev 什么是同源策略 两个页面地址中的协议、域名和端口号一致&#xff0c;则表示同源。 例如该地址 https://www.google.com 和以下地址对比 地址同源原因http://www.google.com否…

poj 1185

经典状态dp 代码&#xff1a; #include<iostream> #include<fstream> #include<cmath>using namespace std;int n,m;char map[101][11];int state[101][1024]; int num[101]; int value[1024]; int maxx;int ok(int s,int t){int i,j,k;for(i0;i<m;){jt&…

day03 爬虫

今日内容&#xff1a;一 爬虫原理二 Requests请求库一 爬虫原理1.什么是互联网&#xff1f;指的是由一堆网络设备&#xff0c;把一台台的计算机互联网到一起称之为互联网。2.互联网建立的目的&#xff1f;互联网建立的目的是为了数据的传递以及数据的共享。3.什么是数据&#x…

Java英雄:丹·艾伦

“ Java英雄 ”系列休息了很长时间。 老实说&#xff0c;我想即使有很多人想在这里收录&#xff0c;它也可能会以虚无收场。 其中之一是丹。 我第一次要求他捐款已经将近一年半了&#xff0c;与此同时发生的一切&#xff0c;让我不再有任何答案就让我安心了。 但是以下内容在Ja…

yearProgress.vue

1 <template>2 <div class"progressbar">3 <el-progress :text-inside"true" :soke-width"18" :percentage"percent" status"exception"></el-progress>4 <p>{{year}}年已经过去了…