BOM和DOM

Day 01

正课:

1.什么是DOM:

2.DOM Tree

3.遍历DOM:

 

1.什么是DOM:

 原生js=ECMAScript(核心语法)+

        DOM(专门操作网页内容的API)+ 3

        BOM(专门操作浏览器窗口的API)+ 2

 DOM: Document Object Model

      专门操作网页内容的API

 DOM标准: W3C 规定了操作一切结构化文档的API

  核心DOM: 操作一切结构化文档(包括HTMLXML)的通用API

         万能,但繁琐

  HTML DOM: 专门操作HTML文档的简化版API

         只对部分常用的API提供了简化

         不是万能

  XML DOM: 专门操作XML文档的API

 

  鄙视题: HTML XHTML DHTML XML

   HTML:专门编写网页内容的语言

   XHTML: 更严格的HTML标准

   DHTML: 一切实现动态网页效果的技术统称

     DHTML=HTML+CSS+JS

   XML: 可扩展的标记语言

       语法同HTML,但标签可自定义

       专门用于持久保存或在网络中传输结构化数据

    <student>

      <name>杨幂</name>

      <math>81</math>

      <chs>56</chs>

    </student>

    JSON: JavaScript Object Notation

    '{"name":杨幂,"math":81,"chs":56}'

 

  DOM可执行的操作:

   ***查找 修改 添加 删除

 

2. ***DOM Tree:

  什么是DOM:

    网页中一切内容在内存中都是以树形结构组织在一起的。

  网页加载过程:

    当接收到HTML文档时:

      创建一个树根节点:document对象

    读取HTML内容时:

      每读取一项内容就创建一个节点对象

      将节点对象挂到document

  网页中的一切内容都是一个节点对象:

 

  节点对象:Node

   三大属性:

     nodeType:节点类型:

       document: 9

       element: 1

       attribute: 2

       text: 3

      何时: 辨别获得的节点类型时

     nodeName: 节点名:

       document: #document

       element: 标签名(全大写)

        何时: 辨别元素的具体标签名

       attribute: 属性名

       text: #text

     nodeValue: 节点值:

       document: null

       element: null

       attribute: 属性值

       text: 文本内容

 

  节点间关系:

  节点树: 包含所有html内容的DOM

    1. 父子关系:

      parentNode: 父节点

      childNodes: 所有直接子节点

返回一个动态集合-类数组对象

      firstChild: 第一个子节点

      lastChild: 最后一个子节点

    2. 兄弟关系:

      nextSibling: 下一个兄弟

      previousSibling: 前一个兄弟

   何时使用:

     已经获得一个节点,要找它周围的相邻的节点。

   问题: 容易受看不见的空文本干扰

   解决: 如果只需要获取元素,而不关心文本,可用元素树

  元素树: 仅包含元素节点的树结构

      强调: 不包含一切文本节点

  1. 父子关系:

      parentElement: 父元素

      children: 所有直接子元素

返回一个动态集合-类数组对象

      firstElementChild: 第一个子元素

      lastElementChild: 最后一个子节点

    2. 兄弟关系:

      nextElementSibling: 下一个兄弟

      previousElementSibling: 前一个兄弟

  问题: 浏览器兼容性: IE9+

 

3.遍历节点:

  2:

  1. 先定义函数仅遍历直接子节点

  2. 对每个直接子节点应用和父节点相同的操作

  算法: 深度优先遍历

  

  childNodeschildren:

   live collection(动态集合):

    不实际存储节点的完整属性

   问题:每次访问集合时,都会重新查找DOM

   遍历:

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

    造成反复查找DOM

   解决:

for(var i=0,len=childNodes.length;i<len;i++)

 

   问题:递归的效率低

   解决:用遍历API+循环

   遍历API:

   1. 节点迭代器:

     按照深度优先的原则,逐个返回每个子节点。

     何时: 只要按照深度优先的顺序,遍历所有子代节点时。

     如何:2:

      1.用指定父元素创建节点迭代器对象:

      var iterator=

document.createNodeIterator(

          parent,NodeFilter.SHOW_ALL,

                           .SHOW_ELEMENT

          null,false

        );

      2.反复调用iteratornextNode方法

         返回正在遍历的当前节点对象

         直到返回null为止

     

   2.TreeWalker:

     比节点迭代器更灵活的API:

     基本用法和NodeIterator一样

     只不过扩展了:

      walker.parentNode()

      walker.firstChild();

      walker.lastChild();

      walker.nextSibling();

      walker.previousSibling();

    如何: 2:NodeIterator

 

*******************************************************************************

Day 02

回顾:

1. DOM:

   节点对象: Node

      nodeType

          document: 9

          element: 1

          attribute: 2

          text:3

      nodeName

          document: #document

          element: 标签名(全大写)

          attribute: 属性名

          text: #text

      nodeValue

          document: null

          element: null

          attribute: 属性值

          text: 文本内容

 

   节点间关系:

     节点树:

     1. 父子关系:

        elem.parentNode

        elem.childNodes (live collection)

        elem.firstChild

        elem.lastChild

     2. 兄弟关系:

        elem.previousSibling

        elem.nextSibling

     元素树:

     1. 父子关系:

        elem.parentElement

        elem.children (live collection)

        elem.firstElementChild

        elem.lastElementChild

     2. 兄弟关系:

        elem.previousElementSibling

        elem.nextElementSibling

 

   遍历:

   1. function getChildren(parent){

          //输出parent

          var children=parent.childNodes;//children

          for(var i=0,len=children.length;i<len;i++){

getChildren(children[i]);

          }

       }

   2. 遍历API:

      NodeIterator:

        var iterator=document.createNodeIterator(

             parent,NodeFilter.SHOW_ALL, null, false

                                          .SHOW_ELEMENT

        );

        var curr=iterator.nextNode();//获得下一个节点

        while((curr=iterator.nextNode())!=null){

            //curr就是当前节点

        }

 

      TreeWalker:

       var walker=document.createTreeWalker(

             parent,NodeFilter.SHOW_ALL, null, false

                                          .SHOW_ELEMENT

        );

       基本用法同iterator,外还扩展了:

         walker.parentNode();

         walker.firstChild();

         walker.lastChild();

         walker.nextSibling();

         walker.previousSibling();

 

正课:

1. ***查找:

   1. 利用节点间关系查找周围的元素

   2. HTML属性查找:

       id:  var elem=document.getElementById("id");

          只能找到一个元素

          如果没找到,返回null

          强调: 必须用document调用。

       按标签名:  

           var elems=

parent.getElementsByTabName("标签名");

           在指定父元素parent下查找指定标签名的元素

           返回live collection

           强调: 查找所有子代节点

       name:

           var elems=

                parent.getElementsByName("name");

           在指定父元素parent下查找指定name属性的元素

           返回live collection

       class:

           var elems=

               parent.getElementsByClassName("class");

           在指定父元素parent下查找指定class属性的元素

           返回live collection

 

       如果getElementsXXX没找到,返回空集合[]

 

  3. 用选择器查找:

       1. 只查找一个符合选择器要求的元素:

          var elem=parent.querySelector("selector");

如果没找到,返回null

       2. 查找多个符合选择器要求的元素:

          var elem=parent.querySelectorAll("selector");

                如果没找到,返回空集合[]

      强调: 返回no-live collection:

            包含完整属性的集合,反复访问不会导致重复查找DOM

 

   鄙视题: getXXX vs querySelector

    1. 执行效率:

        如果通过一个属性即可找到的元素

             getXXX更快  返回live collection

             querySelector 更慢  no-live collection

    2. 代码量:

        如果需要通过多次查找才能获得想要的元素时

             querySelector 更简单

             getXXX 繁琐

 

  4. VIP通道:

     document.body

     document.head

     document.documentElement : html

 

 

回顾:

1. 查找:

   1. 节点间关系:

      节点树:

      1. 父子关系:

        parentNode

        childNodes

        firstChild

        lastChild

      2. 兄弟关系:

        previousSibling

        nextSibling

     元素树:

      1. 父子关系:

        parentElement

        children

        firstElementChild

        lastElementChild

      2. 兄弟关系:

        previousElementSibling

        nextElementSibling

 

   2. html属性找:

      document.getElementById()

      parent.getElementsByTagName();

      parent.getElementsByName();

      parent.getElementsByClassName();

   3. 按选择器查找:

      parent.querySelector();

      parent.querySelectorAll();

   4. VIP通道:

      document.body

      document.head

      document.documentElement - html

 

正课:

1. 修改:

   内容:

   属性: 标准、自定义

   样式: 内联样式、内/外部样式表

 

1. 修改内容:

   elem.innerHTML: 元素开始标签到结束标签之间的html内容

   elem.textContent: 元素开始标签到结束标签之间的文本内容

                                 去掉html标签

      IE8.innerText

 

  练习: 技巧: 如果遍历过程中会删除数组的元素,则要从后向前反向遍历。

  

2. 访问或操作元素的属性:

    标准属性:

       核心DOM: 万能

            1. 访问属性节点对象:

                var node=elem.attributes[i/"属性名"];

                var node=elem.getAttributeNode("属性名");

                      node.value->获得属性值

            2. 获得属性值:

                var value=elem.getAttribute("属性名");

            3. 修改属性值:

                elem.setAttribute("属性名","");

            4. 移除属性:

                elem.removeAttribute("属性名");

            5. 判断是否包含指定属性:

                var bool=elem.hasAttribute("属性名");

 

       HTML DOM: html标准属性封装到了元素对象中

           elem.属性名

           问题: 仅能访问HTML标准属性

 

    自定义属性:

       核心DOM: 万能

       HTML5 规定:

         1, 定义自定义属性时: data-属性名=""

         2, 读取自定义属性: elem.dataset.属性名

 

    property   vs  attribute

     显式写在开始标签中的: attribute

        强调: getAttribute只能获得在页面上显式定义的属性值

     在内存中对象里保存的: property

        标准属性: 既是property也是attribute

        自定义属性: 只是attribute

 

     input type="checkbox" 要获得选中状态checked

          不能用getAttribute,一定要用elem.checked

*******************************************************************************

Day 03

回顾:

1. ***查找:

  1. 节点间关系:

     节点树:

      1. 父子关系:

        parentNode

        childNodes

        firstChild

        lastChild

      2. 兄弟关系

        previousSibling

        nextSibling

    元素树:

      1. 父子关系:

        parentElement

        children

        firstElementChild

        lastElementChild

      2. 兄弟关系

        previousElementSibling

        nextElementSibling

  2. HTML查找:

      id: document.getElementById();

      按标签名: parent.getElementsByTagName();

      name: parent.getElementsByName();

      class: parent.getElementsByClassName();

  3. 按选择器:

      找一个: parent.querySelector()

      找多个: parent.querySelectorAll()

  4. VIP:

      document.body

      document.head

      document.documentElement

2. 访问属性:

   标准属性:

       核心DOM:

         1. 获得属性值: getAttribute("属性名")

         2. 设置属性值: setAttribute("属性名",)

         3. 移除属性: removeAttribute("属性名")

         4. 判断是否包含: hasAttribute("属性名")

       HTML DOM:

          elem.属性名

 

   自定义属性:

      核心DOM:

      HTML5: 1. 定义时: data-属性名=""

                   2. 访问时: elem.dataset.属性名

     

    property  vs  attribute

   

正课:

1. 修改:

   样式: 内联样式, /外部样式表

2. 增加和删除:

   

1. 修改样式:

   访问内联样式:  

       修改样式: elem.style.css属性名

       获取样式: 问题: 仅能访问内联样式

                  解决: var style=getComputedStyle(elem)

                               style.css属性名 ——只读

          其中,css属性名都要去横线,变驼峰:

           比如: background-color:  backgroundColor

                    list-style-type: listStyleType

    问题: 一条语句只能修改一个样式

    解决: 将一套样式,放入class

             用程序操作class

 

    课堂练习:

       获得焦点onfocus: 元素从不可操作到可操作的状态变化

       失去焦点onblur: 元素从可操作变回不可操作的变化

 

   修改内/外部样式表中的属性:

     1. 获得样式表对象: var sheet=document.styleSheets[i]

     2. 获得cssRule对象: var rule=sheet.cssRules[i];

        特殊: rule是一个keyframes:

            var subRule=rule.cssRules[i]

     3. 修改cssRule中的属性: rule.style.css属性名=

 

   Chrome: 不允许sheet对象访问本地的css样式表文件

    

 

正课:

1. 添加和删除:

2. ***HTML DOM常用对象:

   Image    Select       Table       Form

                    Option

  

 

1. 添加和删除:

   添加: 3:

    1. 创建空元素对象:

        var a=document.createElement("a");

        相当于: <a></a>

    2. 设置元素的关键属性:

        a.href="http://tmooc.cn"

        a.innerHTML="go to tmooc";

    3. 将元素挂到指定父元素下:

        末尾追加: parent.appendChild(a);

        插入: parent.insertBefore(a,old);

        替换: parent.replaceChild(a,old);

 

***优化: 尽量少的操作DOM:

  html->DOM Tree

                   ↓

              Render Tree->layout->paint

                   ↑

  css->cssRules

   如何: 1. 如果同时添加父元素和子元素,要在内存中先将所以子元素添加到父元素下,将父元素一次性加入DOM

          2. 如果同时添加多个平级子元素,要先将平级子元素加入文档片段,再将文档片段整体加到页面。

 

   练习: select元素: onchange事件: 选中项发生改变时触发

                         selectedIndex属性: 当前选中项的下标

 

   文档片段: 内存中临时存储多个平级子元素的虚拟父元素

      何时: 添加多个平级元素时,都要先将子元素追加到文档片段中缓存,再将文档片段一次性添加到页面的父元素下

      如何: 3:

       1. 创建文档片段:

         var frag=document.createDocumentFragment();

       2. 将平级子元素,先追加到frag: 用法同普通父元素

       3. 将文档片段,整体添加到页面

 

   删除: parent.removeChild(child);

       child.parentNode.removeChild(child);

 

2. HTML DOM常用对象:

Image: <img />

    创建: var img=new Image();

 

Select: <select>

    属性:

       selectedIndex:  当前选中项的下标

       options: 获得select下所有option元素的集合

          Option:<option>

创建: var opt=new Option(text,value);

                    相当于: var opt=

document.createElement("option");

                                opt.innerHTML=text;

                                opt.value=value;

                属性: indextextvalueselected

 

       value: 如果选中项有value,则selectvalue等于选中项的value

如果选中项没有value,则selectvalue等于选中项的内容

    方法:

       add(option): select下追加一个option对象

           appendChild(option)

       remove(i): 移除selecti位置的option

    事件: onchange: 当选中项发生改变时触发

 

*******************************************************************************

Day 04

回顾:

1. 添加和删除:

  添加: 3:

    1. var a=document.createElement("a")

    2. 设置关键属性

    3. 将元素添加到DOM:

       parent.appendChild(a);

       parent.insertBefore(a,old);

       parent.replaceChild(a,old);

 

  优化: 尽量少的操作DOM树,避免反复layout

    1. 如果同时添加父元素和子元素,应在内存中先将子元素拼到父元素下,再将父元素一次性添加到DOM

    2. 如果同时添加多个平级子元素,应先将所有子元素放入文档片段,再将文档片段一次性添加到DOM

 

    文档片段:

      1. var frag=document.createDocumentFragment();

      2. frag.appendChild(child);

      3. parent.appendChild(frag);

 

  删除: parent.removeChild(child);

     child.parentNode.removeChild(child);

 

2. HTML DOM常用对象:

   Image: var img=new Image();

   

   Select:

     属性: selectedIndex,   options,   value

     方法: add(opt),   remove(i)

     事件: onchange

   Option:

     创建: var opt=new Option(text,value)

 

正课:

1. HTML DOM常用对象:

   Table   

      tHead:

         var thead=table.createThead();

         table.deleteThead();

         rows:

             var tr=thead.insertRow(i);

                   //省略i,表示末尾追加

             thead.deleteRow(i);

                   //i不能省略

             cells:

               var td=tr.insertCell(i);

                   //省略i,表示末尾追加

               tr.deleteCell(i)

      tBodies

         tBody:

         var tbody=table.createTBody();

         //没有table.deleteTBody!

      tFoot: tHead

         

   Table.rows:

      table.insertRow(i);

      table.deleteRow(i);

 

   row.rowIndex: 标识row在整个表中的下标位置

      table.deleteRow(row.rowIndex)

 

   强调: 所有creatxxx/insertxxx方法都会自动将新元素添加到父元素下,不需要appendChild

 

   练习: 确认框: confirm   两个按钮

                 点确认,就返回true,否则返回false

 

   Form

     获取: var form=document.forms[i/id/name];

     属性:

       length: 表单中,表单元素的个数

       elements[i/id/name]

       获得表单中的元素:

 form.name => form.elements["name"]

     方法:  submit(); 手动提交表单

     事件:

 

     每个表单元素都有两个方法:

       elem.focus(); //elem获得焦点

       elem.blur(); //elem失去焦点

 

*******************************************************************************

Day 05

正课:

1. BOM:

    打开和关闭窗口

    窗口大小和窗口定位

*****定时器

 

1. 什么是BOM: Browser Object Model

       BOM是专门操作浏览器的API

      window: 两个角色

          1. 代替global,充当全局对象

          2. 封装操作浏览器窗口的API

      history: 保存当前窗口打开后成功访问过的url的历史记录栈

      navigator: 保存浏览器配置信息

      location: 保存当前窗口正在打开的url的对象

      screen: 保存当前显示器或桌面分辨率信息

      event: 在事件发生时,自动保存事件相关信息的对象

 

2. 打开和关闭窗口:

   window.open() 打开,window.close()关闭当前窗口

   打开超链接的方式总结:

     1. 在当前窗口打开新链接,可后退

         html: <a href="url"></a>

         js: open("url","_self")

     2. 在当前窗口打开新链接,不可后退

         js: location.replace("url");

     3. 在新窗口打开新链接,可打开多个

         html: <a href="url" target="_blank"></a>

         js: open("url")

     4. 在新窗口打开新链接,只能打开一个窗口

        内存中,每个窗口都有一个唯一的名字name属性

        name属性是在内存中唯一标识一个窗口的名称

        浏览器规定: 相同name的窗口的只能打开一个

                            后打开的会刷新先打开的。

        在打开新窗口时,可自定义name属性

        预定义name属性值: _self  _blank ...

        

         html: <a href="url" target="name"></a>

         js: open("url","name")

 

3. 窗口大小和窗口定位(了解):

    窗口大小:

     获取窗口大小:

        1. 获取完整窗口大小: outerWidth/outerHeight

        2. 获得文档显示区大小: innerWidth/innerHeight

     修改窗口大小:

        1. 在打开窗口时,就可定义新窗口的大小和位置:

           2:

           1.定义配置字符串:

              var config="top=?,left=?,width=?,height=?"

                                                    //只是文档显示区的大小

           2. 打开窗口时,传入配置字符串              

              open("url","name",config);

        2. 通过API调整窗口大小:

            resizeTo(width,height)

                 width/height定义的是完整大小

            resizeBy(width的增量,height的增量)

       强调:

         1. 只能修改在打开时,就修改了位置和大小的弹出窗口

         2. 无法修改当前窗口自己的大小

               通过一个窗口修改另一个窗口的大小

 

    窗口定位:

       获取窗口左上角定位:

          window.screenLeft||window.screenX

          window.screenTop||window.screenY

       修改窗口的位置:

          moveTo(x,y);

          moveBy(x的增量,y的增量)

 

   练习:

     1. 屏幕的大小:

       完整大小: screen.height  screen.width

       去掉任务栏之后的剩余大小:

                      screen.availHeight  screen.availWidth

     2. 事件发生时,鼠标的位置:

       e.screenX; 相对于屏幕左上角的x坐标

       e.screenY; 相对于屏幕左上角的y坐标

   

回顾:

1. ***HTML DOM常用对象:

   Table

     创建: createTHead()   createTBody()    createTFoot

     删除: deleteTHead()   deleteTFoot()

     tHead

        insertRow(i)   deleteRow(i)//i相对于当前行分组内的位置

        rows:

            tr

                insertCell(i)    deleteCell(i)

                cells: td

     tBodies

        tBody

     tFoot

 

     insertRow(i)     deleteRow(i)//i相对于整个表中的位置

     rows:

 

     tr.rowIndex: tr相对于整个表的位置

 

  Form:

    获得Form: document.forms[i/id/name]

        form:

           属性: length    

           方法: submit();

    获得表单元素: form.elements[i/id/name]

                           form.name

        elem:

           方法: elem.focus()       elem.blur()

 

2. BOM

   打开和关闭窗口:

    打开: var pop=open("url","name",config)

                 其中: config="top=?,left=?,width=?,height=?"

                                                           //文档显示区大小

    关闭: close()

 

    打开连接四种方式:

     1. 在当前窗口打开,可后退:  open("url","_self")

     2. 在当前窗口打开,不可后退: location.replace("url");

     3. 在新窗口打开,可重复打开: open("url")

     4. 在新窗口打开,只能打开一个: open("url","name")

 

   窗口大小与窗口定位

      大小: outerWidth/outerHeight

               innerWidth/innerHeight

         修改: resizeTo(width,height)//完整大小

                  resizeBy(width的增量,height的增量)

      定位: window.screenLeft||window.screenX

               window.screenTop||window.screenY

          修改: moveTo(left,top)

                   moveBy(left的增量,top的增量)

 

正课:

1. *****定时器

   什么是: 让程序按照指定的时间间隔自动执行任务

   何时: 动画

   

周期性定时器: 让程序按照指定的时间间隔反复自动执行同一任务。

   何时: 只要反复自动执行一项任务

   如何: 3件事:

     1. 任务函数: 定义每次要执行的任务

     2. 启动定时器:  timer=setInterval(任务函数,interval)

                     让引擎每隔interval ms自动执行一次任务函数

            其中: timer: 是当前定时器任务的一个序号

     3. 停止定时器: clearInterval(timer)

            如果需要停止定时器,都要在启动时就提前保存序号

        如何自动停止定时器:

           在任务函数的结尾,判断一个临界值,如果达到临界值,就停止定时器.

 

一次性定时器: 让程序先等待一段时间,再自动执行一次任务。

                     执行一次后,自动停止。

   何时: 只要先等待一段时间,再执行一次任务

   用法: 同周期性定时器

     1. 任务函数:

     2. 启动: timer=setTimeout(task,wait);

     3. 停止: clearTimeout(timer);

                  不是停止执行,而是停止等待

正课:

1. BOM常用对象: history,   location,   navigator

2. ***event

 

1. BOM常用对象:

history: 保存当前窗口打开后成功访问过的url历史记录栈

   history.go(n): 前进n

   前进一步: history.go(1)

   后退一步: history.go(-1)

          刷新: history.go(0)

 

location: 封装当前窗口正在打开的url的对象

   属性:

     href: 完整url

     protocol: 协议

     host: 主机名+端口

     hostname: 主机名

     port: 端口

     pathname:路径

     hash: #锚点名

     search: ?表单变量

   方法:  

    在当前窗口打开新链接:

     location.href="url";

     location="url";

     location.assign("url");

    在当前窗口打开,不可后退:

     location.replace("url");

    重新加载当前页面:

     location.reload(force)

         其中: force: 表示是否强制从服务器硬盘获取文件。

      true/false

 

navigator: 封装浏览器配置信息的对象

    cookieEnabled: 判断浏览器是否启用cookie

        cookie: 客户端本地,持久存储用户私密数据的文件

 

    plugins: 包含了所有插件的信息

 

    userAgent: 包含浏览器名称和版本号的字符串

 

     

 

 

*******************************************************************************Day 06

回顾:

1. 定时器:

   1. 任务函数:

       周期性: 任务函数结尾可能需要判断临界值,自动停止

   2. 启动定时器:

      周期性: timer=setInterval(任务函数,interval);

      一次性: timer=setTimeout(任务函数,wait);

   3. 停止定时器:

      周期性: clearInterval(timer);  timer=null

      一次性: clearTimeout(timer); timer=null

 

  动画:

     DISTANCE   DURATION   STEPS

     step   interval

     timer  moved

     start(): setInterval(moveStep.bind(this),interval);

     moveStep(): 将主角移动一个step

                          moveStep结尾,判断临界值,自动停止

 

2. BOM常用对象:

   history.go(n)

 

   location:

      属性:

         href,  protocol, host, hostname,port,  pathname, hash, search

      方法:

         1. 在当前窗口打开新连接,可后退:

           location="url";

           location.href="url";

           location.assign("url");

         2. 在当前窗口打开,不可后退:

           location.replace("url");

         3. 重新加载当前页面:

           location.reload(false/true)

 

   navigator:

     cookieEnabled   

     plugins

     userAgent

 

正课:

1. ***event:

   

1. 什么是事件: 用户手动触发的或浏览器自动触发的页面或元素状态的改变。

    所有事件: https://developer.mozilla.org/en-US/docs/Web/Events

    当事件发生时,浏览器会自动调用事件处理函数:

       事件处理函数: 当事件发生时,自动调用的函数

                             on事件名 ——其实就是一个元素的特殊属性

                                                    特殊: 需要绑定一个函数

       如何绑定事件处理函数: 3:

         1. 在元素的开始标签中绑定:

             <button onclick="js语句(this)"></button>

                  button.onclick=function(){//this->button

                      eval("js语句(this)")

                  }

               当单击按钮时:  button.onclick()

            问题: 不符合内容与行为分离的原则,不便于维护

            解决:

         2. js中为元素的事件处理函数属性赋值:

             btn.onclick=function(){//this->button

                 ...

             }

             问题: 一个事件处理函数属性,只能绑定一个函数对象

             解决:

          3. 使用API添加事件监听:

             btn.addEventListener("事件名",函数对象)

             btn.removeEventListener("事件名",函数对象)

             : 1. 同一事件处理函数属性同时可绑定多个函数对象

                  2. 可移除绑定的函数对象

                  3. 可改变事件触发的顺序

   事件周期:

      DOM: 3个阶段:

         1. 捕获: 从最外层元素,向内层元素,逐个记录绑定的事件处理函数。默认,暂不触发任何事件。

         2. 目标触发:  优先触发目标元素上绑定的事件处理函数

                目标元素: 实际点击的元素

         3. 冒泡: 按照捕获的顺序,由内层,向外层逐层触发捕获的事件处理函数

      修改事件触发的顺序:

         btn.addEventListener("事件名",函数对象,capture)

            其中:capture表示是否在捕获阶段就提前触发

                       默认false, 只在冒跑阶段才触发

                       改为true, 在捕获阶段提前触发

   

   事件对象: event

       事件发生时,自动创建的,封装事件信息的对象

       还提供了对事件进行操作的API

       获得event对象:

           DOM: 事件发生时,会自动创建event对象

                      会将event对象作为事件处理函数的第一个参数自动传入。

      阻止冒泡: e.stopPropagation();

      利用冒泡:

         优化: 尽量少的创建事件监听对象

                  事件监听对象容易形成闭包,很难释放

         解决: 如果多个平级子元素需要绑定相同的事件处理函数时,只要在父元素上绑定一次即可。所有子元素共用

         核心问题:

             1. 如何获得目标元素: e.target

             2. 屏蔽不需要的元素的干扰

 

   取消事件(阻止默认行为): 当事件执行过程中,遇到问题,可取消事件。不再触发

      如何: e.preventDefault();

 

     练习: form对象: 事件: onsubmit  当提交前触发

     

 

回顾:

1. ***event

   elem.addEventListener("事件名",函数,capture);

   elem.removeEventListener("事件名",函数);

 

   e.stopPropagation(); //取消冒泡

   e.target //获得目标元素

   e.preventDefault(); //阻止默认行为

 

正课

1. ***event

   事件坐标:

      参照屏幕左上角: e.screenX, e.screenY

      参照文档显示区左上角: e.clientX||e.x  ,   e.clientY||e.y

      参照所在父元素的左上角: e.offsetX , e.offsetY

 

   页面滚动事件:

       onscroll:

       获得页面滚动过的距离:

document.body.scrollTop||                                            document.documentElement.scrollTop

 

2. cookie:

    创建: document.cookie=

"变量名=;expires="+date.toGMTString();

 

 

 

 

 

 

 

 

 

 

 

   

 

 

 

 

 

 

 

 

 

 

 

 

 

 

    

 

posted @ 2016-12-22 10:48  寒霜27  阅读(255)  评论(0编辑  收藏  举报