js中的DOM

选取文档元素

通过id选择元素,在同一个文档中id值必须唯一。如果要根据一组id查找对应的元素,可以使用这样一个函数

   function getElements(id1, id2, id3...){
      var elements = {};
      for(var i = 0; i < arguments.length; i++){
          //取出所有id
          var id = arguments[i];
          var item = document.getElementById(id);
          if(item == null)
             throw new Error('No element with id:' + id);
          elements[id] = item;
      }
      return elements;
   }

在低于IE8版本的浏览器中,getElementById()对匹配元素的ID不区分大小写,而且也返回匹配name属性的元素,所以尽量不要将name属性和id属性写成一样
getElementsByName定义在HTMLDocument类中,而不在Document类中,所以它只针对HTML文档可用(XML就不能使用)。
getElementsByTagName可以用来获取所有文档元素

   var all = document.getElementsByTagName('*');
   all;   // [html, head, meta, body, script, ...]

HTMLDocument类定义了一些快捷属性来访问节点,比如

   document.forms.id

文档结构和遍历

document对象,element对象和表示文本的text对象都是Node对象。Node对象有以下几个属性

parentNode
    //该节点的父节点,document对象的父节点是null(不用考虑空格节点)
childNodes
    //只读的类数组对象(NodeList对象),包括了空格节点,所以我们会封装childElements来去掉空格节点(对nodeType进行判断)
firstChild,lastChild
    //该节点的子节点的第一个和最后一个,如果没有的话为null。这里同样包括了空格节点
nextSibling,previousSibling
    //具有相同父节点的两个节点为兄弟节点,这里同样包括了空格节点
nodeType
    //该节点的类型,9代表document节点,1代表element节点,3代表text节点,11代表documentFragment节点
nodeValue
    //只有text节点和comment节点有这个属性,代表文本内容
nodeName
    //元素的标签名,以大写形式标识

当我们想忽略文本内容和空白时,可以封装一些函数

   function parent(e, n){
       //n代表往上搜寻的层级
       if(n === undefined) n = 1;
       while(n-- && e) e = e.parentNode;
       //null和document,documentFragment返回null
       if(!e || e.nodeType !== 1) return null;
       return e;
   }

关于Node对象的其他属性可以参考文档Element属性与方法

属性

有些属性在js中是保留字,比如html的for属性(label元素),所以在js中变成了htmlFor,这就是React中的JSX的写法。元素的style属性只能获取到html中的内嵌样式,但是可以对样式进行修改,而且优先级最高。

创建,插入和删除节点

创建节点主要是createElement 方法和createTextNode 方法。还有一个cloneNode 可以对一个节点进行深拷贝。
插入节点主要使用appendChildinsertBefore 方法
删除节点是在元素的父节点上调用replaceChildremoveChild 方法,比如我们要删除节点b

   b.parentNode.removeChild(b)

查询元素的几何尺寸

判定一个元素的尺寸和位置最简单的方法是调用它的getBoundingClientRect 方法,它不需要参数,返回一个有left,right,top和bottom属性的对象。left和top属性表示元素的左上角的X和Y坐标,right和bottom属性代表元素的右下角的X和Y坐标

   var box = e.getBoundingClientRect();
   var w = box.width || (box.right - box.left);
   var h = box.height || (box.bottom - box.top)

兼容性更好的是使用offsetLeft和offsetTop属性,如果想得到文档坐标,可以封装这样一个方法

   function getElementPosition(e){
       var x = 0, y = 0;
       while(e != null){
          x += e.offsetLeft;
          y += e.offsetTop;
          //offsetParent属性指定offsetTop这些属性所相对的父元素
          e = e.offsetParent;
       }
       return {x: x, y: y };
   }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值