Javascript DOM 编程艺术读书笔记16/03/26

更新时间 2016-04-02 15:41:55


前言:

javascript和html文件分离的原则

jsp对web文档的操作,其实是对文档树种的节点进行操作,

通式为:element.event = atciotn

找元素的方法上一节就有提到过,下面回顾一下

document.getElementById("id")

document.getElementsByTagName("x")

浏览器自定义了很多事件event,所以我们只需要告知浏览器,如果发生这些事件应该怎么办,

以onload为例

window.onload = function(){

  xxxx();//当然这些函数先要先定义

  yyy();
}

 书中有个例子

只要点击文档中<a>元素,就会打开一个弹出a指向相容的内容

分析:

我们首先要找出所有的链接元素,给所有元素添加处理函数,过程如下

  1. 把文档中的所有链接元素(a)放入数组
  2. 遍历数组元素
  3. 如果某个链接元素的class=“popup”,说明需要被点击时调用popUP()
  • 取消这个链接的默认行为,不要把这个链接的访问者带到新的窗口

当然用到某个函数前,首先要进行定义

定义popUp函数

function popUp(winURL){

  window.open(winURL,"popup","width=100,height=100");

}

添加处理函数

var links = document.getElementsByTagName("a");

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

  if(links[i].getAttribute("class")=="popup"){

    links[i].onclick = function(){

      popUp(this.getAttribute("href"));

      return false;

    }

  }

}

但是上述代码是有一定的问题,不会被运行

javascript文件从html文档的<head>部分的<script>标签调用,而此时HTML文档还没有全部加载到浏览器中,文档模型不完整,没有完整的DOM,getElementsByTagName()不能正常运行

var links = var document.getElementsByTayName("a");

所以第一行这句被执行时,文档中还没有任何的"a"

解决方案:当然我们可以把onclick添加到a的属性值中,但是和我们提倡的分离原则矛盾

还要html全部加载到浏览器中时,浏览器自定义了一个监控器(onload),所以我们可以把上述的操作打包成处理函数,添加给触发器

window.onload = function(){ 
     
var links = document.getElementsByTagName("a");   for(var i=0;i<links.length;i++){     if(links[i].getAttribute("class")=="popup"){       links[i].onclick = function(){         popUp(this.getAttribute("href"));         return false;       }     }   } }

但是我们的函数还不是完善的

考虑到兼容性问题,我们需要对用到的内置函数进行检测

function prepareLinks(){

  if(!document.getElementsByTagName)return false;

  if(!document.getElementsByTagName("a"))return false;//没有a元素,函数依然无作用

  var links = document.getElementsByTagName("a");

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

    if(links[i].getAttribute("class")=="popup"){

      links[i].onclick = function(){

        popUp(this.getAttribute("href"));

        return false;

      }

    }

  }
}
在一个谎言的国度,沉默就是英雄
原文地址:https://www.cnblogs.com/EdsonLin/p/5324705.html