《JavaScript高级程序设计》——DOM

对代码的理解全部写在了注释中

8.js

/*
 * BOM -
 * 		- 框架(每个框架包含自己的window对象)
 * 		- window对象(主要)	:窗口信息
 * 		- location对象	:文档信息
 * 		- navigator对象	:浏览器信息
 * 		- screen对象		:客户端信息
 * 		- history对象		:历史信息
 */

	//在全局作用域中声明的变量,函数会变成windows对象的属性和方法(windows对象就代表着全局作用域)。

var age = 29;
function sayAge() {
	console.log(this.age);
}
sayAge();					//29
window.sayAge();				//29
console.log(window.age == age);			//true	sayAge方法被归到了window下。

	//区别:删除在全局作用域中定义的属性和变量会产生失败。而删除window对象下的不会。
var age = 29;
window.color = "red";

console.log(delete window.age);			//false:因为是直接定义的,所以不能删除。
console.log(delete window.color);		//true:由windows定义的,可以删除。

console.log(window.age);			//29:未被删除。
console.log(window.color);			//undifined:已被删除。
	//原因:使用var语句添加的属性[Configurable]默认为false,所以不可被删除。

console.log(oldValue);				//出错 :因为没被定义。
console.log(window.oldValue);			//undefined:不会跑出错误,因为这是一次属性查询。
									//可以通过查询window对象地方法可以知道某个未声明的变量是否存在

//框架	(frame.html)<span>	</span>不贴到博客里了,只做了几个简单的例子,写的还特丑<span style="color: rgb(51, 51, 51); font-family: arial; font-size: 13px; line-height: 20.02px;"> _(:3 」∠)_ </span>

/*
 *	window对象
 *		- 窗口位置:		window.screenLeft/window.screenTop	FireFox:	window.ScreenX/window.ScreenY
 *		- 窗口大小:		window.innerWidth/window.innerHeight/window.outerWidth/window.outerHeight
 *		- 调整浏览器窗口大小:	window.resizeTo()/window.resizeBy()
 *		- 打开窗口:		window.open()
 */
//窗口位置
	//IE,Safari,Opera,Chrome:screenLeft和scrrenTop。
	//FireFox:				:ScreenX和ScreenY
	//跨浏览器取得左边和上边的位置:
var leftPos = (typeof window.screenLeft) == "numer"?
				window.screenLeft:window.screenX;
var topPos = (typeof window.screenTop) == "number"?
				window.screenTop:window.screenY;

console.log(leftPos+"..."+topPos);	//"392...147"从显示器左端到页面的距离和从显示器上端到页面的距离。

console.log(parent == top);				//true:由于没有框架,parent框架就等于top(浏览器窗口)。
	//IE,Opera:到页面可见区域的举例(如果页面紧贴上边,screenY就是导航栏的高度)。
	//Firefox,Safari,Chrome:到整个浏览器窗口的距离(页面紧贴上边,screenY返回0)。

//窗口大小
	//四个属性:innerWidth,innerHeight,outerWidth,outerHeight
	//OuterWidth,OuterHeight:
		//IE9+,Safari,Firefox:	返回浏览器窗口的尺寸。
		//Opera:				返回页面视图容器(单个标签页对应的浏览器窗口)的大小。
	//Opera中,innerWidth和innerHeight返回页面视图区(页面视图容器减去边框宽度)的大小。
	//Chrome中,inner的两个属性和outer的两个属性返回相同的值:视口(viewport)大小

//跨平台确定页面视口的大小
var pageWidth = window.innerWidth;
var pageHeight = window.innerHeight;

if(typeof pageWidth != "number") {					//如果不是数值,则检查是否处于标准模式(第十章讨论)。
	if(document.compatMode != "CSS1Compat")	{
		pageWidth = document.documentElement.clientWidth;	//是标准模式。
		pageHeight = document.documentElement.clientHeight;
	} else {
		pageWidth = document.body.clientWidth;			//非标准模式。
		pageHeight = document.body.clientHeight;
	}
}

	//对于移动设备,window.innerWidth和window.innerHeight保存着可见视口。
	//不支持这些属性的浏览器,保存在document.body.clientWidth和document.body.clientHeight中

//调整浏览器窗口的大小。
	//resizeTo()和resizeBy()
	//其中resizeTo()接收浏览器窗口的新宽度和新高度。
	//resizeBy()接受新窗口与原窗口的宽度和高度之差。
window.resizeTo(100,100);		//调整到100*100
window.resizeBy(100,150);		//调整到200*250
window.resizeTo(300,300);		//调整到300*300

//打开窗口:
var wroxWin = window.open("http:///www.wrox.com/");		//会弹出一个窗口
								//第一个参数:窗口URL。
								//第二个参数:在哪个框架中打开。
	//返回一个对该窗口的引用,可以通过这个引用操作窗口。

console.log(wroxWin.opener);

var wroxWin = window.open("http:///www.wrox.com/");
wroxWin.close();						//该窗口被关闭。
console.log(wroxWin.closed);					//true:已被关闭。
console.log(wroxWin.parent);					//window对象。
console.log(wroxWin.parent == wroxWin.top);			//true
console.log(wroxWin.opener);					//window对象啊
	//opener属性保存着打开它的原始窗口对象,只在最外层window对象(top)中有定义。
	//弹出的窗口与使之弹出的窗口运行在一个进程中。若想单独运行,需要将弹出窗口的opener设置为null
wroxWin.opener = null;
	//联系切断后,无法恢复。

//弹出窗口屏蔽程序:大多数浏览内置有弹出窗口屏蔽程序。
	//检测方法:window.open是否返回null。
var wroxWin = window.open("http:///www.wrox.com/","_blank");
console.log(wroxWin == null);					//false:没有被屏蔽。

	//如果是外置工具屏蔽的窗口,浏览器会弹出错误。此时需要try并处理。
var blocked = false;							//用一个变量记录窗口是否被屏蔽。
try{
	var wroxWin = window.open("http:///www.wrox.com/","_blank");
	blocked = true;								//表示被屏蔽。
}catch(e){
	blocked = true;								//即使抛出异常也正常处理 。
}

console.log(blocked);

/*
 *		定时器:	超时调用	setTimeout
 *				间歇调用	setInterval	
 */
//setTimeOut也可以用字符串表示要执行的参数
setTimeout("console.log('executed');",1000);					//executed
var id = setTimeout(function(){console.log("executed");},1000);			//executed
				//不建议使用字符串,有可能带来性能损失。
				//秒数以后不一定会立即执行,只是进入预执行状态(类似java中的Thread.sleep())
				//返回ID用于停止定时器
clearTimeout(id);								//未被执行


//间歇调用同样原理:setInterval

var num = 0;
var max = 10;
function inte() {				//计时器:从0到10
	if(num==max)
		clearInterval(id);		//会沿着作用域链自动在全局环境中寻找id
	console.log(num++);
}

var id = setInterval(inte,1000);

//用超时调用模拟间歇调用。
var num = 0;
var max = 10;

function incrementNumber () {
	num++;
	
	if(num < max) {				//不满足条件之前,每一秒钟新建一个超时调用。
		setTimeout(incrementNumber,1000)
	} else {
		console.log("Done");		//好处:不用记录ID。
	}
}

setTimeout(incrementNumber,1000);
	//在开发中很少真正的使用间歇调用,因为后一个间歇调用可能在前一个间歇调用之前启动。


//系统对话框:
	//1.外观由浏览器设置决定。
	//2.同步和模态:开启时代码停止执行,关闭时代码恢复执行。

//alert:弹出框
alert("呵呵!");					//弹出呵呵框

//confirm:确认框。经常在删除操作时使用。
var sure = confirm("爱我否?");				//返回一个boolean值

if(sure) {						//点了OK
	alert("你果然爱我。");
} else {						//点了cancel
	alert("竟然不爱我,嘤嘤嘤");
}

//prompt:输入框。
var text = prompt("请输入一段文本。");

if(text){						//如果输入不为空。
	alert("你输入的文本是'"+text+"'!");
} else {						//不输入或者输入空值,返回null。
	alert("你什么也没输!");
}

//chrome:页面显示两个以上对话框,可以屏蔽,后续对话框都不会显示。
var i = 0;
while(i<5) {
	alert("烦死你");
	i++;
}
alert("烦死你");					//如果屏蔽,这三种框都不会再显示
confirm("烦死你");
prompt("烦死你");

//查找和打印:异步显示(不影响页面加载)。
window.print();
window.find();

//location对象:提供与当前窗口中加载的文档的有关信息。
console.log(location.hash);			//URL后面的hash(#后面的字符,没有则返回空)
console.log(location.host);			//带端口号
console.log(location.hostname);			//不带端口号
console.log(location.href);			//地址
console.log(location.pathname);			//目录和文件名
console.log(location.port);			//端口号
console.log(location.protocol);			//协议
console.log(location.search);			//查询字符串

//解析查询字符串的函数:
function getQueryStringArgs() {
	var qs = (loaction.search.length > 0?
						//检查查询字符串的长度
		location.search.substring(1):"");
						//有长度则去掉"?"后返回,否则返回空
	
	var args = [];
	
	var item = null;
	var name = null;
	var value = null;
	
	var items = qs.length? qs.split("&"):[];
	
	for(var i=0;i<items.length;i++) {
		item = items[i].split("=");
		name = decodeURIComponent(item[0]);		//解码后存入name
		value = decodeURIComponent(item[1]);		//解码后存入value
	}
	
	if(name.length) {
		args[name] = value;
	}
	
	return args;

}

//location对象的位置操作。
location.assign("http://www.wrox.com");				//打开URL并生成一条历史记录

//相当于
window.location = "http://www.wrox.com";
location.href = "http://www.wrox.com";

	//还可以用location.hash location.search等方法修改相应属性(不演示了)。
	//都会使页面重新加载。
//replace()方法(重定位):不会生成历史记录。
location.replace("http://www.wrox.com");
//reload()方法:重新加载
reload();							//重新加载(有可能从缓存中加载)。
reload(true);							//重新加载(一定从服务器加载)。
	//reload之后的代码不一定会执行(取决于网络),最好将reload放在代码的最后一行。


//navigator对象	浏览器信息(第九章详细讨论)

//插件信息,存在navigator.plugins数组内
//属性:	.name:插件的名字	.description:插件的描述	.filename:插件的文件名	.length:插件所处理的MIME类型数量。
//
//循环输出浏览器插件名
for(var i=0;i<navigator.plugins.length;i++) {
	console.log(navigator.plugins[i].name);
}
//检测是否存在指定插件(使用迭代的方法)(在IE中无效)
function hasPlugin(name) {					//使用迭代的方法检测plugins数组。
	name = name.toLowerCase();				//忽略大小写,便于比较。
	for(var i=0;i<navigator.plugins.length;i++) {		//遍历navigator.plugins数组
		if(navigator.plugins[i].name.indexOf(name))	//找到相同name的插件则返回true
			return true;
	}
	return false;						//否则返回false
}
*/
/*
//检测是否存在指定插件(使用迭代的方法)(IE方法)
function hasIEPlugin(name) {							//使用专有的ActiveXObject类型,并尝试创建一个特定插件的实例。
	try{
		new ActiveXObject(name);
		return true;							//创建成功则return true
	}catch(e){
		return false;							//创建失败(创建未知对象会导致抛出异常)则return false
	}
}

//由于两种方法差别太大,如果想通用,就要插件单独创建通用的检测方法
function hasFlash() {								//分别使用两种检测方法,都为false则返回false,否则返回true
	var result = hasPlugin("Flash");
	if(!result) {
		result = hasIEPlugin("ShockwaveFlash.ShockwaveFlash")		//使用IE的插件标识符检测。
	}
	return result;
}


//注册处理程序。
	//navigator.registerContentHandler()
		//处理RSS源
	//navigator.registerProtocolHandler()
		//处理协议

//screen对象:用来表明客户端的能力(屏幕数据,颜色位数等)。

//history对象:历史数据。开发人员无法得知用户浏览过的URL,但可以借用history对象模拟。
	//go方法:跳转
history.go(-1);			//向后跳转一页历史记录。
history.go(1);			//向前跳转一页历史记录。
history.go(2);			//向前跳转两页历史记录。

		//传入字符串:跳转到最近的,包含该字符串的网址(可能前进,也可能后退)
history.go("wrox.com");	//跳转到最近的wrox.com中的页面。

history.back();			//后退一页,相当于浏览器的后退按钮。
history.forward()		//前进一页,相当于浏览器的前进按钮。

history.length;			//长度属性,保存着历史记录的数量。

if(history.length == 0) {
	console.log("你一定刚打开这个页面!");	//history的长度为0说明是新页面。
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值