ppk on javascript 笔记(六)--BOM
浏览器对象模型(Browser Object Model)是语言核心和DOM之间的一个过渡层,这个过渡层特指Javascript的客户端实现,它的主要任务是管理浏览器窗口并使得它们可以彼此通信。window对象是BOM的核心。事实上,window对象还定义了诸如当前页的URL、浏览器的识别字符串等非文档结构的部分。
WHAT-WG正在为BOM指定一个规范,BOM正遵循着Netscape 3的事实标准。
window对象
window对象首先是核心需要的全局对象,它包含了脚本中定义的所有全局变量和函数。
在一次会话中,一个window对象可以包含很多页面,新页面会被载入到同一个window对象,window对象原来的全局对象(变量和函数)将被销毁,但是window对象本身并没有被销毁,它仍旧可以被访问到,甚至用户关闭了主窗口。
有三种方法来保存上一次的全局变量,cookie,跨浏览器通信和保存到服务器,第三种方法是最安全的。
新窗口会创建一个新的window对象,当创建一个其他窗口的window对象的引用时,访问这个引用的属性将报错,原因在使用引用时,引用尚未完全载入。正确的方法应该是为两个窗口的存在和释放各记录一个cookie,然后再调用方法钱检查这些状态。
window和self都指向窗口本身,它们访问的是同一个对象,习惯上使用window。
可以为name属性赋值,window.name='myname',这将为链接的target属性提供一个引导。window.open()方法也可以用到这个name作为打开窗口的目标。
window.status属性直接访问并重写状态了文本,window.defaultStatus提供了没有状态时状态栏的文本。可以使用a标签的mouseover方法修改掉默认的鼠标滑过链接显示href的动作,特殊的,在onmouseover中,IE和Mozilla都需要你返回true,而不是false来阻止整个默认动作。
跨浏览器通信
必须同时满足两个条件才能进行窗口间的通信:两个窗口必须来自同一个域(同源策略);其中一个窗口包含另一个窗口的引用(即一个窗口打开了另一个窗口)。
window.open方法用来打开新窗口,完整地书写window.open()而不是open()是为了与document.open()区别。
window.open('page.html', 'popup', 'width=300,height=400');
第一个参数指定载入的页面,为空则打开空白窗口,第二个参数设置新窗口的name值或打开已有name的窗口,第三个参数控制新窗口的外观和行为,详细的介绍在http://www.quirksmode.org/popups.html。
保存window.open的返回值,则在主窗口创建了一个指向新窗口的引用,而新窗口总是自动创建一个opener属性指回主窗口。
当主窗口载入一个新页面时,弹出窗口的opner属性仍然指向主窗口(主窗口window对象没有销毁),但主窗口原来指向弹出窗口的全局变量被销毁了(此时仍满足跨窗口通信的第二个条件),我们需要重新建立联系:首先在弹出窗口建立一个函数,opener.newWindow=window(注意opener即为主窗口),按照上面的方法设置两个cookie来安全地在主窗口中调用弹出窗口的这个函数。考虑到同源策略和主窗口是否关闭,弹出窗口的这个函数应该写为:
//exit actions
} elseif (checkCommunication() && opener.ST_loaded) {
opener.ST_newWindow = window;
tryCounter =;
} elseif (tryCounter < nrOfAttempts) {
//record the new site
tryCounter++;
} else {
//exit actions
}
首先判断opner为null(虽然罕见但是保险起见)、是否关闭、能否通信,然后检查主窗口的ST_loaded属性(自定义用来确认完全载入),最后判断尝试通信超过指定次数。
在这里我们用到了window.closed属性,我们讲窗口释放时所有的全局变量都被销毁,但是除少数浏览器外都保留了closed属性用来指示是否关闭,而对于其他属性诸如location和navigation是否仍存在,各个浏览器并没有对此达成一致,因此窗口释放时除closed属性外不要再使用。
(bloodmage按:在这里我提到了对象、变量、属性、方法、函数,实际上,javascript不区分属性和变量,也不区分方法和函数,只是习惯上单独使用时讲变量和函数,而谈到对象时则用属性和方法;我讲窗口释放时所有的全局对象都被销毁,是指window对象的属性和方法都被销毁了,而实际上window对象的属性即location,document.navigation,screen等也是对象,window对象的方法则主要有表示交互的alert和改变大小的resizeTo等。)
当违反同源策略(详见笔记一)时,不能从该窗口中收集它的任何信息,通过尝试来检查能否通信。
function checkCommunication() {
if (!opener) returnfalse;
try {
opner.testVar =true;
} catch(e) {
returnfalse;
}
returntrue;
}
window.close()方法用来关闭窗口,但一些浏览器拒绝执行,或者弹出一个对话框询问是否关闭窗口。通过javascript打开的窗口可以直接被关闭而不被提示,因此可以使用使用window.open('','_self');window.close();直接关闭当前窗口。
由于弹出窗口的恶名,浏览器默认开启Block unrequested popup windows功能阻止打开未经请求的弹出窗口,但这很容易被绕过,比如设置document.onclick = function() { window.open(); }。新的窗口拦截软件提供了更多的方法,但同时恶意广告也会利用flash、微软专有的popup对象或脚本创建内嵌层模拟弹窗。
导航
ppk on javascript 笔记(六)--BOM的更多相关文章
- JavaScript笔记六
1.对象(Object) - 对象是JS中的引用数据类型 - 对象是一种复合数据类型,在对象中可以保存多个不同数据类型的属性 - 使用typeof检查一个对象时,会返回object - 创建对象 - ...
- 【学习笔记】:JavaScript中的BOM对象
JavaScript中的BOM对象 BOM(Browser Object Model):浏览器对象模型. BOM可用于对浏览器窗口进行访问,但BOM没有相关的标准,所以根据浏览器的不同,其中定义的对象 ...
- 前端er是否忽略了某些东西?——读《ppk谈JavaScript》
关于书 “不知道ppk的网站QuirksMode,说明你可能还没有真正成为资深的JavaScript程序员.” ——Roger Johansson,瑞典资深Web专家. ppk是世界级前端技术专家,W ...
- 从头开始学JavaScript 笔记(一)——基础中的基础
原文:从头开始学JavaScript 笔记(一)--基础中的基础 概要:javascript的组成. 各个组成部分的作用 . 一.javascript的组成 javascript ECMASc ...
- [Effective JavaScript 笔记] 第4条:原始类型优于封闭对象
js有5种原始值类型:布尔值.数字.字符串.null和undefined. 用typeof检测一下: typeof true; //"boolean" typeof 2; //&q ...
- [Effective JavaScript 笔记] 第5条:避免对混合类型使用==运算符
“1.0e0”=={valueOf:function(){return true;}} 是值是多少? 这两个完全不同的值使用==运算符是相等的.为什么呢?请看<[Effective JavaSc ...
- [Effective JavaScript 笔记]第3章:使用函数--个人总结
前言 这一章把平时会用到,但不会深究的知识点,分开细化地讲解了.里面很多内容在高3等基础内容里,也有很多讲到.但由于本身书籍的篇幅较大,很容易忽视对应的小知识点.这章里的许多小提示都很有帮助,特别是在 ...
- [Effective JavaScript 笔记]第27条:使用闭包而不是字符串来封装代码
函数是一种将代码作为数据结构存储的便利方式,代码之后可以被执行.这使得富有表现力的高阶函数抽象如map和forEach成为可能.它也是js异步I/O方法的核心.与此同时,也可以将代码表示为字符串的形式 ...
- [Effective JavaScript 笔记]第28条:不要信赖函数对象的toString方法
js函数有一个非凡的特性,即将其源代码重现为字符串的能力. (function(x){ return x+1 }).toString();//"function (x){ return x+ ...
随机推荐
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- Direct12优化
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- Direct12优化 第一章:向量代数 1.向量计算的时候,使用XMV ...
- jQuery图片从下往上滚动效果
在线演示 本地下载
- Codeforces 336C
这题是大一暑假时候做的,当时没有出,直到今天突然觉得应该把没过的题目再做一边,不然真的是越积越多. 现在能够独立做出来真的是难以表达的兴奋,刚开始的时候就觉得 O(30 * 30 * n)的复杂度有点 ...
- Java中try catch finally语句中含return语句的执行情况总结-编程陷阱
前言:有java编程基础的人对java的异常处理机制都会有一定了解,而且可能感觉使用起来也比较简单,但如果在try catch finally语句块中遇到return语句,开发者可能就会遇到一些逻辑问 ...
- php表单的种类
1.text 2.color 3.date 4.datetime 5.email 6.month 7.number 8.range 9.search 10.tel 11.url 12.week 13. ...
- iOS-CoreLocation:无论你在哪里,我都要找到你!
作者:@翁呀伟呀 授权本站转载 CoreLocation 1.定位 使用步骤: 创建CLLocationManager示例,并且需要强引用它 设置CLLocationManager的代理,监听并获取所 ...
- ocilib linux编译安装
1.首先下载ocilib到自己目录 github:https://github.com/vrogier/ocilib 2.在下载instantclient 11.2.2的文件: instantclie ...
- pytorch源码解析:Python层 pytorchmodule源码
尝试使用了pytorch,相比其他深度学习框架,pytorch显得简洁易懂.花时间读了部分源码,主要结合简单例子带着问题阅读,不涉及源码中C拓展库的实现. 一个简单例子 实现单层softmax二分类, ...
- [Offer收割]编程练习赛108 - 树上的最短边 树链剖分
直接点权下放到边权,每次查询从dfs序的st[u]+1,ed[v]之间查询, #include<iostream> #include<stdio.h> #include< ...
- poj 2689 Prime Distance (素数二次筛法)
2689 -- Prime Distance 没怎么研究过数论,还是今天才知道有素数二次筛法这样的东西. 题意是,要求求出给定区间内相邻两个素数的最大和最小差. 二次筛法的意思其实就是先将1~sqrt ...