我的JavaScript学习笔记(二-JavaScript对象)

四、浏览器对象模型[BOM]详解

1、浏览器对象概念

   BOM即提供与浏览器交互的方法和接口。原本是用来处理浏览器窗口和框架,但是很多js扩展也算作BOM的一部分。例如:弹出窗口、移动缩放、关闭窗口,navigator对象、location对象、screen对象,对cookies的支持等。

2、窗口对象window-----顶级对象

BOM的核心对象是window,表示浏览器的一个实例。浏览器环境下,window对象就担当了global对象的角色。

注:在window对象上定义的属性和直接定义的全局属性个点差别。

例如:

var age = 29;
window.color="red";
console.log(delete window.age);  //false
console.log(delete window.color); //true
//直接用var 定义的全局属性,其属性的[[configuration]]特性值被设置为false,所以这样定义的属性不可以通过delete操作符删除。

<1>window对象常见属性

属性

说明

closed

表明窗口是否关闭的布尔值

defaultStatus

表示窗口状态栏中的默认状态信息

documnent

表示窗口中显示的当前文档对象

frames

表示窗口中包含的所有的frame对象数组

history

窗口最近访问的URL列表

length

表示当前文档中的框架个数

location

表示窗口中当前显示的URL

name

表示窗口的名称

opener

表示打开当前窗口的窗口

parent

表示当前窗口的上一级窗口

self

表示当前窗口

status

表示窗口状态中的临时信息

top

表示一系列嵌套窗口中的最上层窗口(框架)

 

窗口位置:
window.screenLeft/screenTop   火狐不支持/IE、safari、Opera、Chrome支持
window.screenX/screenY            IE9+ 及其它均支持
例如:var leftPos = (typeof window.screenLeft == 'number') ? window.screenLeft : window.screenX
窗口大小:
window.innerWidth/innerHeigh          //可视区域大小,浏览器缩放,值会改变,IE需9+
window.outerWidth/window.outerHeight  //整个浏览器的窗口大小,缩放值会改变
另外:
document.documentElement.clientWidth/document.documentElement.clientHeight    //可视区域大小,浏览器缩放,值会改变(与上面的innerWidth类似)
document.body.clientWidth/document.body.clientHeight  //Body区域大小,调试看布局,比较清晰

<2>window对象常用方法

      Window.open(“url”)   打开窗口

      Window.close()         关闭窗口

      window.moveTo(100,100) 将当前浏览器窗口移到屏幕坐标(100,100)

      window.moveBy(左/右,上/下) 正数右、上,负数左、下

      window.resizeTo(x,y) 调整窗口大小

      window.alert()   弹出对话框

      window.prompt()  提供文本输入窗口var answer = prompt(“内容”)

      window.confirm() 提供确认取消对话框

      window.setTimeout()  指定毫秒后执行

      window.setInterval()  每个一段毫秒数执行

注:window.moveTo/window.moveBy、window.resizeTo/window.resizeBy   IE中可以有效果,但是其他可能被浏览器禁用了,

例如:以频道模式开新页面:window.open("DOM2.html","_blank","channelmode")

2、文档对象(document)

DOM是一种将XML或者HTML文档解析成树形节点的方法。通过DOM的方法与属性,我们就可以访问页面中的任何元素,进行元素的增删改等操作。DONM是一套独立的API体系,不仅仅在js中有相关实现,其他语言中也有。

DOM树中的每一个节点都是一个对象,这些对象都是由一些构造器函数来创建的。例如:head标签是由HTMLHeadElement()负责创建的。DOM既能解析XML文档,也能解析HTML文档,HTML可以当做是一种特殊的XML文档。DOM Level1中用于解析XML的那部分称Core DOM,在这基础上扩展的那部分成为HTNL DOM。HTML DOM 并不适用于所有的XML文档,它只适用于HTML文档。

在DOM中,节点的类型有12种,每种类型分别用一个整数来表示(用nodeType查看)。

3、浏览器对象(navigator)

      Navigator是一个用于反映浏览器本身及其功能信息的对象。

例如:区分浏览器:

   If(navigator.userAngent.indexOf(‘MSIE’) !== -1{

       //this is IE

   }else{

        //not IE

   }

      navigator.appName   浏览器名称

      navigator.cookieEnable  表示cookie是否启用

      navigator.onLine    表示浏览器是否连到了因特网   

      navigator.vendor    表示浏览器的品牌

      navigator.plugins   返回插件对象数组

4、屏幕对象(screen)

      screen.colorDepth  显示器的色位  

      screen.width       屏幕宽度

      screen.height      屏幕高度

      screen.availWidth  屏幕宽度-系统部件宽度

      screen.availHeight 屏幕高度-系统部件高度

5、位置对象(location)

      location属性是一个用于存储当前载入页面URL信息的对象。

      location.href   显示的是完整的URL

      location.hostname   显示的是相关的域名信息

      location.search   返回url的查询字符串以?开始

      location.reload() 重新载入某个页面

      location.replace(“url”)

      设置为顶层:top.localtion =self.location

6、历史对象(history)

  包含了用户已浏览的 URL 的信息

  history.length   之前访问多少页面

  history.forward() 前进到之前访问的页面

  history.back()    后退到上次访问的页面

  history.go(-1)    -1表示后退一页,-2后退两页,0重新载入当前页

7、框架对象(window.frames)

  表示当前页面中所有frame元素集合,无论页面有无frame。Window.frames总是存在

五、文档对象模型[DOM]详解

1、DOM概念

   文档对象模型,即提供访问和操作网页内容的方法和接口。是针对XML但是经过扩展用于HTML的API(应用程序编程接口),DOM把整个页面映射为一个多层节点结构。

2、DOM树结构

注:属性节点不属于子节点。

* 节点

  每一个HTML标签都是一个元素节点。

  标签中的文本则是文本节点。

  标签的属性是属性节点。

document类似于一个虚拟的顶层节点。它下面包含了很多子节点。document对象是HTMLDocument(这个又继承自Document类型)的一个实例,表示整个HTML页面。

3、document对象的属性

属性

说明

alinkColor

表示活动超链接的颜色

all

表示文档中所有html标记的数组

anchors

所有锚的数组,锚是指带有name属性的A元素

applets

文档中所有的java小程序

bgcolor

文档的背景颜色

cookie

文档相关的cookie

domain

文档的服务器域

embeds

文档中嵌入对象的数组

fgColor

文档的前景色

forms

文档中所有的表单数组

images

文档中所有的图像的数组

lastModified

文档最后修改的日期

linkColor

未被访问的超链接颜色

referrer

链接到当前文档的URL

title

文档的标题

URL

文档的URL

vlinkColor

已被访问的超链接颜色

link

所有带有href的A或area对象

4、document对象的方法

方法

说明

close()

关闭文档输出流,调用此方法之前没有被显示到页面中的输入内容被显示出来

open(mimeType)

为放置到文档中的数据打开一个流

write(value1,value2...)

作为字符串添加到文档中

writeln(value1,value2)

与write不同之处在于会在最后一个参数换行

其他方法

  1. 操作元素方法(获取:getElementById等;创建

                createElenent(tag)等)

2、处理键盘事件(keydown、keypress、keyup)

3、处理鼠标事件(click、dblclick、mousedown、mouseup)

 

5、核心Document对象详细

<1>document.documentElement属性

document.documentElement属性是访问文档根元素的快捷方式。对于在浏览器中呈现的HTML文档而言,所谓的根元素就是<html>标签。

所有浏览器都支持:document.documentElement和document.body

<2>使用Document对象的方法查找Element对象

getElementById、getElementsByName、getElementsByTagName、getElementsByClassName[这是html5中新增的方法]

<3>使用Document对象的方法创建节点

createElement(tagName):创建元素节点

createTextNode(data):创建文本节点

createAttribute(name):创建属性节点

<4>核心Element对象

* 操纵Element对象的属性

  获取属性:getAttribute(name)方法

  设置属性:setAttribute(name,value)方法

  删除属性:removeAttribute(name)方法

  获取属性节点:getAttributeNode(name)方法

  设置属性节点:setAttributeNode(name,value)方法

  删除属性节点:removeAttributeNode(name)方法

<5>节点名称、值和类型

* nodeName:其内容是给定节点的名字 例如:document.all[0].nodeName->HTML

如果节点是元素节点,nodeName返回这个元素的名称。

如果是属性节点,nodeName返回这个属性的名称。

如果是文本节点,nodeName返回一个内容为#text的字符串。

* nodeType:返回一个整数,这个数值代表者给定节点的类型

Node.ELEMENT_NODE --1 --元素节点

Node.ATTRIBUTE_NODE --2 --属性节点

Node.TEXT_NODE --3 --文本节点

Node.CDATA_SECTION_NODE  --4

Node.ENTITY_REFERENCE_NODE  --5

Node.ENTITY_NODE  --6

Node.PROCESSING_INSTRUCTION_NODE  --7

Node.COMMENT_NODE  --8

Node.DOCUMENT_NODE  --9

Node.DOCUMENT_TYPE_NODE  --10

Node.DOCUMENT_FRAGMENT_NODE  --11

Node.NOTATION_NODE  --12

* nodeValue:返回给定节点的当前值(字符串)

如果给定节点是一个属性节点,返回值是这个属性的值。

如果给定节点是一个文本节点,返回值是这个文本节点的内容。

如果给定节点是一个元素节点,返回值是null。

例如:

var oDiv = document.getElementById('a1'); //获取元素对象

var oAttr = oDiv.getAttributeNode('id'); //获取属性对象

console.log(oDiv.nodeName);  //DIV  (nodeType --1)

console.log(oAttr.nodeName); //id   (nodeType --2)

<6>父节点、子节点和同辈节点

父节点:parentNode

      parentNode属性返回的节点永远是一个元素节点,因为只有元素节点才有可能包含子节点。

      document节点没有父节点。Children兼容版的ChildNodes

子节点:

     ChildNodes:获取指定节点的所有子节点结合。(有兼容性问题:火狐和IE)

     firstChild:获取指定节点的第一个子节点。

     lastChild:获取指定节点的最后一个子节点。

同辈节点:

     nextSibling:返回一个给定节点的下一个兄弟节点。

     previousSibling:返回一个给定节点的上一个兄弟节点。

 

<7>节点属性
节点属性attributes是Node接口定义的属性。

节点属性attributes就是节点(特别是元素节点)的属性。

事实上,attributes中包哈你的是一个节点的所有属性的集合。

attributes.getNameItem()和Element对象的getAttribute()方法类似。

<8>检测子节点和属性

* 查看是否存在子节点:hasChildNodes()

* 查看是否存在属性:hasAttributes()

* 即使节点中没有定义属性,其attributes属性仍然有效,而且长度值为0。同样节点中的childNodes属性也是如此。

* 当你想知道某个节点是否包含子节点和属性时,可以使用hasChildNodes()和hasAttributes()方法。但是,如果还想知道该节点中包含多少节点和属性的话,仍要使用attributes和childNodes属性。

* 在IE浏览器中,不存在hasAttributes()方法。

<9>操作DOM节点树

* 插入节点

  appendChild()方法:插入到最后面

  insertBefore(参数1:节点,参数2:谁之前)方法

  没有insertAfter方法

* 删除节点:removeChild()方法

* 替换节点:replaceChild()方法

<10>复制和移动节点

复制节点:cloneNode(boolean)方法,其中,参数boolean是判断是否复制子节点。

移动节点:由一下三种方法组合完成

* 查找节点

  getElementById,getElementsByName,getElementsByTagName,

 getElementByClassName

* 插入节点

  appendChild,insertBefore

* 替换节点 

  replaceChild

<11>innerHTML、testContent、innerText

innerHTML浏览器几乎都支持该属性,但不是DOM标准的组成部分。

innerHTML属性可以用来读、写给定元素里的HTML内容。

innserHTML属性多余div或span标签配合使用。

例如:在一个<div id="d"></div>插入一个<h1>今天</h1>元素,如果利用前面的知识,要创建节点,并且创建文本节点、添加子节点等操作。用innerHTML则只要一条语句document.getElementById("d").innerHTML = "<h1>今天</h1>"。

textContent      --标签内文本内容(不含标签)部分低版本ie不支持

innerText        --标签内的文本(不含标签)

<12>其他

文档碎片:document.createDocumentFragment 理论上可以提高DOM操作性能

6、form对象常用属性和方法

属性或方法

说明

action

表单提交执行的动作,相当于form班级的action属性

elements

表单中所有控件元素的数组,elements[0]取得表单第一个控件

encoding

表单数据的编码类型,相当于form标记符的enctype属性

length

表单中元素的数目

method

发送表单的http方法,相当于form标记符的method属性

name

表单的名称,相当于form标记符的name属性

onReset

当用户单击重置按钮是触发,执行相应的脚本代码

onSubmit

当用户单击提交按钮是触发,执行相应的脚本代码

reset()

重置,相当于单击表单中的重置按钮

submit()

提交表单,相当于单击表单在的提交按钮

target

相当于form标记符的target属性:_blank/_parent_self/_top

enctype

请求的编码类型

下拉框:selectedIndex  获取下拉框选中的下标

        Options[selectedIndex].value 获取下拉框选中的值

7、文档对象引用方法

注:由于window对象时默认的最上层对象,因此引用它的子对象时,可以不用window。

方式一:通过这四个方法getElementById、getElementsByName、getElementsByTagName、getElementsByClassName

方式二:使用对象索引。例如:document.forms[0]

        返回集合常见的有:document.images、document.applets、

         document.links、document.anchors、document.forms

方式二:使用对象名称。例如:document.forms[“form1”]、document.images[“img1”]....

       另外特殊的多数在表单中应用:document.form1.my*

注:form1可以是name名称也可以是id名称。如果表单名称为form1,表单中包含了一个名称为myText的文本框,则可以使用document.form1.myText来引用该文本对象。

方式三:特殊方法,elements数组或者document对象的all属性。

        通过all属性访问html元素有三种方法:

  1. 通过索引或名称直接引用 document.all[索引] /document.all[“name名称”]
  2. 使用item()方法:document.all.item(“test”) 取到所有的name名称为test或者id为test的元素对象的一组对象。[返回数组]

(3)使用tags()方法:document.all.tags(“tagName标签名”)[返回数组]

方式四:借助子节点、父节点、同辈节点去访问其他节点

8、DOM扩展

Selectors API 是由W3C发起指定的一个标准,致力于让浏览器原生支持CSS查询。Selectors API Level1核心两个方法:querySelector()和querySelectorAll()。这个支持:IE8、Firefox3.5+、Safari3.1+、Chrome和Opera10+.

注:若是浏览器不支持querySelector()和querySelectorAll()会抛出错误

<1>querySelector()    返回一个匹配的元素。

    该方法接收一个CSS选择符,如果没有匹配到元素,返回null

例如:

取得body元素:var body = document.querySelector(‘body’);

取得Id为myDiv的元素:var myDiv= document.querySelector(‘#myDiv’);

取得类为selected的第一个元素:var s = document.querySelector(‘.selected’);

<2>querySelectorAll() 返回所有匹配的元素

例如:取得某div中的所有<em>元素:[类似于:getElementsByTagName(‘em’)]

 var body = document.getElementById(‘myDiv’).querySelectorAll(‘em);

  //取得所有<p>元素中的所有<strong>元素

  var strongs = document.querySelectorAll(‘p strong’);

<3>classList属性

     Html中新增,目前IE浏览器并不支持。支持的有:Firefox3.6+和Chrome

例如:我们在定义class属性时,常会见到这种的:

<div id="mydiv" class="c1 c2 c3 c4"></div>

<script>

  var classList = document.getElementById('mydiv').classList;

   for (var i=0;i<classList.length;i++) {

      alert(classList[i]); //c1 c2 c3 c4

   }

</script>

    classList属性时新集合类型DOMTokenList的实例。有length属性和item()方法。其他方法:add(value)、contains(value)、remove(value)、toggle(value)

<4>元素遍历

ElementTraversal API为DOM元素操作添加了下面5个属性:

childElementCount:返回子元素的个数(不包括文本节点的和注释)

firstElementChild:指向第一个子元素

lastElementChold:指向最后一个子元素

previousElementSibling:指向前一个同辈元素

nextElementSibling:指向后一个同辈元素

<5>焦点管理

Html5也添加了辅助管理DOM焦点的功能:document.activeElement属性

默认情况下,文档刚刚加载完成时,document.activeElement中保存的是document.body元素的引用。文档加载期间值为null.另外还新增了hasFocus()方法,监测文档是否获得了焦点。

例如:var button = document.getElementById(‘mybutton’);

       button.focus();

      alert(document.activeElement === button)  //true

     alert(document.hasFocus())  //true

<6>HTMLDocument的变化

①redyState属性

IE4最早为document对象引入了readyState属性。Html5吧这个属性纳入了标准当中。readyState属性有两个值:loading  正在加载文档 complete 已经加载完成文档

②兼容模式compatMode属性

③head属性

前有document.body引用文档的body元素。Html5新增了document.head属性。

④字符集属性

Html5新增document.charset设置字符集

⑤插入标记

innerHTML  已纳入HTML5规范。(标签里面的所有内容,不包括标签本身)

outHTML    会包括目标标签在内。

insertAdjacentHTML(参数,插入的内容)  新增方法。该方法有四个参数:

           beforebegin:在当前元素之前插入紧邻的同辈元素

           afterbegin:在当前元素之下或第一个子元素之前

           beforeend:在当前元素之下或最后一个子元素之后

           afterend:当前元素之后插入紧邻的同辈元素

⑥scrollIntoView()方法

如何滚动页面也是DOM规范没有解决的一个问题。HTML5最终选择了scrollIntoView()作为标准方法。

<7>自定义数据属性

例如:
   

<div id="myDiv1" data-appId ="1" data-myname="Mike"></div>   

<div id="myDiv2" myname="Mike"></div>

<script>

      var oDiv1 = document.getElementById('myDiv1');

      var oDiv2 = document.getElementById('myDiv2');

      console.log(oDiv2.myname);  //undefined 取不到

      console.log(oDiv1.dataset.myname); //Mike   取到了自定义属性值

</script>

<8>HTML5新增表单验证

9、专有扩展

<1>children 属性

   与childNodes没什么区别

<2>contains()方法

<3>innerText属性、outerText属性

<4>滚动

scrollIntoViewIfNeeded(alignCenter)作用于浏览器窗口或者容器元素

scrollByLines(lineCount)将元素的内容滚动指定的行高

scrollByPages(pageCount)将元素的内容滚动指定的页面高度

10、DOM2和DOM3

<1>命名空间

<2>style对象

    属性:

    cssText:访问到style特性中的css代码。

    例如:div.style.cssText=“width:20px;height:20px”;

    length:应用给元素的css属性的数量。

    parentRule:表示CSS信息的CSSRule对象

    getPropertyCSSValue(propertyName):给定属性值的CSSValue对象

     [object CSSPrimitiveValue],这个对象有

     cssText(输出属性值)、cssValueType(属性名)

    getPropertyProority(propertyName):如果属性使用了!Important返

                       “important”;否则返回空字符串。

    getPropertyValue(propertyName):返回给定属性的字符串值。这个比

                        getPropertyCSSValue用的多。

    item(index):返回给定位置的css属性名称(结合length遍历)

    removeProperty(propertyName):从样式中删除给定的属性。

    setProperty(propertyName,value,priority):将给定的属性设置为相

                        应的值,并加上“important”或者“”字符串。

<3>操作样式表

    CSSStyleSheet继承自StyleSheet、CSS规则

<4>偏移量、客户区大小、滚动大小

      偏移量:元素的可见大小

      offsetHeight:元素垂直方向高度,包括边框像素。

      offsetWidth:元素在水平方向上宽度,包括边框像素。

      offsetLeft:元素的外边框距离做左内边框的像素。

      offsetTop:元素的外边框距离做上内边框的像素。

      客户区大小:元素(内边距)空间大小

      clientHeight:元素(内)空间高度。

      clientWidth:元素(内)空间宽度。

      滚动大小:

      ScrollHeight:在没有滚动条的情况下,元素的总高度

      scrollWidth:在没有滚动条的情况下,元素的总宽度

      scrollLeft:被隐藏在内容区域左侧的像素

      scrollTop:被隐藏在内容区域上方的像素

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

穆瑾轩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值