第八章 BOM

1、window对象:既是通过JavaScript访问浏览器窗口的一个接口,又是ECMAScript规定的Global对象

1)全局作用域:所有在全局作用域中声明的变量、函数都会变成window对象的属性和方法;全局变量不能通过delete操作符删除,而直接在window对象上定义的属性可以

2)窗口关系及框架:如果页面中包含框架,则每个框架都拥有自己的window对象,并且保存在frames集合中;top对象始终指向最高(最外)层的框架,也就是浏览器窗口;parent对象始终指向当前框架的直接上层框架;self对象始终指向window对象

3)窗口位置:用于确定和修改window对象位置的属性和方法,IE、Safari、Opera和Chrome提供了screenLeft和screenTop属性、Firefox、Safari和Chrome提供了screenX和screenY属性用于表示窗口相对于屏幕左边和上边的位置;moveTo()接收的是新位置的x和y坐标值,moveBy()接收的是在水平和垂直方向上移动的像素值,只适用于最外层的window对象,有可能被浏览器禁用

4)窗口大小:IE9+、Firefox、Safari、Opera和Chrome中提供了4个属性:innerWidth、innerHeight、outerWidth和outerHeight用于确定窗口大小;IE、Firefox、Safari、Opera和Chrome中document.documentElement.clientWidth和document.documentElement.clientHeight用于确定页面视口大小;IE6中,这些属性必须在标准模式才有效,如果是混杂模式,就必须通过document.body.clientWidth和document.body.clientHeight;Chrome中,如果是混杂模式,无论通过document.documentElement的Width和Height还是document.body的clientWidth和clientHeightt都可以用于确定页面视口大小;resizeTo()接收的是浏览器窗口的新宽度和新高度,resizeBy()接收的是浏览器新窗口与原窗口的宽度和高度之差,只适用于最外层的window对象,有可能被浏览器禁用

5)导航和打开窗口:window.open()方法既可以导航到一个特定的URL,也可以打开一个新的浏览器窗口,接收4个参数:要加载的URL、窗口目标(_self、_parent、_top、_blank或已有窗口或框架的名称)、一个特性字符串以及一个表示新页面是否取代浏览器历史记录中当前加载页面的布尔值;window.close()方法可以关闭新打开的窗口;

弹出窗口屏蔽程序:

var blocked=false;

try{

var wroxWin=window.open(“http://”,”_blank”);

if(wroxWin==null){

blocked=true;

}catch(ex){

blocked=true;

}

}

If(blocked){

alert(“The popup was blocked!”);

}

6)间歇调用和超时调用:调度代码在特定的时刻执行,前者是在指定的时间过后执行代码,而后者则是每隔指定的时间就执行一次代码;超时调用使用window对象的setTimeout()方法,接收两个参数:要执行的代码(不建议以字符串作为参数)和以毫秒表示的时间,调用setTimeout()方法会返回一个超时调用ID,可以通过它来取消超时调用clearTimeout();间歇调用使用window对象的setInterval()方法,接收两个参数:要执行的代码(字符串或函数)和以毫秒表示的时间,调用setInterval()方法会返回一个间歇调用ID,可以通过它来取消超时调用clearInterval();使用超时调用来模拟间歇调用的是一种最佳模式

7)系统对话框:alert()、confirm()和prompt()方法可以调用系统对话框向用户显示消息;alert()方法包含指定的文本和一个OK按钮;confirm()方法包含指定的文本、一个OK按钮和一个Cancel按钮;prompt()包含指定的文本、一个文本输入域、一个OK按钮和一个Cancel按钮,接收两个参数:要显示给用户的文本提示和文本输入域的默认值

2、location对象

1)查询字符串参数

2)位置操作:assign()接收一个参数:要导航到的URL,用于打开新URL并在浏览器的历史记录中生成一条记录;replace()接收一个参数:要导航到的URL,用于打开新URL但不会在浏览器的历史记录中生成一条记录;reload()用于重新加载当前显示的页面,可选参数true表示从服务器重新加载,或者可能从缓存中加载

3、navigator对象

1)检测插件:plugins数组,包含属性name(插件的名字)、description(插件的描述)、filename(插件的文件名)、length(插件所处理的MIME类型数量);hasPlugin()函数

//检测所有浏览器中的Flash

Function hasFlash(){

var result=hasPlugin(“Flash”);

If(!result){

Result=hasIEPlugin(“ShockwaveFlash.ShockwaveFlash”);

}

return result;

}

alert(“hasFlash()”);

2)注册处理程序:registerContentHandle()方法接收三个参数:要处理的MIME类型、可以处理该MIME类型的页面的URL以及应用程序的名称;registerProtocolHandle()方法接收三个参数:要处理的协议、可以处理该协议的页面的URL以及应用程序的名称

4、screen对象:用于表明客户端的能力,其中包括浏览器窗口外部显示器的信息

5、history对象:保存用户上网的历史记录,从窗口被打开的那一刻算起;go()方法可以在用户的历史记录中任意跳转,接收一个整数参数,负数表示向后,用back()代替,正数表示向前,用forward()代替;length属性保存历史记录的数量

第九章 客户端检测

1、能力检测(特性检测):首先检测达成目的的最常用的特性,而且必须检测实际要用到的特性,其基本模式如下:

if(object.propertyInQuestion){

//使用object.propertyInQuestion

}

更可靠的能力检测:在可能的情况下,要尽量使用typeof进行能力检测,其基本模式如下:

function isHostMethod(object,property){

var t=typeof object[property];

return t==’function’||(!!(t==’object’&&object[property]))||t=’unknown’;

}

能力检测,不是浏览器检测

2、怪癖检测:检测浏览器存在的缺陷

3、用户代理检测:通过检测用户代理字符串来确定实际使用的浏览器;在每一次HTTP请求过程中,用户代理字符串是作为响应首部发送的,而且该字符串可以通过JavaScript的navigator.userAgent属性访问;用户代理检测一般适用于以下三种情况:不能直接准确地使用能力检测或怪癖检测,同一款浏览器在不同平台下具备不同的能力,为了跟踪分析等目的需要知道确切的浏览器;完整的用户代理字符串检测脚本如下:

var client = function(){

//呈现引擎

var engine = {

ie: 0,

gecko: 0,

webkit: 0,

khtml: 0,

opera: 0,

//完整的版本号

ver: null

};

//浏览器

var browser = {

//主要浏览器

ie: 0,

firefox: 0,

safari: 0,

konq: 0,

opera: 0,

chrome: 0,

//具体的版本号

ver: null

};

//平台、设备和操作系统

var system = {

win: false,

mac: false,

x11: false,

//移动设备

iphone: false,

ipod: false,

ipad: false,

ios: false,

android: false,

nokiaN: false,

winMobile: false,

//游戏系统

wii: false,

ps: false

};

//检测呈现引擎和浏览器

var ua = navigator.userAgent;

if (window.opera){

engine.ver = browser.ver = window.opera.version();

engine.opera = browser.opera = parseFloat(engine.ver);

} else if (/AppleWebKit\/(\S+)/.test(ua)){

engine.ver = RegExp["$1"];

engine.webkit = parseFloat(engine.ver);

//确定是Chrome还是Safari

if (/Chrome\/(\S+)/.test(ua)){

browser.ver = RegExp["$1"];

browser.chrome = parseFloat(browser.ver);

} else if (/Version\/(\S+)/.test(ua)){

browser.ver = RegExp["$1"];

browser.safari = parseFloat(browser.ver);

} else {

//近似地确定版本号

var safariVersion = 1;

if (engine.webkit < 100){

safariVersion = 1;

} else if (engine.webkit < 312){

safariVersion = 1.2;

} else if (engine.webkit < 412){

safariVersion = 1.3;

} else {

safariVersion = 2;

}

browser.safari = browser.ver = safariVersion;

}

} else if (/KHTML\/(\S+)/.test(ua) || /Konqueror\/([^;]+)/.test(ua)){

engine.ver = browser.ver = RegExp["$1"];

engine.khtml = browser.konq = parseFloat(engine.ver);

} else if (/rv:([^\)]+)\) Gecko\/\d{8}/.test(ua)){

engine.ver = RegExp["$1"];

engine.gecko = parseFloat(engine.ver);

//确定是不是Firefox

if (/Firefox\/(\S+)/.test(ua)){

browser.ver = RegExp["$1"];

browser.firefox = parseFloat(browser.ver);

}

} else if (/MSIE ([^;]+)/.test(ua)){

engine.ver = browser.ver = RegExp["$1"];

engine.ie = browser.ie = parseFloat(engine.ver);

}

//检测浏览器

browser.ie = engine.ie;

browser.opera = engine.opera;

//检测平台

var p = navigator.platform;

system.win = p.indexOf("Win") == 0;

system.mac = p.indexOf("Mac") == 0;

system.x11 = (p == "X11") || (p.indexOf("Linux") == 0);

//检测windows操作系统

if (system.win){

if (/Win(?:dows )?([^do]{2})\s?(\d+\.\d+)?/.test(ua)){

if (RegExp["$1"] == "NT"){

switch(RegExp["$2"]){

case "5.0":

system.win = "2000";

break;

case "5.1":

system.win = "XP";

break;

case "6.0":

system.win = "Vista";

break;

case "6.1":

system.win = "7";

break;

default:

system.win = "NT";

break;

}

} else if (RegExp["$1"] == "9x"){

system.win = "ME";

} else {

system.win = RegExp["$1"];

}

}

}

//移动设备

system.iphone = ua.indexOf("iPhone") > -1;

system.ipod = ua.indexOf("iPod") > -1;

system.ipad = ua.indexOf("iPad") > -1;

system.nokiaN = ua.indexOf("NokiaN") > -1;

//windows平台

if (system.win == "CE"){

system.winMobile = system.win;

} else if (system.win == "Ph"){

if(/Windows Phone OS (\d+.\d+)/.test(ua)){;

system.win = "Phone";

system.winMobile = parseFloat(RegExp["$1"]);

}

}

//检测IOS版本

if (system.mac && ua.indexOf("Mobile") > -1){

if (/CPU (?:iPhone )?OS (\d+_\d+)/.test(ua)){

system.ios = parseFloat(RegExp.$1.replace("_", "."));

} else {

system.ios = 2;  //can't really detect - so guess

}

}

//检测Android版本

if (/Android (\d+\.\d+)/.test(ua)){

system.android = parseFloat(RegExp.$1);

}

//游戏系统

system.wii = ua.indexOf("Wii") > -1;

system.ps = /playstation/i.test(ua);

//返回这些对象

return {

engine:     engine,

browser:    browser,

system:     system

};

}();

转载于:https://www.cnblogs.com/wuping/p/5089906.html

《JavaScript高级程序设计》第8-9章相关推荐

  1. JavaScript高级程序设计笔记01 | 第一章到第四章 | 关键字与保留字 | 数据类型 | 操作符 | 作用域

    观前提示:大部分都是书上的内容,个人理解的部分的较少,看我的笔记还不如去看书 第二章 async:可选.表示应该立即下载脚本,但不应妨碍页面中的其他操作,比如下载其他资源或 等待加载其他脚本.只对外部 ...

  2. JavaScript高级程序设计(第三章)

    目录 3.基本概念 3.1语法 3.1.1区分大小写 3.1.2标识符 3.1.3注释 3.1.4严格模式 3.1.5语句 3.2关键字和保留字 3.3变量 3.4数据类型 3.4.1 typeof操 ...

  3. 《javascript高级程序设计》第五章知识点总结

    第五章知识点总结 1.object类型 访问对象的方法:①点表示法        (people.name) :      ②方括号表示法         (people[name]). 常用方法:h ...

  4. 《javascript高级程序设计》第六章总结

    6.1 理解对象 属性类型 属性特性 行为描述 数据属性 Configurable 表示是否能通过delete删除属性从而重新定义属性. 数据属性 Enumerable 表示能否通过for-in循环返 ...

  5. JavaScript高级程序设计笔记 - 第四章 变量 作用域 内存问题

    4.1 基本类型和引用类型的值 基本类型: 简单的数据段 引用类型: 指那些可能有多个值构成的对象, 指保存在内存中的对象 4.1.2 复制变量值 除了保存的方式不同之外,在从一个变量向另一个变量复制 ...

  6. JavaScript高级程序设计(第四章)

    4.变量.作用域和内存问题 4.1 基本类型和引用类型的值 ECMAScript 变量可能包含两种不同数据类型的值:基本类型值和引用类型值.基本类型值指的是 简单的数据段,引用类型值指那些可能由多个值 ...

  7. 《javascript高级程序设计》第六章 读书笔记 之 javascript对象的几种创建方式

    本文首发于https://segmentfault.com/a/1190000017776314 一.工厂模式 工厂模式:使用字面量和object构造函数会有很多重复代码,在此基础上改进 解决了多个相 ...

  8. 笔记《javascript高级程序设计》 第12章 DOM2和DOM3

    DOM2 级核心:在 1 级基础上构建,为节点添加更多方法和属性 DOM2 级视图:为文档定义了基于样式信息的不同视图 DOM2 级事件:说明了如何使用事件和DOM文档交互 DOM2 级样式:如何以编 ...

  9. 【JavaScript高级程序设计】--第1章 JavaScript简介

    2019独角兽企业重金招聘Python工程师标准>>> 转载于:https://my.oschina.net/kimcerry/blog/707427

最新文章

  1. CISCO 3560配置作为DHCP服务器
  2. Android学习笔记:TabHost 和 FragmentTabHost
  3. oracle那些基本知识
  4. PostgreSQL 摘得 DB-Engines 2020 年度数据库
  5. 数学建模笔记2方法分类
  6. Apache实现一个IP配置多个站点
  7. HDU 4403 A very hard Aoshu problem (DFS暴力)
  8. 校园热水供应系统设计思路
  9. SAP生产模式和计划策略
  10. python文件和数据格式化
  11. android盒子改造,【当贝市场】废旧手机改造成电视盒子详细教程
  12. 代理内网穿透-Lcx.exe-venom-proxychains
  13. 【史上最全】常用USB转串口芯片特性比较
  14. 英语口语8级是这么炼成的!
  15. 关于SYS/BIOS
  16. 什么是USBHOST、USB Slave和USB OTG?它们之间有什么区别 USB、MiniUSB、MicroUSB
  17. scrcpy Device disconnected报错
  18. 【网络安全】网络安全的重要性你知道吗?
  19. 【linux命令】df和du的区别、文件系统
  20. python中 glob.glob

热门文章

  1. VTK:可视化算法之OfficeTube
  2. VTK:Math之PerpendicularVector
  3. VTK:灯光之LightActor
  4. OpenCV形态转换Morphology Transformations
  5. OpenGL Gamma Correction伽马校正的实例
  6. C++Miller Rabin算法的实现(附完整源码)
  7. C语言字符串字母移位
  8. C语言写的程序如何控制计算机硬件
  9. linux重新加载php.ini,linux修改php.ini后重新加载配置文件命令
  10. 7.Eclipse中创建新Maven项目