原生JavaScript操作——节点操作

进入正题,开始学习JavaScript原生节点操作。

1.查找节点

获取一般节点(当然也可以获取特殊关系节点)

按id查找

document.getElementByID('patty');

按class名查找

document.getElementsByClassName('patty');

按标签名查找

document.getElementsByTagName('patty');

统一查找

document.querySelector('#id');
document.querySelectorAll('#id div');

获取特殊关系节点

获取父节点

document.getElementByID('patty').parentNode;

获取元素子节点
/*childNodes会返回指定元素的所有种类节点
  children只返回指定元素的元素节点,ie下包括注释节点
*/
var getChildNodes=function(ele){
    var childArr=ele.children || ele.childNodes;
    children=new Array();
    for(var i=0;i<childArr.length;i++){
      if(childArr[i].nodeType==1){
          children.push(childArr[i]);
      }
   }
};
获取上一个兄弟节点
/*nextSibling,previousSibling都会将空格或者换行当做节点处理
   nextElementSibling,priviousElementSibling 直接返回元素节点
*/
function getPreviousElementSibling(ele) {    
     if(ele.previousElementSibling) {    
        return ele.previousElementSibling;    
     } else {    
           do {     
           ele= ele.previousSibling;     
            } while ( ele && ele.nodeType !== 1 );       
          return ele;    
  }   
}  ;   
getPreviousElementSibling(document.getElementById('patty'));
获取下一个兄弟节点与获取上一个兄弟节点类似

getNextElementSibling(ele)

获取第一个和最后一个兄弟节点
/*firstChild,lastChild都会将空格或者换行当做节点处理
   firstElementChild,lastElementChild 直接返回元素节点
  这里只列举第一个孩子
*/
 function getFirstElementChild(ele) {    
     if(ele.firstElementChild) {    
        return ele.firstElementChild;    
     } else {    
           do {     
           ele=getNextElementSibling(ele) ;     
            } while ( ele && ele.nodeType !== 1 );       
          return ele;    
  }   
}  ;

2.插入节点

JS提供appendChild(),insertBefore()两个方法插入节点

插入新的子节点
var span = document.createElement('span');
document.querySelector('div').appendChild(span);
在指定节点前插入子节点
var patty = document.getElementById('patty');
var span = document.createElement('span');
patty.parentNode.insertBefore(span, patty);

/*更简单的*/
patty.insertAdjacentHTML('beforeBegin', '<span></span>');
在指定节点后插入子节点
function insertAfter(ele, newNode){
    if(ele.nextElementSibling) {
        ele.parentNode.insertBefore(newNode, ele.nextElementSibling);
     } else {
       ele.parentNode.appendChild(newNode);
    }
}
var patty = document.getElementById('patty');
var span = document.createElement('span');
insertAfter(patty, span);

/*更简单的*/
patty.insertAdjacentHTML('afterEnd', '<span></span>');

3.删除节点

JS只提供removeChild()删除节点

var  patty= document.getElementById('patty');
patty.parentNode.removeChild(patty);

4.清空节点

var  patty= document.getElementById('patty');
patty.innerHTML=' ';

5.判断节点是否存在

document.getElementById('patty')!==null;
document.querySelectorAll(''div).length>0;

6.遍历节点

/*IE的数组类型没有forEach函数
  array.forEach(function(currentValue, index, arr), thisValue)
*/
function forEach(elems, callback) {
     if([].forEach) {
        [].forEach.call(elems, callback);
     } else {
        for(var i = 0; i < elems.length; i++) {
        callback(elems[i], i);   }
      }
}

var div = document.querySelectorAll('div');
forEach(div, function(elem, i){

});

7.复制节点

document.getElementById('patty').cloneNode(true);

8.获取/设置节点的内容

获取/设置节点内的内容

/*获取*/
 document.querySelecotr('div').innerHTML
 var  div= document.querySelector('div');
 div.textContent  || div.innerText;
/*设置*/
 document.querySelecotr('div').innerHTML = '<span>abc</span>';
 document.querySelecotr('div').textContent = 'abc'

获取/设置包含节点本身的内容

/*获取*/
document.getElementById('patty').outerHTML
/*设置*/
document.getElementById('patty').outerHTML="<div>pattyzzh</div>";

获取/设置表单的内容

/*获取*/
document.querySelector('input').value;
/*设置*/
document.querySelector('input').value="pattyzzh";

9.属性操作

判断是否设置属性

document.getElementById('pattyzzh').hasAttribute('class');

获取属性

document.getElementById('pattyzzh').getAttribute('class');

删除属性

document.getElementById('pattyzzh').removeAttribute('class');

设置属性

document.getElementById('pattyzzh').setAttribute('class',‘patty’);

10.CSS样式操作

/*设置样式*/
document.getElementById('pattyzzh').style.color = '#e4e4e4';
/*获取样式
万恶的ie只支持currentStyle
*/
var getStyle = function(dom, attr) {   
     return dom.currentStyle ? dom.currentStyle[attr] : getComputedStyle(dom, false)[attr];  
   };

getStyle(document.getElementById('pattyzzh'), 'color');
/*获取伪类的样式(ie不支持)*/
window.getComputedStyle(el , ":after")[attrName];

11.Class操作

新增类

function addClass(elem, className) {
       if(elem.classList) {
         elem.classList.add(className);
       } else {
       elem.className += ' ' + className;
     }
}

addClass(document.getElementById('test'), 'a');

删除类

function removeClass(ele, className) {
    if(ele.classList) {
       ele.classList.remove(className);
      } else {
      ele.className = ele.className.replace(new RegExp('(^|\\b)' + className.split(' ').join('|') + '(\\b|$)', 'gi'), ' ');
     }
}
removeClass(document.getElementById('pattyzzh'), 'patty');

判断是否包含类

function hasClass(ele, className) {
  if(ele.classList) {
    return ele.classList.contains(className);
  } else {
    return new RegExp('(^| )' + className + '( |$)', 'gi').test(ele.className);

  }
}
hasClass(document.getElementById('pattyzzh'), 'patty');

12.字符串操作

/*去除空格*/
function trim(str){
     if(str.trim) {
       return str.trim();
      } else {
       return str.replace(/^\s+|\s+$/g, '');
  }
}
trim(' pattyzzh ');

/*JSON序列化*/
JSON.stringify({name: "pattyzzh"})

/*JSON反序列化*/
JSON.parse('{ "name": "pattyzzh" }')

好了,第一部分先写这么多,下次见!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容

  • 一、JS前言 (1)认识JS 也许你已经了解HTML标记(也称为结构),知道了CSS样式(也称为表示),会使用HT...
    凛0_0阅读 2,752评论 0 8
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,599评论 18 139
  • 我们首先要明白,我们给页面添加效果用到的js到底是什么?js其实包含三部分:dom 文档对象模型 bom 浏览...
    一直以来都很好阅读 793评论 0 0
  • 【原文】 子曰:“饭疏食饮水,曲肱而枕之,乐亦在其中矣。不义而富且贵,于我如浮云。” 【注释】 (1)饭疏食,饭,...
    小绿植物阅读 843评论 0 0
  • 今天的晨读材料《博弈心理学》非常有意思,介绍了三个我完全不知道的心理学概念。好像很虚无的概念,当遇上生活琐碎,变得...
    猫小开阅读 633评论 0 49