BOM的操作

BOM 也叫浏览器对象模型,它提供了很多对象,用于访问浏览器的功能。BOM 缺少规范,每个浏览器提供商又按照自己想法去扩展它,就可能存在浏览器不兼容的情况,那么浏览器共有对象就成了事实的标准。 所以,BOM 本身是没有标准的或者还没有哪个组织去标准它

window 对象

BOM 的核心对象是 window,它表示浏览器的一个实例。window 对象处于 JavaScript 结构的最顶层,对于每个打开的窗口,系统都会自动为其定义 window 对象

window的部分属性和方法

属性 含义
opener 打开当前窗口的窗口
length 窗口中的框架数
document 窗口中当前显示的文档对象
方法 含义
alert(text) 创建一个警告对话框,显示一条信息
close() 关闭窗口
confirm() 创建一个需要用户确认的对话框
open(url,name,[options]) 打开一个新窗口并返回新 window 对象
prompt(text,defaultInput) 创建一个对话框要求用户输入信息
setInterval(expression,milliseconds) 经过指定时间间隔计算一个表达式
setInterval(function,millis enconds,[arguments]) 经过指定时间间隔后调用一个函数
setTimeout(expression,milli seconds) 在定时器超过后计算一个表达式
setTimeout(expression,milli seconds,[arguments]) 在定时器超过时后计算一个函数

window 下的属性和方法,可以使用 window.属性、window.方法()或者直接属性、方法() 的方式调用。例如:window.alert()和 alert()是一个意思

系统对话框

  1. //弹出警告
  2. alert('Lz'); //直接弹出警告
  3. //弹出对话框
  4. confirm('请确定或者取消'); //这里按哪个都无效
  5. if (confirm('请确定或者取消')) { //confirm 本身有返回值
  6. alert('您按了确定!'); //按确定返回 true
  7. } else {
  8. alert('您按了取消!'); //按取消返回 false
  9. }
  10. //输入提示框
  11. var num = prompt('请输入一个数字', 0); //两个参数,一个提示,一个值
  12. alert(num);

新建窗口

使用 window.open()方法可以导航到一个特定的 URL,也可以打开一个新的浏览器窗口。 它可以接受四个参数:1.要加载的 URL;2.窗口的名称或窗口目标;3.一个特性字符串;4. 一个表示新页面是否取代浏览器记录中当前加载页面的布尔值

  1. open('http://www.baidu.com'); //新建页面并打开百度
  2. open('http://www.baidu.com','baidu'); //新建页面并命名窗口并打开百度

不命名会每次打开新窗口,命名的第一次打开新窗口,之后在这个窗口中加载

窗口的位置和大小

用来确定和修改 window 对象位置的属性和方法有很多。IE、Safari、Opera 和 Chrome 都提供了 screenLeft 和 screenTop 属性,分别用于表示窗口相对于屏幕左边和上边的位置。 Firefox 则在 screenX 和 screenY 属性中提供相同的窗口位置信息,Safari 和 Chrome 也同时 支持这两个属性

跨浏览器检测窗口大小的方法 :

  1. var leftX = (typeof screenLeft == 'number') ? screenLeft : screenX;
    var topY = (typeof screenTop == 'number') ? screenTop : screenY;

窗口页面大小,Firefox、Safari、Opera 和 Chrome 均为此提供了 4 个属性:innerWidth 和 innerHeight,返回浏览器窗口本身的尺寸;outerWidth 和 outerHeight,返回浏览器窗口本身及边框的尺寸

通过不同浏览器取得各自的浏览器窗口页面可视部分的大小:

  1. var width = window.innerWidth; //这里要加 window,因为 IE 会无效
  2. var height = window.innerHeight;
  3. if (typeof width != 'number') { //如果是 IE,就使用 document
  4. if (document.compatMode == 'CSS1Compat') { //document.compatMode 可以确定页面是否处于标准模式,如果返回 CSS1Compat 即标准模式
  5. width = document.documentElement.clientWidth;
  6. height = document.documentElement.clientHeight;
  7. } else {
  8. width = document.body.clientWidth; //非标准模式使用 body
  9. height = document.body.clientHeight;
  10. }
  11. }

间歇调用和超时调用

JavaScript 是单线程语言,但它允许通过设置超时值和间歇时间值来调度代码在特定的 时刻执行。前者在指定的时间过后执行代码,而后者则是每隔指定的时间就执行一次代码

超时调用需要使用 window 对象的 setTimeout()方法,它接受两个参数:要执行的代码和毫秒数的超时时间

  1. function box() {
  2. alert('Lee');
  3. }
  4. setTimeout(box, 1000); //直接传入函数名即可(直接使用函数传入的方法,扩展性好,性能更佳)
  5. setTimeout(function () { //推荐做法
  6. alert('Lz');
  7. }, 1000);

调用 setTimeout()之后,该方法会返回一个数值 ID,表示超时调用。这个超时调用的 ID 是计划执行代码的唯一标识符,可以通过它来取消超时调用。要取消尚未执行的超时调用计划,可以调用 clearTimeout()方法并将相应的超时调用 ID 作为参数传递给它

  1. var box = setTimeout(function () { //把超时调用的 ID 复制给 box
  2. alert('Lz');
  3. }, 1000);
  4. clearTimeout(box); //把 ID 传入,取消超时调用

间歇调用与超时调用类似,只不过它会按照指定的时间间隔重复执行代码,直至间歇调 用被取消或者页面被卸载。设置间歇调用的方法是 setInterval(),它接受的参数与 setTimeout() 相同:要执行的代码和每次执行之前需要等待的毫秒数

  1. setInterval(function () { //重复不停执行
  2. alert('Lz');
  3. }, 1000);

取消间歇调用方法和取消超时调用类似,使用 clearInterval()方法。但取消间歇调用的重 要性要远远高于取消超时调用,因为在不加干涉的情况下,间歇调用将会一直执行到页面关闭

  1. var box = setInterval(function () { //获取间歇调用的 ID
  2. alert('Lz');
  3. }, 1000);
  4. clearInterval(box); //取消间歇调用

在开发环境下,很少使用真 正的间歇调用,因为需要根据情况来取消 ID,并且可能造成同步的一些问题,建议不使用间歇调用,而去使用超时调用

编写一个定时器

  1. //超时调用实现定时器
  2. var num=0;
  3. var max=5;
  4. function box(){
  5. num++;
  6. document.getElementById('a').innerHTML+=num;
  7. if(num==max){
  8. alert('5秒到了');
  9. }else{
  10. setTimeout(box,1000);
  11. }
  12. }
  13. setTimeout(box,1000);

location 对象

location 是 BOM 对象之一,它提供了与当前窗口中加载的文档有关的信息,还提供了一些导航功能。事实上,location 对象是 window 对象的属性,也是 document 对象的属性; 所以 window.location 和 document.location 等效

  1. alert(location); //获取当前的 URL

location的部分属性和方法:

属性 内容
host 主机名:端口号
hostname 主机名
href 整个 URL
pathname 路径名
port 端口号
protocol 协议部分
search 查询字符串
方法 功能
reload() 重载当前 URL
repalce() 用新的 URL 替换当前页面
  1. location.port = 8888; //设置端口号,并跳转
  2. alert(location.port); //获取当前端口号,
  3. location.hostname = 'Lz'; //设置主机名,并跳转
  4. alert(location.hostname); //获取当前主机名,
  5. location.pathname = 'Lz'; //设置当前路径,并跳转
  6. alert(location.pathname); //获取当前路径,
  7. location.protocal = 'ftp:'; //设置协议,没有跳转
  8. alert(location.protocol); //获取当前协议
  9. location.search = '?id=5'; //设置?后的字符串,并跳转
  10. alert(location.search); //获取?后的字符串
  11. location.href = 'http://www.baidu.com'; //设置跳转的 URL,并跳转
  12. alert(location.href); //获取当前的 URL

编写一个函数来获取URL传值中?后面的值

  1. function getArgs() {
  2. //创建一个存放键值对的数组
  3. var args = [];
  4. //去除?号
  5. var qs = location.search.length > 0 ? location.search.substring(1) : '';
  6. //按&字符串拆分数组
  7. var items = qs.split('&');
  8. var item = null, name = null, value = null;
  9. //遍历
  10. for (var i = 0; i < items.length; i++) {
  11. item = items[i].split('=');
  12. name = item[0];
  13. value = item[1];
  14. //把键值对存放到数组中去
  15. args[name] = value;
  16. }
  17. return args;
  18. }

history 对象

history 对象是 window 对象的属性,它保存着用户上网的记录,从窗口被打开的那一刻算起

history的部分属性和方法:

属性 描述
length history 对象中的记录数
方法 功能
back() 前往浏览器历史条目前一个 URL,类似后退
forward() 前往浏览器历史条目下一个 URL,类似前进
go(num) 浏览器在 history 对象中向前或向后
  1. function back(){ //上一页(历史记录)
  2. history.back();
  3. }
  4.  
  5. function forward(){ //下一页(历史记录)
  6. history.forward();
  7. }
  8.  
  9. function go(num){ //num为正数代表下页,为负数代表上页
  10. history.go(num);
  11. }

可以通过判断 history.length == 0,得到是否有历史记录

浏览器检测

由于每个浏览器都具有自己独到的扩展,所以在开发阶段来判断浏览器是一个非常重要 的步骤。虽然浏览器开发商在公共接口方面投入了很多精力,努力的去支持最常用的公共功 能;但在现实中,浏览器之间的差异却是非常多的,因此客户端检测除了是一种补救措施,更是一种行之有效的开发策略

navigator 对象

navigator对象,现在已经成为识别客户端浏览器的事实标准。与之前的 BOM 对象一样,每个浏览器中 的 navigator 对象也都有 一套自己的属性

部分navigator的属性:

属性 说明
appName 完整的浏览器名称和版本信息
platform 浏览器所在的系统平台
plugins 浏览器中安装的插件信息的数 组
userAgent 浏览器的用户代理字符串
userLanguage 操作系统的默认语言
  1. alert('浏览器版本'+navigator.appName);
  2. alert('用户代理字符串'+navigator.userAgent);
  3. alert('浏览器所在平台'+navigator.platform);

检测插件

插件是一类特殊的程序。他可以扩展浏览器的功能,通过下载安装完成。比如,在线音乐、视频动画等等插件。但是IE浏览器没有插件,它提供了ActiveX 控件。ActiveX 控件一种在 Web 页面中嵌入对象或组件的方法

一个检测浏览器是否有flash插件的方法(兼容IE):

  1. //检测是否有flash插件
  2. function hasPlugin(name){
  3. var name=name.toLowerCase();
  4. for(var i=0;i<navigator.plugins.length;i++){
  5. if(navigator.plugins[i].name.toLowerCase().indexOf(name)>-1){
  6. return true;
  7. }
  8. }
  9. return false;
  10. }
  11.  
  12. function hasIEplugin(name){
  13. try{
  14. new ActiveXObject(name) //检测是否安装该ActiveX 控件
  15. return true;
  16. }catch(e){
  17. return flase;
  18. }
  19. }
  20.  
  21. function hasFlash() {
  22. //首先,先去检测非IE的浏览器
  23. var result = hasPlugin('Flash'); //如果返回true,说明检测到了,并且不是IE浏览器
  24. if (!result) { //如果没有检测到,说明这个浏览器没有flash插件,或者它可能是IE浏览器
  25. result = hasIEPlugin('ShockwaveFlash.ShockwaveFlash'); //ShockwaveFlash.ShockwaveFlash 是 IE 中代表 FLASH 的标识符,你需要检查哪种
  26. //控件,必须先获取它的标识符
  27. }
  28. return result;
  29. }
  30. alert(hasFlash());

用户代理检测

用户代理检测通过检测用户代理字符串来确定实际使用的浏览器。在每一次 HTTP 请求 过程中,用户代理字符串是作为响应首部发送的,而且该字符串可以通过 JavaScript 的 navigator.userAgent 属性访问。 用户代理代理检测,主要通过 navigator.userAgent 来获取用户代理字符串的,通过这组 字符串,我们来获取当前浏览器的版本号、浏览器名称、系统名称。但是这种在客户端检测用户代理的方式可能存在争议,是因为它具有一定的欺骗性

一个简单检测用户浏览器内核,版本,和使用操作系统的方法

  1. //用户代理字符串(这里输出用户代理信息以进行对比)
  2. document.write(navigator.userAgent);
  3. document.write('<br />');
  4. document.write(navigator.platform);
  5.  
  6. var client = function () { //创建一个对象
  7.  
  8. //引擎
  9. var engine = {
  10. ie : false, //这个属性用于确定是否是老版本IE引擎
  11. trident:false, //IE新版本
  12. gecko : false,
  13. webkit : false,
  14. khtml : false,
  15. opera : false,
  16.  
  17. //引擎的版本
  18. ver : 0
  19. };
  20.  
  21. //浏览器
  22. var browser = {
  23. ie : false,
  24. firefox : false,
  25. chrome : false,
  26. safari : false,
  27. opera : false,
  28. edge:false,
  29.  
  30. //浏览器的版本号
  31. ver : 0,
  32. //浏览器通用名称
  33. name : ''
  34. };
  35.  
  36. //系统
  37. var system = {
  38. win : false,
  39. mac : false,
  40. x11 : false,
  41.  
  42. //系统名称
  43. sysname : ''
  44. };
  45.  
  46. //核心检测程序区
  47. var ua = navigator.userAgent;
  48. var p = navigator.platform;
  49.  
  50. if (p.indexOf('Win') == 0) {
  51. system.win = true; //用于确定是windows系统
  52. system.sysname = 'Windows';
  53. } else if (p.indexOf('Mac') == 0) {
  54. system.mac = true; //用于确定是Mac系统
  55. system.sysname = 'Macintosh';
  56. } else if (p == 'X11' || p.indexOf('Linux') == 0) {
  57. system.x11 = true; //用于确定是Mac系统
  58. system.sysname = 'Linux';
  59. }
  60.  
  61. if (window.opera) {
  62. engine.opera = browser.opera = true; //表示确定opera引擎
  63. engine.ver = browser.ver =parseFloat(window.opera.version());
  64. browser.name = 'Opera';
  65. } else if (/AppleWebKit\/(\S+)/.test(ua)) {
  66. engine.webkit = true; //表示确定webkit引擎
  67. engine.ver = parseFloat(RegExp['$1']);
  68. if (/Edge\/(\S+)/.test(ua)){
  69. browser.edge = true;
  70. browser.ver = parseFloat(RegExp['$1']);
  71. browser.name = 'Edge';
  72. }else if (/Chrome\/(\S+)/.test(ua)) {
  73. browser.chrome = true;
  74. browser.ver = parseFloat(RegExp['$1']);
  75. browser.name = 'Chrome';
  76. }else if (/Version\/(\S+)/.test(ua)) {
  77. browser.safari = true;
  78. browser.ver = parseFloat(RegExp['$1']);
  79. browser.name = 'Safari';
  80. }
  81. } else if (/rv:([^\)]+)\) Gecko\/\d{8}/.test(ua)) {
  82. engine.gecko = true; //表示确定gecko引擎
  83. engine.ver = parseFloat(RegExp['$1']);
  84. if (/Firefox\/(\S+)/.test(ua)) {
  85. browser.firefox = true;
  86. browser.ver = parseFloat(RegExp['$1']);
  87. browser.name = 'Firefox';
  88. }
  89. } else if (/MSIE ([^;]+)/.test(ua)) {
  90. engine.ie = browser.ie = true; //老版本ie引擎
  91. engine.ver = browser.ver = parseFloat(RegExp['$1']);
  92. browser.name = 'Internet Explorer';
  93. }else if(/Trident\/([^;]+)/.test(ua)){ //新版本ie引擎
  94. engine.trident= browser.ie=true;
  95. engine.ver=parseFloat(RegExp['$1']);
  96. browser.name = 'Internet Explorer';
  97. if(/rv:([^\)]+)/.test(ua)){
  98. browser.ver = parseFloat(RegExp['$1']);
  99. }
  100. }
  101.  
  102. return { //返回一个对象,可以同时返回引擎,浏览器和系统的对象
  103. engine : engine, //前一个engine是属性,后一个engine是对象值
  104. browser : browser,
  105. system : system
  106. }
  107.  
  108. }(); //自我执行
  109.  
  110. alert(client.system.sysname + '|' +client.browser.name + client.browser.ver);

JavaScript笔记——BOM的操作和浏览器的检测的更多相关文章

  1. JavaScript笔记——DOM的操作

    节点及其类型 在JavaScript中,节点分为三种: 元素节点:HTML标签元素. 属性节点: 元素的属性, 可以直接通过属性的方式来操作. 文本节点: 是元素节点的子节点, 其内容为文本. 在什么 ...

  2. 第一百一十一节,JavaScript,BOM浏览器对象模型

    JavaScript,BOM浏览器对象模型 学习要点: 1.window对象 2.location对象 3.history对象 BOM也叫浏览器对象模型,它提供了很多对象,用于访问浏览器的功能.BOM ...

  3. javascript之BOM浏览器对象模型引入

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. javascript学习笔记 BOM和DOM详解

    js组成 我们都知道, javascript 有三部分构成,ECMAScript,DOM和BOM,根据宿主(浏览器)的不同,具体的表现形式也不尽相同,ie和其他的浏览器风格迥异. 1. DOM 是 W ...

  5. Javascript学习笔记3 Javascript与BOM简介

    什么是BOM BOM是browser object model的缩写,简称浏览器对象模型 BOM提供了独立于内容而与浏览器窗口进行交互的对象 由于BOM主要用于管理窗口与窗口之间的通讯,因此其核心对象 ...

  6. 学习笔记: JavaScript/JQuery 的cookie操作

    转自:http://blog.csdn.net/barryhappy/archive/2011/04/27/6367994.aspx cookie是网页存储到用户硬盘上的一小段信息.最常见的作用是判断 ...

  7. javascript中BOM部分基础知识总结

    一.什么是BOM      BOM(Browser Object Document)即浏览器对象模型.      BOM提供了独立于内容 而与浏览器窗口进行交互的对象:      由于BOM主要用于管 ...

  8. Javascript笔记一

    Javascript: ECMAscript :相当于翻译器 翻译电脑于代码  解释器 DOM document object model  文档 对象 模型  --->document  获取 ...

  9. [Effective JavaScript 笔记]第3章:使用函数--个人总结

    前言 这一章把平时会用到,但不会深究的知识点,分开细化地讲解了.里面很多内容在高3等基础内容里,也有很多讲到.但由于本身书籍的篇幅较大,很容易忽视对应的小知识点.这章里的许多小提示都很有帮助,特别是在 ...

随机推荐

  1. postgresql centos6.5安装以及常用命令

    今天在centos6.5下安装postgresql数据库,现在整理自己操作步骤. 一. Centos6.5 下安装postgresql9.4 1.1. 显示所有的有关postgresql安装包 yum ...

  2. shell 数组操作

    1. 定义数组: var_array=(one two three four five) 2.常用操作 获取数组长度: ${#var_array[@]} 获取所有数组元素:  ${var_array[ ...

  3. mysql数据库(一):建表与新增数据

    一. 学习目标 理解什么是数据库,什么是表 怎样创建数据库和表(create) 怎样往表里插入数据(insert) 怎样修改表里的数据(update) 怎样删除数据库,表以及数据(delete) 二. ...

  4. Solr工具类

    import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.spr ...

  5. 51nod-1201-数位dp

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1201 1201 整数划分 基准时间限制:1 秒 空间限制:131072 ...

  6. Redis 数据备份与恢复,安全,性能测试,客户端连接,管道技术,分区(四)

    Redis 数据备份与恢复 Redis SAVE 命令用于创建当前数据库的备份. 语法 redis Save 命令基本语法如下: redis 127.0.0.1:6379> SAVE 实例 re ...

  7. Oracle Rman恢复

    (转自:http://blog.chinaunix.net/uid-14779297-id-1988309.html) RMAN的基本概念 Target Database:就是需要RMAN对其进行备份 ...

  8. 【poj1195】Mobile phones(二维树状数组)

    题目链接:http://poj.org/problem?id=1195 [题意] 给出一个全0的矩阵,然后一些操作 0 S:初始化矩阵,维数是S*S,值全为0,这个操作只有最开始出现一次 1 X Y ...

  9. 数据库设计系列之四--ER图

    逻辑设计是做什么? 1.将需求转化为数据库的逻辑模型 2.通过ER图的型式对逻辑模型进行展示 3.同所选用的具体的DBMS系统无关

  10. javascript: what can javascript do?

    1.Javascript can change html content <!DOCTYPE html> <html> <body> <h2>What ...