对代码的理解全部写在了注释中
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说明是新页面。
}