《JavaScript高级程序设计》学习笔记——BOM

Author:Chemandy

第8章 BOM

1. window对象

1)基本概念

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

②window对象为Global对象的角色,全局作用域中声明的变量,函数都会变成window对象的属性和方法。

2)窗口关系及框架

①在使用框架的情况下,浏览器会存在多个Global(window)对象。窗体一个,各个框架一个。

②访问框架:window.frames[0],window.frames["framename"},top.frames[0],top.frames["framename"],frames[0],frames["framename"]

□ 建议使用top对象访问,因top对象始终指向最高(最外)层的框架,也就是浏览器窗口。

□ parent对象始终指向当前框架的直接上层框架。

□ self对象,它始终指向window,可以与window呼唤。

3)窗口位置

属性及方法很多,需考虑各兼容性。

var leftPos = (typeof window.screenLeft == "number") ? window.screenLeft : window.screenX;

var topPos = (typeof window.screenTop == "number") ? window.screenTop : window.screenY;

使用moveTo()和moveBy()有可能将窗口精确地移动到新位置(这两方法有可能被禁用)。

4)窗口大小

①跨浏览器无法取得窗口大小,只能取得页面视图大小。

var pageWidth = window.innerWidth, pageHeight = window.innerHeight; //对ff、chrome、Safari、Opera

if(typeof pageWidth != "number"){ //对IE

if(document.compactMode == "css1Compact"){

pageWidth = document.documentElement.clientWidth;

pageHeight = document.documentElement.clientHeight;

}else{

pageWidth = document.body.clientWidth;

pageHeight = document.body.clientHeight;

}

}

②调整窗口大小

resizeTo()和resizeBy(),可能会被禁用。

5)导航和打开窗口

①使用window.open()方法既可以导航到一特定URL,也可以打开一个新窗口。

□ 参数1:要加载的URL

□ 参数2:窗口目标。若该参数是已有窗口或框架的名称,那么就会在具有该名称的窗口或框架中加载第一个参数指定的URL。

□ 参数3:打开新窗口的特性设置。(一个特性字符串)

□ 参数4:表示新页面是否取代浏览器历史记录中当前加载页面的布尔值。

②通过window.open()打开的窗口有一个指向打开他的原始窗口的属性指针opener。

③通过window.open()通过window.open()打开的窗口可以通过close()关闭。

④检测window.open()打开的窗口是不是屏蔽了。

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()方法。

□ 接受两个参数:要执行的函数和毫秒时间。

□ 方法返回一个数值ID,可通过ID取消尚未执行的超时调用clearTImeOut(ID)

②间歇调用

□ setInterval(),与超时调用基本相同,经过一定时间重复调用。

□ 返回一个ID,通过clearInterval(ID)取消调用。

③最好不用间歇调用,易出问题。使用超时调用来模拟间歇调用时一种最佳模式。

7)系统对话框

①三种alert()、confirm()和prompt()

□ confirm():提供“确认”和“取消”按钮,返回布尔值。

□ prompt():接受两个参数,要显示给用户的文本提示和文本输入域的默认值。用户点击OK则返回输入的文本值,否则返回null

□ window.print()显示打印框;window.find()显示查找框。

□ confirm()和prompt()是阻塞的,执行时页面其他代码无法运行,需等待用户答应。

2. location对象

1)location对象:

□ 提供了与当前窗口中加载的文档有关的信息,还有一些导航功能。

□ location对象既是window对象的属性也是document对象属性,即window.location === document.location

□ location对象将URL解析为独立片段:

◇hash、host、hostname、href、pathname、port、protocol、search

2)位置操作

□ 打开新URL并在浏览器的历史记录中生成一条记录,显/隐式调用assign()

location.assign("http://#");

window.location = "http://#";

location.href = "http://";(最常用)

□ 修改location对象的其他属性(hash、search、hostname等)也可以改变当前加载的页面。

□ replace()方法,用法,效果如assign(),但不在历史记录中生成新记录,用户不能回到前一页面。

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

3. navigator对象

1)其中的很多属性和方法都用于检测显示网页的浏览器类型。(不可靠)

2)检测插件:

①在非IE浏览器中,可以使用plugins数组检测插件。

□ name:插件的名字

□ description:插件的描述

□ filename:插件的文件名

□ length:插件所处理的MIME类型数量

function hasPlug(name){

name = name.toLowerCase();

for(var i= 0; i < navigator.plugins.length; i++){

if(navigator.plugins[i].name.toLowerCase().indexOf(name) > -1){

return true;

}

}

return false;

}

②在IE中检测插件的唯一方式就是使用专有的ActiveXObject类型,并尝试创建一个特定插件实例。

function hasIEPlugin(name){

try{

new ActiveXObject(name);

return true;

}catch(ex){

return false;

}

}

③鉴于检测这两种插件方法差别大,因此典型做法是针对每个插件分别创建检测函数。

fucntion hasFlash(){

var result = hasPlugin("Flash");

if(!result){

result = hasIEPlugin("Shockwave Flash.Shockwin");

}

return result;

}

3)注册处理程序

①registerContentHandler()让一个站点指明它可以处理特定类型的信息。

□ 三个参数:要处理的MIME类型、可处理该MIME类型的URL及应用程序名。

②registerProtocolHandler():

□ 三个参数:要处理的协议类型,可处理该协议类型的URL及应用程序名。

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

5. history对象

□ 对象保存着用户上网的历史记录

□ go()方法,接受一个参数,数字或字符串

◇ 负值表向后退,正值表向前进。

◇ 字符串,浏览器会跳转到包含该字符串的第一个位置。

□ 可用简写方法back()和forward()代替go()

第九章 客户端检测

不到不得已就不要使用客户端检测,先设计最通用的方案,然后使用特定于浏览器的技术增强方案。

1. 能力检测:识别浏览器能力,再做出反应。

2. 怪癖检测:目标是识别浏览器的特殊行为。

3. 用户代理检测:通过检测用户代理字符串来确定实际使用的浏览器。

①用户代理字符串:在每次http请求中,作为响应首部发送的。可通过navigator.userAgent访问。

②用户代理检测一般当做一种万不得已才用的做法,其优先级排在能力检测和(或)怪癖检测之后。

③呈现引擎:IE(Trident)、Firefox(Gecko)、Safari(WebKit)、Konqueror(KHTML)、Chorme(WebKit)、Opera(besto)

④用户代理检测适用情况:

□ 不能直接准确地使用能力检测或怪癖检测。

□ 同一款浏览器在不同平台下具备不同的能力。

□ 为了跟踪分析等母的需要知道确切的浏览器。