window对象同时扮演者ECMAScript中Global对象的角色,在全局中声明的变量、函数都会变成window对象的属性和方法。
全局变量不能通过delete删除,但是定义在window中的属性可以。
尝试访问未声明的变量会出错,但是window.nodefined会返回undefined而不至于出错。
每个框架都拥有自己的window对象,并且保存在frames集合中。
top对象指向最高(最外)层的窗口,也就是浏览器窗口。
parent对象指向当前框架的直接上层框架。
self对象指向window,实质上二者可以互换使用。
window.open()方法可以导航到一个特定的URL,也可以打开一个新的浏览器窗口。
可以接受四个参数:要打开的URL,窗口目标,一个特性字符串,一个表示新页面是都取代浏览器历史记录中当前加载页面的布尔值
第二个参数,窗口目标:
窗口名字,加载到具有指定名字的窗口中,若不存在,则创建新的窗口。
也可以是特殊的窗口名称:_self _parent _top _blank
第三个参数:特性字符串
如:“height=300”
包括:fullscreen height width location menubar resizable scrollbars status top left
超时调用
取消超时调用
间歇调用
取消间歇调用
alert()
接受一个字符串参数并将它显示给用户。
常用于“警告”,显示一些用户无法控制的消息。
只有OK按钮。
comfirm()
用于确认,拥有OK和Cancel按钮。返回布尔值。
prompt()
用于提示。拥有OK和Cancel按钮,和一个文本输入域。
两个参数:要显示给用户的提示和文本框中的默认值。返回值为文本框中的字符串或者null。
最有用的BOM对象之一,提供当前加载的文档有关的信息,和导航功能。
window.location和document.location是同一个对象。
解析查询字符串参数
function getQueryArgs(){
var qs=(location.search.length>0?location.search:"");
args={},
items=qs.length?ps.split("&"):[];
item=null;
name=null;
value=null;
i=0;
len=items.length;
for(i=0;i){
item=items[i].split("=");
name=decodeURIComponent(item[0]);
value=decodeURIComponent(item[1]);
if(name.length){
args[name]=value;
}
}
return args;
}
用于改变浏览器的位置。
assign()方法
loaction.assign(“http://www.baidu.com”);
window.location=“http://www.baidu.com”
location.href=“http://www.baidu.com”(试了下没有效果)
replace()
location.replace(“http://www.baidu.com”)
不会在浏览器的历史中生成记录,无法通过“后退”按钮回退到上一个页面。
reload()
重新加载当前显示的页面,在缓存中读取。
reload(true)
重新加载,从服务器重新加载。
(下次一定)
用处不大。
出于安全考虑,开发人员无法得知用户浏览过的URL。
时间有限,先读了小结。
客户端检测方法
DOM是针对HTML和XML文档的一个API,描绘了一个层次化的节点树,运行开发人员添加、移除和修改页面的某一部分。
节点分为几种不同的类型,表示文档中不同的信息或标记。
最基本的节点,抽象地表示文档中一个独立的部分,其他类型都继承于此。
节点信息
节点关系
操作节点
其他方法
表示整个文档,是一组分层节点的根节点。js中的document对象是Document类型的一个实例。使用document对象,可以查询和获取节点。
文档子节点
取得html
document.documentElement;
document.childNodes[ 0 ];
document.firstChild;
body属性
doctype属性
文档信息
查找元素
特殊集合
DOM一致性检测
检测浏览器实现了dom的哪些部分
例:document.implementation.hasFeature(“XML”,“1.0”)
文档写入
表示文档中所有的html或xml元素,可以用来操作这些元素的内容和特性。
访问元素的标签名:xxx.nodeName或xxx.tagName 输出均为大写。
htmlElement
继承自Element。所有的html元素都是由HtmlElement或者其更具体的子类型来表示的。
属性:id title lang dir className
操作特性
hello<\div>
var div=document.getElementById("my4399")
div.getAttrbute("data-dq")
特性的名称不区分大小写。
可以获取自定义的特性。根据HTML5的规范,自定义特性前应该加上data-前缀以便验证。
-
通过DOM本身访问
区别:
style:getAttribute返回css文本,通过属性访问则返回第一个对象;
onclick之类的事件处理程序:getAttribute返回字符串,通过属性访问则返回一个js函数。
-
setAttribute()
两个参数,要设置的特征名和值。所有的特性名均会被转化为小写。
不能直接给DOM对象添加自定义属性,但通过该方法可以添加自定义属性。
-
removeAttribute()
attributes属性
包含一个NamedNodeMap对象,是一个动态维护的集合,保存着元素的每一个特性,每个特性由一个Attr节点表示。
一个Attr节点的名称,用nodeName获取,就是特性名;而节点的值,用nodeValue获取。
方法:就是对当前元素的属性列表进行一定的操作,比如获取,删除,添加等。
- getNameItem(name)
返回nodeName属性等于name的节点。
- removeNameItem(name)
- setNameItem(node)
想列表中添加节点,以节点的nodeName属性为索引。
- item(pos)
返回位于数字pos位置的节点。从0开始计数。
创建元素
- document.vreateElement()
接受一个参数,要创建的元素的标签名。标签名不区分大小写。
- appendChild() insertBefore() replaceChild()
将新建的元素添加到文档树中
元素的子节点
- childNodes属性
- getElementByTagName()方法
以当前元素为起点。
1.4 Text类型
文本内容。
文本节点用text表示,包含的是可以照字面解释的纯文本内容。
若文档节点存在与文档树中,则修改文档节点的结果会立即得到反应。
文本节点的方法和属性
- appendData(text)
- deleteData(offset,count)
- insertData(offset,text)
从offset指定的位置开始插入text
- replaceData(offset,count,text)
- splitText(offset)
指定位置归到后半部分。
- subStringData(offset,count)
- length属性
节点中字符的数目,与nodeValue和data.length具有相同的值。
创建文档节点
- document.createTextNode()
一个参数,要插入的节点中的文本
规范化文本节点
相邻的同胞节点中的文本会连起来显示,中间不会有空格。
- normalize()
合并相邻的文本节点,父亲元素调用。
1.5 Comment类型
注释。
与text继承自相同的基类。具有除了splitText之外的其他方法和属性。
创建:document.createComment() 很少会创建和访问注释节点。
*1.6 CDATASection类型
CDATA区域。
*1.7 DocumentType类型
文档类型。
1.8 DocumentFragment类型
文档片段。
轻量级的文档,不存在于文档中,一般作为仓库使用,在其中保存将来可能添加到文档中的节点,减少渲染次数。
//向列表添加3个列表项,使用DocumentFragment避免多次渲染。
var fragment=document.createDocument();
var ul=document.getElementById("mylist");
vat li=null;
for(var i=0;i<3;i++>){
li=document.createElement("li");
li.appendChild(document.createTextNode("Item"+(i+1)));
fragment.appendChild(li);
}
ul.appendChild(fragment);
1.9 Attr类型
就是存在于元素的attributes属性中的节点。
Attr的属性:name value specified(用于区别特性是在代码中指定的还是默认的)
2 DOM操作技术
动态脚本
使用动态脚本
使用script标签,直接包含js代码,或者用src属性引入外部文件。
使用dom加入
var script=document.createElement("script");
script.type="text/javascript"
scrupr.src="client.js"
document.body.appendChild(script);
还可以包装成函数。
可以使用script.text添加js代码。
动态样式
添加样式,可以使用link元素包含外部文件的方法,或者style元素包含css代码的方法。
包装成dom函数
function loadStyles(url){
var link=document.createElement("link");
link.ref="stylesheet";
link.type="text/css";
link.href=url;
var head=document,getElementsByTagNName("head")[0];
head.appendChild(link);
}
操作表格
直接使用dom代码很长且不好懂,htmldom为table、tbody和tr元素添加了一些属性和方法。
- table元素
caption
tBodies:tbody的collection
tFoot
tHead
rows
createTHead()
createTFoot()
createCaption()
deleteTHead()
deleteTFoot()
deleteCaption()
deleteRow(pos)
insertRow(pos)
- body元素
rows
deleteRow(pos)
insertRow(pos)
- tr元素
cells:单元格的集合
deleteCell(pos)
insertCell(pos)
使用NodeList
最重要的特点,动态维护,它始终都保存着最新、最准确的信息。
ch11 DOM拓展
1 选择符API
selectoes API,致力于让浏览器原生支持CSS查询。
原本:CSS解析,然后再用DOM方法查询文档并找到匹配的节点。
变成原生API后,解析和树的查询可以在浏览器内部通过编译后的代码来完成。
-
querySelector()方法
参数:一个CSS选择符
返回第一个匹配的元素,没有则返回null
-
querySelectorAll()方法
-
matchesSelector()方法
接受一个参数,CSS选择符。如果调用的元素与之匹配,返回true,否则返回false。
2 元素遍历
Element Traversal API
为DOM元素添加的属性
- childElementCount
返回子元素的个数,不包括文本节点和注释
- firstElementChild
- lastElementChild
- lastElementChild
- previousElementSibling
- nextElementSibling
3 HTML5
与类相关的扩充
- getElementByClassName()方法
- classList属性
该新类型还具有方法:
add(value)
contains(value) 是否存在value检测
remove(value)
toggle(value) 如果有value,删除它;如果没有,加入它。
焦点管理
- document.activeElement属性 查看当前焦点元素名称
- focus()方法 使元素获得焦点
- document.hasFocus() 查看是否获得了焦点
HTMLDocument的变化
- readyState属性
值:loading complete
- compatMode属性
兼容模式。告诉开发人员浏览器选择哪一种渲染模式。
- head属性
document.head属性
字符集属性
- charset属性
- defaultCharset属性
自定义数据属性
前缀加上data-以符合规范。
插入标记
- innerHTML属性
innerHTML的值会被解析为DOM树。
大多数浏览器插入script后并不会执行其中的脚本,因为它被视为无作用域的元素。需要用有作用域的元素包裹起来。
div.innerHTML="";
-
outerHTML属性
读模式,返回调用它的元素极其所有子节点。
写模式,根据指定的HTML元素创建新的DOM树,然后完全替换掉调用的元素。
-
insertAdjacentHTML()方法
接受两个参数:插入的位置和要插入的HTML文本。
第一个参数取值范围:
“beforebegin”:在当前元素之前插入一个紧邻的同辈元素。
“afterbegin”:成为当前元素的第一个子元素。
“beforeend”:成为当前元素的最后一个子元素。
“afterend”:在当前元素之后插入一个紧邻的同辈元素。
-
内存与性能问题
这个节点替换方法可能会导致浏览器的内存占用问题。
使用innerHTML,outerHTML,insertAdjacentHTML()时,最好手工删除要被替换的元素的所有事件处理程序和js对象属性。因为这些绑定关系是不会自动删除的,会占用内存。
scrollIntoView()方法
解决滚动页面的问题。可以在所有元素上调用,通过滚动浏览器窗口或某个容器元素,调用元素就可以出现在视口中。
4 专有拓展
一些还没写进标准的东西。
文档模式
children属性
contains()方法
检查当前节点是不是另一个节点的父亲。
ch12 DOM2和DOM3
1.1 DOM变化
1.2 样式
检查是否支持DOM2级的CSS:
var supportDOMCSS2=document.implementation.hasFeature("CSS2","2.0");
1.2.1 访问元素的样式
style对象
CSSStyleDeclaration的实例
包含着通过HTML的style属性指定的样式信息,不包括外部样式表或嵌入样式表的内容
css属性中的短横线在这里转换为驼峰大小写形式。
特殊:float转换为cssFloat
style对象的属性和方法
- cssText
css代码
- length
css属性的数量
- parentRule
表示CSSRule的对象。
- getPropertyCSSValue(PropertyName)
- getPropertyPriority(PropertyName)
如果属性使用了!important,则返回important,否则返回空字符串
- getPropertyValue(propertyName)
返回给定属性的字符串值。
- item(index)
返回指定位置上的css属性的名称。
- removeProperty(propertyName)
从样式中删除给定属性。
- setProperty(propertyName,value,priority)
计算的样式
- getComputeStyle()
两个参数,元素和一个伪元素字符串,若后者为空,输入null即可。
返回一个CSSStyleDeclation对象
1.2.2 操作样式表
styleSheets对象的属性
- disabled
- href
- media
- ownerNode
- parentStyleSheet
- title
- type
- cssRules
- ownerRule
- deleteRule
- insertRule
应用于文档的所有样式表是通过document.styleSheets集合来表示的。
length可以获取数量,item()方法获取每一项。
CSS规则
CSSRule对象表示样式表中的每一条规则。
1.2.3 元素大小
1.3 遍历
1.4 范围