JavaScript高级程序设计学习笔记--BOM

window对象

BOM的核心对象是window,它表示浏览器的一个实例。在浏览器中,window对象有双重角色,它既是通过JavaScript访问浏览器窗口的一个接口,又是ECMScript规定的Global对象。

全局作用域

由于window对象同时扮演着ECMAScript中Global对象的角色,因此所有在全局作用域中声明的变量、函数都会变成window对象的属性和方法。来看下面的例子:

var age=29;
function sayAge(){
alert(this.age);
}
alert(window.age); //29
sayAge(); //29
window.sayAge(); //29

定义全局变量与在window对象上直接定义属性还有一点差别就是:全局变量不能通过delete操作符删除,而直接在window对象上定义的属性可以,例如:

var age=29;
window.color="red";

delete window.age‘ //在IE<9时抛出错误,在其他所有浏览器中都返回false

delete window.color //在IE<9时抛出错误,在其他所有浏览器中都返回true
alert(window.age) ;//29
alert(window.color); //undefined

原因是使用var语句添加的window属性有一个名为[[Configurable]]的特性,这个特性的值被设置为false,因此这样定义的属性不可通过delete操作符删除。
另外,还要记住一件事:尝试访问未声明的变更会抛出错误,但是通过查询window对象,可以知道某个可能未声明的变更是否存在,如:

//这里会抛出错误,因为oldValue未定义
var newValue=oldValue;

//这里不会抛出错误,因为这是一次属性查询
//newValue的值是undefined
var newValue=window.oldValue;

窗口关系及框架

top对象始终指向最高(最外)层的框架,也就是浏览器窗口。与框架有关的最后一个对象是self,它始终指向window;实际上,self和window对象可以互换使用。引入
self对象的目的只是为了与top和parent对象对应起来,因此它不格外包含其它值。

窗口位置

使用下面的代码可以跨浏览器取得窗口左边和上边的位置。

var leftPos=(typeof windwow.screenLeft=="number")?
window.screenLeft:window.screenX;
var topPos=(typeof windwow.screenTop=="number")?
window.screenTop:window.screenY;

使用resizeTo()和resizeBy()方法可以调整浏览器窗口的大小 。

导航和打开窗口

window。open("http://www.wrox.com","topFrame");

如果有一个名叫"topFrame"的窗口或者框架,就会在该窗口或框架加载这个URL;否则,就会创建一个新窗口并将其命名为"topFrame".

在Chrome中,将新创建的标签页的opener属性设置为null,即表示在单独的进程中运行新标签页,如下所示:

var wroxWin=window.open("http://www.wrox.com","wroxWindow","height=400,width=400,top=10,left=10,resizable=yes");
wroxWin.opener=null;

将opener属性设置为Null就是告诉浏览器新创建的标签页不需要与打开它的标签页通信,因此可以在独立的进程中运行。

间隙调用和超时调用

JavaScript是一个单线程序的解释器,因此一定时间内只能执行一段代码。为了控制要执行的代码,就有一个JavaScript任务队列。这些任务会按照将它们添加到队列的顺序执行。
setTimout()的第二个参数告诉JavaScript再过多长时间把当前任务添加到队列中。如果队列是空的,那么添加的代码会立即执行;如果队列不是空的,那么它就要等前面的代码
执行完以后再执行。
要取消尚未执行的超时调用计划,可以调用clearTimeout()方法并将相应的超时调用ID作为参数传递给它,如下所示:

//设置超时调用
var timeoutId=setTimout(function(){
alert("Hello world!");
},1000);
//注意:把它取消
clearTimeout(timeoutId);

间隙调用与超时调用类似,只不过它会按照指定的时间间隔重复执行代码,直至间歇调用被取消或者页面被卸载。设置间歇调用的方法是setInterval().

//不建议传递字符串
setInterval("alert(‘Hello world!‘)",10000);

//推荐的调用方式
setInterval(function(){
alert("Hello world!");
},10000);

虽然这两种调用方式都没有问题,但由于传字符串可能导致性能损失,因此不建议以字符串作为第一个参数。
也可以用clearInterval()方法并传入相应的间隙ID来取消。以下是一个常见的使用间歇调用的例子:

var num=0;
var max=10;
var intervalId=null;

function incrementNumber(){
num++;
//如果执行次数达到max设定的值,则取消后续尚未执行的调用
if(num==max)
{
clearTimeout(intervalId);
alert("Done");
}
}
intervalId=setInterval(incrementNumber,500);

这个例子也可以用超时调用来实现,如下:

var num=0;
var max=10;

function incrementNumber(){
num++;
//如果执行次数未达到max设定的值,则设置另一次超时调用
if(num<max)
setTimout(incrementNumber,500);
else
alert("Done");
}
setTimout(incrementNumber,500);

一般认为,使用超时调用来模拟间歇调用是一种最佳模式。在开发环境下,很少使用真正的间歇调用,原因是后一个间歇调用可能会在前一个间歇调用结束之前启动。
而像前面示例中那样使用超时调用,则完全可以避免这一点。所以,最好不要使用间歇调用。

JavaScript高级程序设计学习笔记--BOM

时间: 2024-10-11 17:56:45

JavaScript高级程序设计学习笔记--BOM的相关文章

JavaScript高级程序设计学习笔记--基本概念

1.语句 ECMAScript中的语句以一个分号结尾:如果省略分号,则由解析器确定语句的结尾,如下例所示: var sum=a+b //即使没有分号也是有效的语句--推荐 var diff=a-b; //有效的语句--推荐 虽然语句结尾的分号不是必需的,但我们建议任何时候都不要省略它.两个原因:1.加上分号可以避免很多错误 2.加上分号也会在某些情况下增进代码的性能,因为这样解析器就不必再花时间 推测应该在哪里插入分号了. 2.变量 var message="hi"; 像这样初始化变量

JavaScript高级程序设计学习笔记--错误处理与调试

try-catch语句 只要代码中包含finally子句,则无论try或catch语句块中包含什么代码--甚至return语句,都不会阻止finally子句的执行,来看下面这个函数: function testFinally(){ try{ return 2; }catch(error){ return 1; }finally{ return 0; } } 调用这个函数会返回0(PS:但我实际执行的时候会先返回0,再返回2) 抛出错误 与try-catch语句相配的还有一个throw操作符,用于

JavaScript高级程序设计学习笔记--面向对象程序设计

工厂模式 虽然Object构造函数或对象字面量都可以用来创建单个对象,但这些方式有个明显的缺点:使用同一个接口创建很多对象,会产生大量的重复代码.为解决这个问题,人们开始使用 工厂模式的一种变体. function createPerson(name,age,job){ var o=new Object(); o.name=name; o.age=age; o.job=job; o.sayName=function(){ alert(this.name); }; return o; } var

Javascript高级程序设计学习笔记

3. 基本概念 基本数据类型:Undefined,Null,Boolean,Number,String. 复杂数据类型:Object. 3.6 语句 switch比较值时用的是全等运算符 “===” ,因此不会进行类型转换.例如 “10” 不等于10. 3.7 函数 ECMAScript函数不介意传递进来多少个参数,也不在乎参数的类型.即使定义的函数只接受两个参数,在调用的时候也可以传递任意多个或者0个.因为ECMAScript的参数在内部是用一个数组表示的,在函数体内部可以通过argument

JavaScript高级程序设计学习笔记--高级技巧

惰性载入函数 因为浏览器之间行为的差异,多数JavaScript代码包含了大量的if语句,将执行引导到正确的代码中,看看下面来自上一章的createXHR()函数. function createXHR(){ if (typeof XMLHttpRequest != "undefined"){ return new XMLHttpRequest(); } else if (typeof ActiveXObject != "undefined"){ if (typeo

JavaScript高级程序设计学习笔记--DOM

DOM(文档对象模型)是针对HTML和XML文档的一个API(应用程序接口). Document类型 文档的子节点 虽然DOM标准规定Document节点的子节点可以是DocumentType,Element,ProcessingInstruction或Comment,但还有两个内置的访问其子节点的快捷方式.第一个就是documnetElement属性,该属性始终指向HTML页面中的<html>元素.另一个就是通过childNodes列表访问文档元素,但通过documentElement属性则

JavaScript高级程序设计学习笔记--引用类型

Object类型 对象字面量表示法: var person={ name:"Nicholas", age:29, 5:true }; 这人例子会创建一个对象,包含三个属性:name,age和5.但这里的数值属性名会自动转换为字符串. 对象属性的访问:点表示法和方括号语法 alert(person["name"]); // "Nicholas" alert(person.name); // "Nicholas" 从功能上看,这两

javascript 高级程序设计 学习笔记01章 javascript的认知

hello world: 大家早上好 ,所谓一年之计在于春,一日之计在于晨.今天开始学习 高级程序设计第三版 第二遍 以前以迅雷不及掩耳之势草草看过一遍 ,但是什么也没记住 已经忘得差不多了.哈哈,原来我不是黄蓉,也不是天才,还是那句话 好记性不如烂笔头.这次学习高级程序设计第三版 是有目标的,有目的性的.所以我会把 每一章学习的心得和笔记 都记录在此.于己于人都方便.废话不多说 ,开始吧 今天的第一张 ,javascript 的实现.张鑫旭大神说过 非it(计算机专业的)的前端从业人员 学习j

JavaScript高级程序设计学习笔记第八章--BOM

1.间歇调用和超时调用: 超时调用:需要使用 window 对象的 setTimeout()方法,它接受两个参数:要执行的代码和以毫秒表示的时间(即在执行代码前需要等待多少毫秒).其中,第一个参数可以是一个包含 JavaScript 代码的字符串(就和在 eval()函数中使用的字符串一样),也可以是一个函数. 第二个参数是一个表示等待多长时间的毫秒数,但经过该时间后指定的代码不一定会执行.JavaScript 是一个单线程序的解释器,因此一定时间内只能执行一段代码.为了控制要执行的代码,就有一