10 DOM(上)

97 阅读7分钟

DOM文档对象模型

DOM(Document Object Model): 文档对象模型

其实就是操作 html 中的标签的一些能力 我们可以操作哪些内容

  • 获取一个元素
  • 移除一个元素
  • 创建一个元素
  • 向页面里面添加一个元素
  • 给元素绑定一些事件
  • 获取元素的属性
  • 给元素添加一些 css 样式
  • ...

DOM 的核心对象就是 docuemnt 对象

document 对象是浏览器内置的一个对象,里面存储着专门用来操作元素的各种方法

DOM: 页面中的标签,我们通过 js 获取到以后,就把这个对象叫做 DOM 对象

document对象

document对象属性

  • title 文档标题,即title标签内容

document对象方法

  • document.write() 输入文本到当前打开的文档
一、document对象

document对象是window对象中的子对象。

document对象除了write()方法外,跟其他对象一样,也有自身一套属性和方法。

document对象,即文档对象。顾名思义,其实很好理解,文档对象嘛,操作的都是HTML文档。为了更好理解什么叫“HTML文档”,

  • 1、document对象属性
document对象属性
属性                  说明
title                文档标题,即title标签内容
URL                文档地址
fileCreateDate   文档创建日期
fileModifiedDate  文档修改时间(精确到天)
lastModified      文档修改时间(精确到秒)
fileSize           文档大小
fgColor            定义文档的前景色
bgColor           定义文档的背景色
linkColor         定义“未访问”的超链接颜色
alinkColor        定义“被激活”的超链接颜色
vlinkColor        定义“访问过”的超链接颜色
  • 2、document对象方法
document对象方法
方法                                说明
document.write()                    输入文本到当前打开的文档
document.writeIn()                  输入文本到当前打开的文档,并添加换行符“\n”
document.getElementById()       获取某个id值的元素
document.getElementsByName()  获取某个name值的元素,用于表单元素

上面列出了document对象常用的属性和方法,跟window对象的学习一样

实例:

在浏览网页的时候,我们经常看到不少网页标题在闪动。这一节我们给大家讲解一个实际开发中的技巧“网页动态标题”。
实现代码如下:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <script type="text/javascript">
        //定义全局变量,用于标识
        var flag = 0;
        window.onload = function () {
            //定时器
            setInterval("titleChange()", 1000);
        }
        //定义函数
        function titleChange() {
            if(flag==0)
            {
                document.title = "★☆★Javascript学习网★☆★";
                flag = 1;
            }
            else
            {
                document.title = "☆★☆Javasctipte学习网☆★☆";
                flag = 0;
            }
        }
    </script>
</head>
<body>
</body>
</html>
 

获取html元素

getElementById('id属性值')

  • getElementById 是通过标签的 id 名称来获取标签的
  • 因为在一个页面中 id 是唯一的,所以获取到的就是一个元素
 <div id="box"></div>
    <script>
        var box = document.getElementById('box')
        console.log(box)   // <div id="box"></div>
    </script>
  • 获取到的就是页面中那个 id 为 box 的 div 标签

getElementsByClassName('class属性')

  • getElementsByClassName 是通过标签的 class 名称来获取标签的

  • 因为页面中可能有多个元素的 class 名称一样,所以获取的是一组元素

  • 哪怕你获取的 class 只有一个,那也是获取一组元素,是不过这一组只有一个 DOM 元素而已

 <div class="box"></div>
    <script>
        var box = document.getElementsByClassName('box')
        console.log(box) // <div></div>
        console.log(box[0]) // <div></div>
    </script>
  • 获取到的是一组元素,是一个长度和数组一样的数据结构,但不是数组,是伪数组

  • 这个一组数据也是按照索引排列的,所以我们想要准确的拿到这个 div ,需要用索引来获取

类数组(伪数组)
  • 1.类数组不能使用Array的常用方法 如:push,pop等
  • 2.类数组可以遍历,可以使用[]访问元素

getElementsByTagName('标签名')

  • getElementsByTagName 是用过标签的 标签 名称来获取标签的

  • 因为页面中可能有多个元素的 标签 名称一样,所以获取到的是一组元素

  • 哪怕真的只有一个这个标签名,那么也是获取一组元素,只不过这一组中只有一个 DOM 元素而已

<div></div>
    <script>
        var box = document.getElementsByTagName('div')
        console.log(box) // [<div></div>]
        console.log(box[0]) // <div></div>
    </script>
  • getElementsByTagName 一样,获取到的是一个长得很像数组的元素
  • 必须要用索引才能够得到准确的 DOM 元素

getElementsByName('name属性')

querySelector 和 querySelectorAll

  • querySelector 是按照选择器的方式来获取元素
  • 也就是说,按照我们写 css 是时候的选择器来获取
  • 这个方法只能获取到一个元素,并且是页面中第一个满足条件的元素
 console.log(document.querySelector('div'))  // 获取页面中的第一个 div 元素
        console.log(document.querySelector('.box')) // 获取页面中第一个有 box 类名的元素
        console.log(document.querySelector('#box')) // 获取页面中第一个 id 名为box 的元素
  • querySelectorAll 是按照选择器的方式来获取元素
  • 这个方法能获取到所有满足条件的元素,以一个伪数组的形式返回
       console.log(document.querySelectorAll('div')) // 获取页面中的所有的 div 元素
       console.log(document.querySelectorAll('.box')) // 获取页面中的所有有 box 类名的元素
  • 获取到的是一组数据,也是需要用索引来获取到准确的每一个 DOM 元素

querySelector 和 querySelectorAll 的使用非常的简单,就像标题说到的一样,它和 CSS 的写法完全一样,对于前端开发人员来说,这是难度几乎为零的一次学习。假如我们有一个 id 为 test 的 DIV,为了获取到这个元素,你也许会像下面这样:

<style>
     #test{
         color:red;
     }
</style>
 <div id='test' class='test'></div>
 <div id='test1' class='test'></div>
  document.getElementById("test");
 
现在我们来试试使用新方法来获取这个 DIV:
 
document.querySelector("#test");
document.querySelectorAll(".test")[0];
  
 
  获取文档中 class=”example” 的第一个 <p> 元素:
 
document.querySelector("p.example");
  
 
  获取文档中有 “target” 属性的第一个 <a> 元素:
 
document.querySelector("a[target]");

操作事件

给元素绑定点击事件,直接给元素添加onclick属性实现

绑定事件

  • 1.属性事件
  • 2.元素和事件行为分离

元素和事件行为分离.png

操作元素内容

innerHTML

  • 获取元素内部的 HTML 结构
<body>
    <div>
        <p>
            <span>hello</span>
        </p>
    </div>

    <script>
        var div = document.querySelector('div')
        console.log(div.innerHTML)
        /* 
         <p>
            <span>hello</span>
        </p>
        */
    </script>
</body>
  • 设置元素的内容
<body>
    <div></div>

    <script>
        var div = document.querySelector('div')
        div.innerHTML = '<p>hello</p>'
    </script>
</body>
  • 设置完以后,页面中的 div 元素里面就会嵌套一个 p 元素

innerText

  • 获取元素内部的文本(只能获取到文本内容,获取不到 html 标签)
<body>
    <div>
        <p>
            <span>hello</span>
        </p>
    </div>

    <script>
        var div = document.querySelector('div')
        console.log(div.innerText) // hello
    </script>
</body>
  • 可以设置元素内部的文本
<body>
    <div></div>

    <script>
        var div = document.querySelector('div')
        div.innerText = '<p>hello</p>'
    </script>
</body>
  • 设置完毕后,会把 <p>hello</p> 当做一个文本出现在 div 元素里面,而不是把 p 解析成标签

value

操作非表单元素:innerHTML , innerText

操作表单元素:value

onclick事件绑定引入

改变元素内容

 p.innerHtml="<h1>Html内容</h1>";
  p.innerText="纯文本内容";
  p.value = "表单内容";

在JavaScript中,我们可以使用innerHTML和innerText这2个属性很方便地获取和设置某一个元素内部子元素或文本。

innerHTML属性被多数浏览器所支持,而innerText只能被IE、chrome等支持而不被Firefox支持。

innerHTML属性声明了元素含有的HTML文本,不包括元素本身的开始标记和结束标记。设置该属性可以用于为指定的HTML文本替换元素的内容。

innerText属性与inerHTML属性的功能类似,只是该属性只能声明元素包含的文本内容。即使指定的是HTML文本,它也会认为是普通文本而原样输出。

DOM对象的innerHTML属性改变元素内容:
window.onload = function(){           
     var p1 = document.getElementById("p1"); //通过id获取html元素          
     p1.style.color="green";  //字体颜色         
     p1.style.fontSize="40px";         
     p1.innerHTML="新的html文档段落内容"; //改变p1内容      
 }

操作元素CSS样式

style 行内样式

  • 专门用来给元素添加 css 样式的
  • 添加的都是行内样式
<body>
    <div></div>

    <script>
        var div = document.querySelector('div')
        div.style.width = '100px'
        div.style.height = '100px'
        div.style.background = 'pink'
        console.log(div)
        //  <div style="width: 100px;height: 100px;background: pink;"></div>
    </script>
</body>

  • 页面中的 div 就会变成一个宽高都是100,背景颜色是粉色

className class类样式

  • 专门用来操作元素的 类名 的
<body>
    <div class="box"></div>

    <script>
        var div = document.querySelector('div')
        console.log(div.className) // box
    </script>
</body>
  • 也可以设置元素的类名,不过是全覆盖式的操作
<body>
    <div class="box"></div>

    <script>
        var div = document.querySelector('div')
        div.className = 'test'
        console.log(div) // <div class="test"></div>
    </script>
</body>

  • 在设置的时候,不管之前有没有类名,都会全部被设置的覆盖

JS代码操作样式名 样式名用驼峰命名

如:font-size => fontSize

classList 动态添加移除class类样式

添加样式
div.classList.add('active');
移除指定样式
div.classList.remove('active');

classList 动态移除class类样式.png

在JavaScript中,对于元素的CSS操作,我们使用的是DOM对象中的style对象来操作。

语法:

obj.style.属性名;

说明:

obj指的是DOM对象,也就是通过document.getElementById()等获取而来的DOM元素节点对象。

属性名为CSS属性名。有一点大家要非常清楚,就是这里的属性名使用的“骆驼峰”型的CSS属性名。何为“骆驼峰”型呢?举个例子,“font-size”应该写成“fontSize”,“border-bottom-width”应该写成“borderBottomWidth”,以此类推。

举例:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <script type="text/javascript">
        function change() {
            var e = document.getElementById("lvye");
            e.style.color = "red";
            e.style.border = "1px solid gray";
        }
    </script>
</head>
<body>
    <h1 id="lvye">学习网</h1>
    <input type="button" value="改变样式" onclick="change()"/>
</body>
</html>

操作属性

getAttribute('属性名')

  • 获取元素的某个属性(包括自定义属性)
<body>
    <div class="box" a="100"></div>

    <script>
        var div = document.querySelector('div')
        console.log(div.getAttribute('a'))  // 100
        console.log(div.getAttribute('class'))  // box
    </script>
</body>

ele.getAttribute('属性名') 
=>属性值

ele.属性    必须是本身拥有的属性
=>属性值  

setAttribute('属性名',"属性值")

  • 给元素设置一个属性(包括自定义属性)
<body>
    <div></div>

    <script>
        var div = document.querySelector('div')
        div.setAttribute('a', 100)
        div.setAttribute('class', 'box')
        console.log(div)  // <div class="box" a="100"></div>
    </script>
</body>

removeAttribute('属性名')

  • 直接移除元素的某个属性
<body>
    <div class="box" a="100"></div>

    <script>
        var div = document.querySelector('div')
        div.removeAttribute('class')
        console.log(div) //<div a="100"></div>
    </script>
</body>

自定义属性

  • data-属性名
  • ele'dataset.属性名

自定义属性.png