Object-Oriented JavaScript笔记(六)

Object-Oriented JavaScript 笔记
Object-Oriented JavaScript笔记(一)
Object-Oriented JavaScript笔记(二)
Object-Oriented JavaScript笔记(三)
Object-Oriented JavaScript笔记(四)
Object-Oriented JavaScript笔记(五)
Object-Oriented JavaScript笔记(六)
Object-Oriented JavaScript笔记(七)

第七章 浏览器环境

文档对象模型(处理当前页面内容的)与浏览器对象模型(处理当前页面之外的)
参考资料:

* The Mozilla DOM reference for Firefox information
* Microsoft’s documentation for Internet Explorer
* W3C’ DOM specs

BOM
提供一组对象访问浏览器(window)及计算机屏幕信息(window.screen)

window对象相关属性
window.navigator 包含浏览器及其功能信息
navigator.userAgent 返回浏览器标识信息,开发者常用它区分浏览器以提供不同的实现代码

这并不能完整的细分到每一个浏览器,更好的办法是使用特性嗅探法

window.location 提供与当前页面url有关的信息,同时提供了三个方法reload(), assign() 和 replace().
assign和replace功能很相似,区别是replace不在window.history中产生信息。

window.history允许你访问当前会话窗口的访问历史

window.frames保存一组当前页面的frames信息,无论是否存在frames,window.frames总是指向window对象(这说明它也是一个伪数组)
每个frame中都包含一个独立的window对象,可以通过下面几种形式访问它
>>> window.frames[0]
>>> window.frames[0].window
>>> frames[0].window
>>> frames[0]

父页面可以访问子页面,子页面同样可以访问父页面,每个页面都有一个window.parent指向其父页面(不存在时指向自身)
如果要访问顶层页面,window.top (不存在时指向自身)

如果一个frame有name属性,也可以通过name访问它window.frames[‘myframe’]

window.screen提供屏幕与颜色深度信息

window.open()/window.close()/window.moveTo()/window.resizeTo()/window.alert()/window.prompt()/window.confirm()这些别用了。

注意:alert()并不是ECMAScript中定义的方法。

window.setTimeout(), window.setInterval()延时执行和重复执行
虽然第一个参数可以传字符串setTimeout(‘foo’,2000)但是还是别传字符串,传函数引用更妥当setTimeout(foo,2000)

window.document提供当前页面文档对象模型相关的信息(DOM)

nodeType为1的节点(element nodes),nodeName和tagName都是节点的标签名称。

innerHTML并不是标准中存在的,但所有的浏览器都支持它。

document.getElementsByTagName(‘*’)
早期的IE浏览器并不支持星号作为tag名称传入,不过可以使用document.all获得所有元素。
IE7开始支持*号作为标签名,但它会返回所有节点,而不仅仅只是元素类节点。

遍历dom

CSS中的短横线在JavaScript并不是合法的名字,所以margin-left在在js中是以el.style.marginLeft的形式访问。
可以直接修改节点的属性,如
el.id = ‘sidebar’
由于class在JavaScript中是保留字,修改class属性则使用el.className

HTML 私有对象
document.images 等效于 document.getElementsByTagName('img')

document.applets 等效于 document.getElementsByTagName ('applets')

document.links 所有的

document.anchors 所有的

document.forms

非核心对象
document.cookie
document.title
document.referrer
document.domain
document.location

注意,改变document.title并不等效于访问document.getElementsByTagName(' title')[0],它只是更改浏览器窗口上的显示。

document.referrer的值等同于http头里的Referer(由于历史原因,这是个拼写错的词)

document.domain可以从小域改称大域(www.yahoo.com -> yahoo.com),但不能从大域改称小域(yahoo.com -> www.yahoo.com),常用于解决跨域问题。

window.location === document.location

事件
在2级DOM事件模型中,事件传播分三个阶段进行,即捕获阶段(capturing)、目标阶段和冒泡阶段(bubbling)。

IE 只支持冒泡
Netscape 只支持捕获

第三个参数决定是否使用捕获,由于兼容性原因,建议传false,在实际的使用中只使用冒泡。

可以使用e.stopPropagation();放弃冒泡。
事件代理(event delegation)的应用

IE中还是可能使用事件捕获的 setCapture() / releaseCapture(),但它只支持鼠标事件,其它事件(如键盘事件)则不支持。

DOM 规范中并没有说事件绑在window上会怎么样,在IE中(注:低版本)并不会触发,在Firefox中会出发。

移除一个事件,需要传入原事件指针,故绑的匿名函数不能被移除掉。

终止默认事件
e.preventDefault();

并不是所有事件的默认行为都能被终止,可以检查事件对象的cancellable字段来确认。

IE中事件不同的部分:

1.(低版本的)IE没有addEventListener() 但IE5开始它有个等价的 attachEvent()方法
2.attachEvent()中click要写作onclick
3.使用老式方法(onclick)时,回调函数并不会传入event参数,但会有个全局的window.event供使用(注:现实场景中它需要先cache下来)
4.IE的事件没有target属性用于指示目标函数,但有个等价的srcElement
5.并不是素偶有的事件都有捕获截断,所以只能使用冒泡
6.没有stopPropagation()方法,但是可以设置cancelBubble 属性值为true
7.没有preventDefault()方法,但是可以设置returnValue值为false
8.removeEventListener()的等效方法detachEvent().

兼容性示例:

事件类型

鼠标事件:
mouseup, mousedown, click (the sequence is mousedown-up-click), dblclick

mouseover (mouse is over an element), mouseout (mouse was over an element but left it), mousemove

键盘事件:
keydown, keypress, keyup (occur in this sequence)

载入\window事件:
load (an image or a page and all of its components are done loading), unload (user leaves the page), beforeunload (the script can provide the user with an option to stop the unload)
abort (user stops loading the page in Firefox or an image in IE), error (a JavaScript error in Firefox and IE, also when an image cannot be loaded in IE)
resize (browser window is resized), scroll (the page is scrolled), contextmenu (the right-click menu appears)

表单事件:
focus (enter a form field), blur (leave form field)
change (leave a field after the value has changed), select (select text in a text field)
reset, submit

AJAX(XMLHttpRequest以及IE7之前使用ActiveXObject)
-EOF-

Object-Oriented JavaScript笔记(五)

Object-Oriented JavaScript 笔记
Object-Oriented JavaScript笔记(一)
Object-Oriented JavaScript笔记(二)
Object-Oriented JavaScript笔记(三)
Object-Oriented JavaScript笔记(四)
Object-Oriented JavaScript笔记(五)
Object-Oriented JavaScript笔记(六)
Object-Oriented JavaScript笔记(七)

第六章 继承

空的构造函数—new F()
用于解决原型链上的属性被覆盖的问题。

Uber 访问父方法。

用函数来实现继承 (注:实际上上面的两个示例的extend已经是被我封装过的了)

复制属性

当复制引用带来的问题

修改引用对象会导致原型的也被修改。

从对象中继承:

浅拷贝

深拷贝:

object()构造起,老道提议的形式。

混合原型拷贝和属性继承(很多时候需要继承一个对象,并给它添加一些属性用)

多重继承,说白了就是按顺序进行属性复制,后出现的覆盖已经存在的。

-EOF-

Chrome For Mac 离线安装包下载

以前写过一篇Chrome离线安装包下载方法是用于Windows的,今天重装了Mac,由于最新的版本不稳定,所以还是下载老版本。网上其它站点下载的不可信,得从Google官方的站点下才行,终于,偶还真把 Google Chrome 18.0.1025.168这个版本给下载下来了。
实际下载地址:

http://dl.google.com/chrome/mac/GoogleChrome-18.0.1025.168.dmg

Chrome Releases Blog查到对应的版本号,替换即可。
-EOF-

Object-Oriented JavaScript笔记(四)

Object-Oriented JavaScript 笔记
Object-Oriented JavaScript笔记(一)
Object-Oriented JavaScript笔记(二)
Object-Oriented JavaScript笔记(三)
Object-Oriented JavaScript笔记(四)
Object-Oriented JavaScript笔记(五)
Object-Oriented JavaScript笔记(六)
Object-Oriented JavaScript笔记(七)

第五章 原型

原型链继承:new 出来的对象仍能继承到给原型prototype添加的方法

给实例添加与原型属性同名的属性,会隐藏原型链属性。
>>> var Class = function(){};
>>> Class.prototype.name = ‘John’;
>>> var toy = new Class()
>>> toy.name = ‘Tom’;
>>> toy.name
“Tom”
>>> delete toy.name
>>> toy.name
“John”

并不是所有的属性都会在for in中被枚举出来。
判断属性是自身属性还是原型链上的属性使用hasOwnProperty()
propertyIsEnumerable()对于prototype上的属性都会返回false,虽然他们都能在for in中被枚举出来。

isPrototypeOf()判断一个对象是否是另一个对象的原型。

Prototype陷阱
prototype对象被替换后,实例的原型链仍然是存在的
prototype.constructor并不可靠
介于此,重写prototype后,最好重置constructor (这里的确很让人迷惑)
-EOF-

新项目: Story Board

大约在前年,我就开始使用Python写Blog程序并将其Hosted在GAE上,并一度有将其开源的打算,后由于GAE数据库读取价格策略改变,代价太高而放弃;期间还写了一个简单的图片存储程序承诺将其开源,由于代码过于草稿没时间整理也一拖再拖。两者,代码至今都没有释放出来。

而在今年年初,GAE完美支持Django+MySQL,给原本失去的希望又重新点燃,用其托管一个小访问量的站点又有了规避方案,另一方面Cloud SQL可以方便的导出数据,数据备份不需要再经过复杂的操作。在二月结束的时候,我写了一个小的网站原型,后经过改进,并将其命名为Story Board托管在GitHub上开源出来。

同时用它替换原来的Oh Bug!。希望Oh Bug!不再单单只是一个Blog,也是一个小众技术讨论区,欢迎任何人参与进来讨论~

Project Story Board
https://github.com/darcyliu/storyboard

Oh Bug!
http://www.ohbug.com/

You are very welcome.

-EOF-