Dom详解

67次阅读

共计 7502 个字符,预计需要花费 19 分钟才能阅读完成。

DOM

JavaScript 的组成

组成部分 说明
Ecmascript 描述了该语言的语法和基本对象
DOM 描述了处理网页内容的方法和接口
BOM 描述了与浏览器进行交互的方法和接口

DOM(文档对象模型)是针对 HTML 和 XML 文档的一个 API(应用程序编程接口)。DOM 描绘了一个层次化的节点树,允许开发人员添加、移除和修改页面的某一部分。

DOM 以树结构表达 HTML 文档。

获取元素

getElementById

根据 id 属性的值获取元素, 返回来的是一个元素对象。还有注意因为 js 区分大小写,所以写这个元素不能写错了,否者都得不到正确的结果。

document.getElementById(“id 属性的值 ”);

getElementsByTagName

根据标签名字获取元素, 返回来的是一个伪数组, 里面保存了多个的 DOM 对象

document.getElementsByTagName(“ 标签名字 ”);

返回的 HTML 集合是动态的, 意味着它可以自动更新自己来保持和 DOM 树的同步而不用再次调用 document.getElementsByTagName(“ 标签名字 ”);

getElementsByClassName

*document.getElementsByClassName(“ 类样式的名字 ”)
* 根据选择器获取元素, 返回来的是一个伪数组 *

getElementsByName

document.getElementsByName(“name属性的值 ”)

根据 name 属性的值获取元素, 返回来的是一个伪数组, 里面保存了多个的 DOM 对象

querySelector

根据选择器获取元素, 返回来的是一个元素对象

document.querySelector(“ 选择器的名字 ”);

document.querySelector` 返回第一个匹配的元素,如果没有匹配的元素,则返回 null

语法

  var element = document.querySelector(selectors);

注意,由于返回的是第一个匹配的元素,这个 api 使用的深度优先搜索来获取元素。

例子:

<body>
  <div>
    <div>
      <span class="test"> 第三级的 span</span>    
    </div>
  </div>
  <div class="test">            
    同级的第二个 div
  </div>
  <input type="button" id="btnGet" value="获取 test 元素" />
</body>
<script>
  document.getElementById("btnGet").addEventListener("click",function(){var element = document.querySelector(".test");
    alert(element.textContent);
  })
</script>
复制代码

两个 class 都包含“test”的元素,一个在文档树的前面,但是它在第三级,另一个在文档树的后面,但它在第一级,通过 querySelector 获取元素时,它通过深度优先搜索,拿到文档树前面的第三级的元素。

querySelectorAll

根据选择器获取元素, 返回来的是一个伪数组, 里面保存了多个的 DOM 对象

querySelectorAll()方法接受的参数,也是一个 css 选择器,返回的是所有匹配到的元素。返回的是一个 NodeLIst 的实例。

document.querySelectorAll(“ 选择器的名字 ”)

获取和设置属性

getAttribute

object.getAttribute(attribute)

setArribute

setAttribute(attribute,value)

getAttribute()和 setAttribute()方法不属于 document 对象,所以不能通过 document 对象调用,它只能通过元素节点对象调用。

这里有一个细节:通过 setAttribute 对文档做出修改之后,在通过浏览器查看源代码时看到的仍将是改变前的属性值,也就是说 setAttribute 做出的修改不会反映在文档本身的源代码里,这种“表里不一”的现象源自 DOM 的工作模式:先加载文档的静态内容,再动态刷新,动态刷新不影响文档的静态内容。这正是 DOM 的真正威力:对页面的内容进行刷新却不需要再浏览器里面刷新。

Node

childNodes 属性

由 childNodes 属性返回的数组包含所有类型的节点,而不仅是元素节点。事实上,文档里几乎每一个东西都是一个节点,甚至连空格和换行都会被解释为节点,而他们也包含在 childNodes 属性返回的数组中.

firstChild 和 lastChild 属性

firstChild 等价于 node.childNodes[0]

nodeType 属性

nodeType 属性共有 12 种可取值,但只有 3 中具有实用价值。

元素节点 的 nodeType 属性值是 1

属性节点 的 nodeType 属性值是 2

文本节点 的 nodeType 属性值是 3

nodeName 和 nodeValue

nodeName 返回当前节点的节点名称 节点的名字: 大写的标签 – 标签, 小写的属性名 — 属性,#text— 文本

nodeValue 返回或设置指定节点的节点值。标签 —null, 属性 – 属性的值, 文本 – 文本内容

ps: 对于元素节点 nodeName 中保存的始终是元素的标签名 大写的标签 – 标签,nodeValue 保存的值始终是 NULL

<p> 我是 p 里面的 value</p>

怎获取 p 标签里的文本?

document.querySelector(“p”).childNodes(0).nodeValue

ps: 在编写 DOM 脚本时,你会理所当然的认为某个节点肯定是一个元素节点,这是一种相当常见的错误。如果没有 100% 的把握,就一定要检查 nodeType 属性值。有很多 DOM 方法只能用于元素节点,如果用在文本节点身上,就会出错。

元素创建

document.write

document.write(“ 标签的代码及内容 ”);
document.write(‘新设置的内容 <p> 标签也可以生成 </p>’);
document.write()创建元素缺陷: 如果是在页面加载完毕后, 此时通过这种方式创建元素, 那么页面上存在的所有的内容全部被干掉

缺点:违背了“行为与表现分离”的原则

<body>
<script>
  document.write("<p>hhh 我是 p 标签 </p>")
</script>
...
</body>

innerHTML

及支持读取,也支持写入,它不仅可以用来读取 HTML 内容,还可以用它把 HTML 内容写入元素。

对象.innerHTML=” 标签及代码 ”;
var box = document.getElementById(‘box’);
box.innerHTML = ‘ 新内容 <p> 新标签 </p>’;

innerHTML 会根据指定的值创建新的 DOM 树,然后用这个 DOM 树完全替换调用元素的所有子节点。

createElement 和 appendChild

document.createElement(“ 标签的名字 ”);

// 创建元素 这个方法只能创建元素节点,这个节点是空白的。

//document.createElement(“标签名字 ”); 对象 // 把元素追加到父级元素中

var div = document.createElement(‘div’);

document.body.appendChild(div);

createTextNode

创建文本节点

document.createTextNode(“Hellow world”)

insertBefore

在已有元素前插入一个新元素

parentElement.inserBefore(newElement, targetElement)

(1)新元素: 你想插入的元素 (newELement)

(2)目标元素:你想把这个新元素插入到哪个元素 (targetElement) 之前

(3)父元素:目标元素的父元素(parentElement)

运用 dom 设置样式

style 属性

文档中的每一个元素都是一个对象,每一个对象都有各种各样的属性。每个元素节点都有一个 style 属性。style 属性包含着元素的样式,查询这个属性将返回一个对象而不是一个简单的字符串。样式都存放在这个 style 对象里。

element.style

element.style.fontFamily

当你需要引用一个中间带减号的 css 属性时,DOM 要求你用驼峰命名法。css 属性 font-family 用 fontFamily

element.style.border = “1px solid red”

getComputedStyle()

要确定某个元素的计算样式(包括应用给它的所有 css 规则),可以用这个方法

最重要的一条是要记住所有计算的样式都只是可读的;不能修改计算后样式对象的 css 属性。

window.getComputedStyle(): 可以获取当前元素所有最终使用的 CSS 属性值。

1: window.getComputedStyle(“ 元素 ”, “ 伪类 ”);

这个方法接受两个参数:要取得计算样式的元素和一个伪元素字符串(例如“:before”)。如果不需要伪元素信息,第二个参数可以是 null。也可以通过 document.defaultView.getComputedStyle(“元素”,“伪类”); 来使用

1: var ele = document.getElementById(‘ele’);

2: var styles = window.getComputedStyle(ele,null);

3: styles.color; // 获取颜色

可以通过 style.length 来查看浏览器默认样式的个数。IE6- 8 不支持该方法,需要使用后面的方法。对于 Firefox 和 Safari,会把颜色转换成 rgb 格式。

相关扩展

innerHTML 与 innerText

总结: 如果使用 innerText 主要是设置文本的, 设置标签内容, 是没有标签的效果的

// 总结:innerHTML 是可以设置文本内容 //

总结:innerHTML 主要的作用是在标签中设置新的 html 标签内容, 是有标签效果的

  • // 总结: 想要设置标签内容, 使用 innerHTML, 想要设置文本内容,innerText 或者 textContent, 或者 innerHTML, 推荐用 innerHTML
  • // 获取的时候: //innerText 可以获取标签中间的文本内容, 但是标签中如果还有标签, 那么最里面的标签的文本内容也能获取.— 获取不到标签的, 文本可以获取
  • //innerHTML 才是真正的获取标签中间的所有内容 *

结论: // 如果想要 (获取) 标签及内容, 使用 innerHTML // 如果想要设置标签, 使用 innerHTML // 想要设置文本, 用 innerText, 或者 innerHTML, 或者 textContent*

ps: innerText 成对的标签都可以用这个改变值

获取元素的宽和高

, 应该使用 offset 系列来获取

/*

*

* offset 系列: 获取元素的宽, 高,left,top, offsetParent

* offsetWidth: 元素的宽, 有边框

* offsetHeight: 元素的高, 有边框

* offsetLeft: 元素距离左边位置的值

* offsetTop: 元素距离上面位置的值

*

* scroll 系列: 卷曲出去的值

* scrollLeft: 向左卷曲出去的距离

* scrollTop: 向上卷曲出去的距离

* scrollWidth: 元素中内容的实际的宽(如果内容很少, 没有内容, 元素自身的宽), 没有边框

* scrollHeight: 元素中内容的实际的高(如果内容很少或者没有内容, 元素自身的高), 没有边框

*

* client 系列: 可视区域

* clientWidth: 可视区域的宽(没有边框), 边框内部的宽度

* clientHeight: 可视区域的高(没有边框), 边框内部的高度

* clientLeft: 左边边框的宽度

*clientTop : 上面的边框的宽度

没有脱离文档流:

  • offsetLeft: 父级元素 margin+ 父级元素 padding+ 父级元素的 border+ 自己的 margin

脱离文档流了

  • 主要是自己的 left 和自己的 margin

Jquery DOM 操作

jQuery 对象与 DOM 对象的区别

1. DOM 对象:使用 JavaScript 中的方法获取页面中的元素返回的对象就是 dom 对象。2. jQuery 对象:jquery 对象就是使用 jquery 的方法获取页面中的元素返回的对象就是 jQuery 对象。3. jQuery 对象其实就是 DOM 对象的包装集(包装了 DOM 对象的集合(伪数组))4. DOM`` 对象与 jQuery 对象的方法不能混用。

· jquery 对象就是通过 jQuery 包装 DOM 对象后产生的对象。jQuery 对象是 jQuery 独有的,其可以使用 jQuery 里的方法,但是不能使用 DOM 的方法; 反过来 Dom 对象也不能使用 jquery 的方法

Jquery 对象与 js 对象的区别

1.jQuery 对象属于 js 的数组;

2.jQuery 对象是通过 jQuery 包装的 DOM 对象后产生的;

3.jQuery 对象不能使用 DOM 对象的方法和属性

4.DOM 对象不能使用 jQuery 对象的方法和属性

DOM 对象转换成 jQuery 对象

var $obj = $(domObj);
// $(document).ready(function(){}); 就是典型的 DOM 对象转 jQuery 对象

jQuery 对象转换成 DOM 对象:

var $li = $(“li”);
// 第一种方法(推荐使用)$li[0]
// 第二种方法
$li.get(0)
 
DOM 对象转 jquery 对象
var $obj = $(domObj);
// $(document).ready(function(){}); 就是典型的 DOM 对象转 jQuery 对象

添加 css 样式


$("li").css({// 对象 所以可以添加多个样式

'background-color','fff';

'color','rga(0,0,0)';

//

});

 

addClass(name);

// 给所有的 div 添加 one 的样式

$("div").addClass("one");

removeClass();

// 移除 div 中 one 的样式类名

$("div").removeClass("one");

$("div").hasClass("one"); 

判断 div 是否有 one 的样式

 

 

$(function(){$("input").eq(0).click(function(){$("li").addClass("bigger");   // 在原来的基础上再给我加上名为 bigger 的一个类。});

})

$("li").removeClass("bigger")   // 移除一个名为 bigger 的 css 类.

         hasClass("类名")  // 判断类返回 true,fasle;toggleClass("类名")  // 切换类

 

<!-- 样式:在 style 里面写的,用 css 来操作 -->

添加属性


<!-- 属性:在标签里面写的,用 attr 来操作 -->    /*js 原生用 getAttribute("样式名")获得样式属性 setAttribute("样式名","样式属性")*/

$("img").attr("attr","xx 值")  

({

    "attr":"xx";

    "attr":"xx";

    "attr":"xx";

})

也可以获得样式的值

/* 对于返回布尔值的属性  用 prop*/

动画

show() // 不传参数,只有显示功能,无动画

show([speed],[callback]) //speed 动画持续的时间 单位毫秒

​ //callback 回调函数 动画执行完执行该函数

hide() 隐藏

slideUp() 上滑 slideDown() 下滑 slideToggle() 切换滑入滑出

淡入:fadeIn() 淡出 fadeOut()

fadeTo(duration,opacity) duration 时间 opacity 0~1 透明度

自定义动画

animate(css 属性,[duration],[easing],[callback])

​ {width:100%, {swing: 秋千,摇摆速度

​ heigth:100%} linear: 匀速 }

动画队列 .animate({left:500px}).animate({top:500px}).animate({}).

​ \ 一个一个挨个执行

节点

添加节点

$("div").append($("p"));    添加到父节点里 最后面

$("p").appendTo($("div"));  把子元素添加到父元素里面(最后)//preappend 添加到最前面

$("p").after($("p"));  兄弟元素后面   (before)

 

清空一个元素的内容

$("div").empty();     $("div").html(" ");// 这个会引发内存泄漏

移除一个元素              

$("div").remove();

克隆一个元素

$("div").clone([bool]) //false: 默认值 不会复制事件  true:会复制事件

$("<li></li>") 创建了一个 li

jQuery 特殊属性操作

1.1. val 方法

val 方法用于设置和获取表单元素的值,例如 input、textarea 的值

// 设置值
$("#name").val(“张三”);
// 获取值
$("#name").val();
 

1.2. html 方法与 text 方法

html 方法相当于 innerHTML text 方法相当于 innerText

//`` 设置内容
$(“div”).html(“<span> 这是一段内容 </span>”);
//`` 获取内容
$(“div”).html()

区别:html 方法会识别 html 标签,text 方法会那内容直接当成字符串,并不会识别 html 标签。

vue 的 DOM 操作

  • 救命稻草, 前端框架就是为了减少 DOM 操作,但是特定情况下,也给你留了后门
  • 在指定的元素上,添加 ref=” 名称 A ”
  • 在获取的地方加入 this.$refs. 名称 A

    • 如果 ref 放在了原生 DOM 元素上,获取的数据就是原生 DOM 对象

      • 可以直接操作
    • 如果 ref 放在了组件对象上,获取的就是组件对象

      • 1: 获取到 DOM 对象, 通过 this.$refs.sub.$el, 进行操作
    • 对应的事件

      • created 完成了数据的初始化,此时还未生成 DOM,无法操作 DOM
      • mounted 将数据已经装载到了 DOM 之上, 可以操作 DOM

参考博客

正文完
 0