DOM 节点的相应操作

DOM的相关操作

什么是DOM

DOM (document object model) 文档对象模型,是W3C 组织推荐的处理可扩展标准语言的标准编程接口。 是HTML和XML文档的编程接口。DOM是独于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。

认识 DOM

DOM可以将任何HTML描绘成一个由多层节点构成的结构。节点分为12种不同类型.每个节点都拥有各自的特点、数据和方法,也与其他节点存在某种关系。节点之间的关系构成了层次,而所有页面标记则表现为一个以特定节点为根节点的树形结构。 (节点类型一共有12种)

HTML文档可以说由节点构成的集合,DOM节点:(常用的3种)

  • 元素节点(Element):上图中<html>、<body>、<p>等都是元素节点,即标签。
  • 文本节点(text): 向用户展示的内容,如<li>...</li>中的JavaScript、DOM、CSS等文本。
  • 属性节点(Attr): 元素属性,如 <a> 标签的链接属性href="http://www.baidu.com"。

DOM 操作

节点至少包括nodeType、nodeName、nodeValue 三种基本属性

  • nodeType 返回节点类型的常数值
    元素节点              Node.ELEMENT_NODE(1)
    属性节点              Node.ATTRIBUTE_NODE(2)
    文本节点              Node.TEXT_NODE(3)
    CDATA节点             Node.CDATA_SECTION_NODE(4)
    实体引用名称节点       Node.ENTRY_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)
    DTD声明节点            Node.NOTATION_NODE(12)
    
    console.log(Node.ELEMENT_NODE)  // 1
    
  • nodeName 返回该节点的大写字母标签名
  • nodeValue 返回和设置当前节点的值
        let span = document.getElementById("span")
        console.log(span.nodeName)
        console.log(span.nodeType)
        console.log(span.nodeValue)
    

获取DOM节点

  • 原生js获取
    • document.getElementById("id") // 通过id获取单个标签
    • document.getElementsByClassName("classname") // 返回带有指定类名的NodeList。
    • document.getElementsByName("name") // 返回带有指定名称的NodeList。
    • document.getElementsByTagName("tagname") // 通过 标签名 获得 NodeList。
    • document.getElementsByTagNameNS("d",title) // 返回带有指定名称和命名空间的所有元素的 NodeList。xml
  • jquery 获取
    var $p_dom=$("p");    // 获取p节点
    $p_dom.attr("title"); // 输出p节点的title属性

    var $li_2=$("ul li:eq(1)");  // 获取第2个li节点   
    $li_2.attr("title");         // 第2个li节点的title属性
    $li_2.html();                // 第2个li节点的文本内容

创建DOM节点/属性

  • 原生创建
    var div = document.createElement('div')           // 创建一个节点

    var id = document.createAttribute('id') // 创建一个指定名称的属性
    id.value = "hui"  
    document.getElementById("box").setAttributeNode(id)

    text = document.createTextNode("text");   //创建文本节点
    div.appendChild(text)
    document.body.appendChild(div)
  • jquery 创建
    $li1=$("<li></li>")                    // 创建元素节点
    $li1=$("<li>text</li>")                // 创建文本节点
    $li3=$("<li title='榴莲'>榴莲</li>");  // 创建属性节点

    $("ul").append($li3);   // 新建节点添加到DOM树中  。append 添加dom节点

添加节点

  • 原生添加

    • jQuery.insertBefore(要插入的节点,指定节点)
    • jQuery.appendChild(要添加的节点) 追加
          div.insertBefore(span,p)   // 将span插入到div中的p前面
          div.appendChild(span)      // span添加到div的最后面
    
  • jquery 添加

    • before() 和 insertBefore
    • after() 和 insertAfter()
    • prepend()、prependTo()
    • append()、appendTo()

    组内的区别 : 返回的jquery对象不同。

        var li = $("<li>被添加的元素</li>")
        $("#box").before(li) 
        li.insertBefore($("#box")) 
    
        $("#box").after(li)
        li.insertAfter($("#box"))
    
        $("#box").append(li)
        li.appendTo($("#box"))
    
        let b = $("#box").prepend(li)  // 返回的是$("#box")对象,其他组一样
        let c =li.prependTo($("#box")) // 返回的是li对象 ,其他组一样其他组一样
        b.css("background","red")   
        c.css("background","red")
    

删除节点

  • 原生删除
    • removeChild() // box.removeChild(p) box中删除p元素
  • jquery删除
    • remove()
    • empty()
        $span = $("span").remove("span[id='span']")  // 返回值为所有的span元素
        $("#box").empty()                            // 清空所有的内容
    

节点的修改操作

  • 原生
    • cloneNode() 参数true 表示复制元素时也复制元素行为
    • node.replaceChild(newnode,oldnode)
  • jQuery 操作
    • 复制元素 clone() // 参数true 表示复制元素时也复制元素行为
    • 包裹节点
      • wrap()
      • wrapAll()
      • wrapInner()
          $("p").wrap("<div></div>")       // 每个p标签外面都被一个div元素包裹,
          $("p").wrapAll("<div></div>")    // 所有的p标签都被包裹到一个div元素中
          $("p").wrapInner("<div></div>")  // 每个p标签包裹一个div元素,p元素中的内容放在div中。  和wrap相反
      
      
    • 替换节点
      • repalcewith()
      • repalceAll()
          // div代替所有的p标签,写法不同
          $("p").replaceWith($("<div>new</div>"))
          $("<div>new</div>").replaceAll("p")
      

查找节点(父节点,子节点,兄弟节点 等等)

  • 原生
    • childNodes
      childNodes 返回的是子节点的集合,是一个数组的格式。他会把换行和空格也当成是节点信息。
    • children
    • firstChild
      • firstChild 浏览器解析的时候会把他当换行和空格一起解析,其实你获取的是第一个子节点,只是这个子节点是一个换行或者是一个空格而已
    • firstElementChild
    • lastChild 和firstChild有一样的问题
    • lastElementChild
    • parentNode (w3c的标准) parentElement (ie的标准)
    • offsetParent 获取所有的父节点
    • previousSiblingpreviousElementSibling 获取上一个兄弟节点
      previousSibling 会匹配字符,包括换行和空格,而不是节点。previousElementSibling则直接匹配节点。
    • nextSiblingnextElementSibling 获取下一个兄弟节点 不同点和上面类似
  • jquery 查找
    • jQuery.parent(selector) 获取父节点

    • jQuery.parents(selector) 获取祖先元素

    • jQuery.children(expr) 查找所有子元素,只会找到直接的孩子节点,不会返回所有子孙

    • jQuery.contents() 查找下面的所有内容,包括节点和文本。

    • jQuery.prevAll() 查找所有之前的兄弟节点

    • jQuery.next() 查找下一个兄弟节点,不是所有的兄弟节点

    • jQuery.prev() 查找上一个兄弟节点,不是所有的兄弟节点

    • jQuery.nextAll() 查找所有之后的兄弟节点

    • jQuery.siblings() 查找兄弟节点,不分前后

    • jQuery.find(expr)

        $("p").find("span")等于$("p span") 跟jQuery.filter(expr)完全不一样,jQuery.filter(expr)是从初始的   
      
    • jquery.filter() 将匹配元素集合缩减为匹配指定选择器的元素 // $("span").filter(":even") 或:odd

其他操作 属性及样式,文本操作

  • 原生
    • 元素的其他操作
      • element.id 设置或返回元素的 id。
      • element.className 设置或者 返回元素的类名
      • element.tagName 返回元素的标签名(大写)
      • element.style 设置或返回元素的样式属性,
      • element.clientHeight/clientWidth 返回内容的可视高度/宽度(不包括边框,边距或滚动条)
      • element.offsetHeight/offsetWidth /offsetLeft/offsetTop 返回元素的高度/宽度/相对于父元素的左偏移/右偏移(包括边框和填充,不包括边距)
      • element.scrollHeight/scrollWidth/scrollLeft/scrollTop 返回整个元素的高度(包括带滚动条的隐蔽的地方)/宽度/返回当前视图中的实际元素的左边缘和左边缘之间的距离/上边缘的距离
    • 文本操作
      • element.innerHTML 设置或者返回元素的内容,可包含节点中的子标签以及内容
      • **element.innerText ** 设置或者返回元素的内容,不包含节点中的子标签以及内容
      • element.value
    • 属性操作
      • element.createAttribute() 创建属性

      • element.setAttributeNode() 修改指定属性节点

      • element.setAttribute(attrName,attrValue) 把指定属性设置或更改为指定值

      • element.getAttribute(para) 返回元素节点的指定属性值

      • element.getAttributeNode(para) 返回指定的属性节点

      • element.attributes 返回所有的属性

      • node.hasAttributes()

      • element.hasAttribute(para) 如果元素拥有指定属性,则返回true,否则返回 false。

      • element.removeAttribute() 从元素中移除指定属性。

      • element.removeAttributeNode(attributenode) 方法用来删除指定的属性

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