JavaScript the Definitive Guide (6)
概述
正式进入本书第二部分的内容, 核心主要围绕在浏览器内的js. 包含了最基本的使用方式, 方法, 因浏览器而增加的各种属性方法, 操作css, dom的方法, 以及常用的一些js框架, 库等, 同时还包含了目前浏览器大热的安全领域.
阅读笔记
Chapter 13 - JavaScript in Web Browsers
- 异步:
defer: 使浏览器在解析并加载渲染完HTML的DOM后加载此js脚本;async: 使浏览器在尽快执行js脚本, 但在下载js脚本时不停止DOM的解析, 优先级高于defer;- 使用方式为在script中增加关键字即可:
<script defer src="deferred.js"></script>; - 注意在使用
defer/async的时候, js中不能使用document.write(); document.readyState的变化过程:loading(async downloading, normal executing) => interactive (defer/async executing) => complete(defer/async done, event handlers invoked);
Compatibility Check:- 按照目前的浏览器格局, 基本上一个浏览器就有着一种js的版本, 除了标准版本的基础功能之外, 所有的扩展功能, 各家与各家的实现方式都略有不同, 所以在使用过程中, 就需要我们考虑到兼容性的问题;
- Can I Use…, 这是一个非常优秀的检测某个属性, 方法的浏览器支持度, 拿不准的都可以在这里进行查询确认, 其还支持css和html5的检测;
- IE5的时候引入了一个
Conditional Comments的技巧, 是通过特殊的html注释从而让浏览器识别其IE版本, 比如<!--[if lte IE 7]><![endif]-->就代表IE7及以下, 而写在这个if里面的内容就会在IE7及以下的浏览器中被识别并作为页面html的一部分而提取出来(仅限IE浏览器), 其他的浏览器都会自动当做注释不理会此部分; - IE的JS也支持
Conditional Comments, 比如/*@cc_on @if (@_jscript)...@end @*/, 这里面@cc_on...@*/是整个Conditional Comments, 而里面的@if (@_jscript)...@end则是判断部分, 其中@_jscript是IE自身js编译器的名称;
Accessibility:- 对于身体原因而有不便的人, js的支持效果会大打折扣, 所以根据这部分人的情况而优化自身的网页结构, 目前也是网页设计的一大核心之一;
Security:- 随着js的发展使用, 其危害性也日益提升;
- 目前的保障安全手段主要有:
限制其功能,限制其使用范围和情景,敏感权限默认关闭虚人工开启; The Same-Origin Policy: js只允许读取与当前执行环境域名相同域名下的windows属性, 那么怎么界定相同域名呢:- 来自不同的网络服务器;
- 来自相同的网络服务器, 不同的端口;
- 同一网络服务器, 同一端口, 不同的http协议(http,https);
- 以上, 都认为是不同域名;
- 如何舒缓此规则:
document.domain: 考虑到同级子域名也会被禁止, 那么通过设定document.domain为同一母域名即可实现同级子域名的跨域;Cross-Origin Resource Sharing: 通过http请求新增的Access-Control-Allow-Origin头部, 服务器就可以指定其允许跨域的程度了;cross-document messaging: HTML5新增了一些很强大的API,cross-document messaging API就是其中之一, 它允许不同的document之间的js进行通讯;
Chapter 14 - The Window Object
- Timers:
setTimeout(): 延时触发;setInterval(): 定时循环执行;clearTimeout(): 清除延时触发;clearInterval(): 清除定时循环;
- Location:
window.location === document.location两者皆为当前页面url, 并随页面url变化而更新;document.URL也是指代加载后的当前页面, 但不随页面内动态变化引起的url变化而变化;Location这个对象本身包含了多个属性分别指代url的不同部分:protocol表示网络协议,host, hostname通常都指示域名,前者包含端口,port表示端口,pathname表示以域名根目录为/的相对路径,search表示url中?以后的部分但不包含hash部分,hash则是表示url#以后的部分;Location还包含了三个常用的函数:assign(),replace(),reload(), 其中前两者功能都一样, 都是用以加载新页面的, 不过replace()加载的同时将当前页面从history中去除了(就是不能后退后之前页面了), 而assign()还保留着;reload()就更不用说了, 只是单纯的重载页面;
- History:
back(),forward(): 等价于浏览器的后退,前进按钮;go(n): 接受数字作为参数, 表示向前或者后退n个页面;- 如果页面中有
iframe, 那么其history会自动合并到主界面的history中;
- Navigator:
appName: 浏览器的名称;appVersion: 浏览器版本号;userAgent: 用户代理, 对应HTTP的USER-AGENT;platform: 操作系统;onLine: 是否连通网络, HTML5支持;geolocation: 用户地理位置信息, HTML5支持;javaEnabled(): 对Java扩展的支持, 非标准;cookiesEnabled(): 能够设置cookie, 非标准;
- Screen:
width,height: 当前屏幕的长宽尺寸;availWidth,availHeight: 去除功能区等部分之后的实际展现内容的屏幕尺寸;colorDepth: 显示屏幕的bits-per-pixel;
- Dialog Boxes:
alert(): 弹出对话框, 展示传入的信息;confirm(): 自带OK,Cancel按钮的对话框, 返回对应的boolean值;prompt(): 附带输入框, 返回输入的值;- 上述三个类型的对话框的样式结构都无法调整, 是浏览器默认设定的;
showModalDialog(): 则更加复杂, 它可以支持弹出一个页面, 其接受的第一个参数即为页面的url, 后面的参数则是弹出窗口的属性; 在chromium中已经被禁止了
- onerror handler:
- 用于处理错误信息的, 你完全可以定制这个函数来更好的显示js中的错误信息;
- Document Elements As Window Properties:
- 当一个html元素被赋予了id时, 其id对应名称的全局变量不存在时, 其自动转为全局变量, 属性名称即为id名, 但如果id名已经被使用, 则不生效;
- 对于
<a> <applet> <area> <embed> <form> <frame> <frameset> <iframe> <img> <object>这样的元素, 其name值和id效果是一样的, 且name值支持多个元素相同, 会自动生成类array形式, 对于iframe, 对应的属性会指向其内嵌窗口的window对象;
- Multiple Windows and Frames:
- 通过js打开的新窗口都可以被js获取到, 并进行操作, 但是需要符合
same-origin的原则; frame嵌入的窗口可以通过parent.frames属性来获取, 也可以通过其自带的contentWindow来获取;
- 通过js打开的新窗口都可以被js获取到, 并进行操作, 但是需要符合
谜题
- Q: 在测试
same-origin的时候, 发现有些网站可以设定子域名的document.domain为母域名, 有些不能? 比如在google的搜索结果页, 就可以, 但是在github pages中想要设置为github.io就不可以, 会出现'github.io' is a top-level domain.这样的错误?