吃饭用的前端

WebAPI(一)——DOM

2019-04-06  本文已影响0人  CNLISIYIII

JS组成:ECMAScript。Dom:文档对象模型。Bom:浏览器对象模型。

DOM:

概念:文档即html文件里所有标签都变成对象

文档树中的对象都是节点对象。节点对象分为文档、元素(标签变成的对象)、文本(标签里的内容)、属性(标签里的属性)、注释。


(一)获取元素

1.根据id值获取单个元素

语法:document.getElementById('id值');

代码举栗:

<button id="btn">delete</button>

    <script>

        var btn = document.getElementById('btn');

        console.log(btn);

    </script>

若id值有同名(相同),获取的是第一次出现的元素。

2.script标签位置

若在body上面,获取到的会是null空对象。因为浏览器加载(渲染和解析)网页的时候代码从上到下执行,在此位置还没有加载到按钮,文档树上还没有该元素。

3.根据标签名获取组元素

语法:documen.getElementsByTagName('标签名');  

返回一组元素。(伪数组)

代码举栗:

var lis = document.getElementsByTagName('li');

console.log(lis);

console.log(lis[1]); //通过索引获取某个特定位置上的元素,第二个lis。

伪数组和数组的区别:

相同:都有下标,有length,都能遍历

不同:

1)类型不一样。数组是Array,伪数组不是Array。

console.log(lis instanceof Array);  //false

2)伪数组不能调用数组中提供的方法sort。

lis.sort();  //报错

4.缩小范围获取元素

//先根据id获取ul2

var ul2 = document.getElementsByTagName('ul2');

//再获取ul2中的所有值

var lis = ul2.getElementsByTagName('li');

5.根据选择器获取元素

1)根据选择器获取单个元素

语法:document.querySelector('选择器');

有兼容性问题,IE8以下不支持。

代码举栗:

<body>

    <button id="btn">按钮</button>

    <script>

      var btn = document.querySelector('#btn');

      var btn = document.querySelector('button');

      //如果有两个button标签,获取到的是第一个button

      console.dir(btn);

    </script>

</body>

不能少了选择器的规则,比如加#和.等

2)根据选择器获取一组元素

语法:document.querySelectorAll('选择器');

有兼容问题,IE8以下不支持。

代码举栗:

<body>

    <ul class="ul1">

        <li>ul1中的li1</li>

        <li>ul1中的li2</li>

        <li>ul1中的li3</li>

        <li>ul1中的li4</li>

        <li>ul1中的li5</li>

    </ul>

    <ul class="ul2">

        <li>ul2中的li1</li>

        <li>ul2中的li2</li>

        <li>ul2中的li3</li>

        <li>ul2中的li4</li>

        <li>ul2中的li5</li>

    </ul>

    <script>

      var lis = document.querySelectorAll('.ul2 li');

      console.log(lis); //返回的是一个伪数组

    </script>

</body>

(二)事件基础

在浏览器中js所侦测到的操作行为。

1.事件三要素

事件源、事件类型、事件处理程序

注册事件语法:元素(事件源).事件类型 = 事件处理程序;

代码举栗:

//获取按钮元素

var btn = document.getElementById('btn');

//事件类型:点击事件onclick

//事件处理程序:函数

btn.onclick = function() {

//事件处理程序

    alert('shijian');

}

2.给一组按钮注册事件

注册事件:在原生js中不要给组注册事件,注册无效。应该给组中的每一个元素注册事件。

    btns.onclick = function() {

        alert('shijian');   //无效

    }  

代码举栗:

<body>

    <button>1</button>

    <button>2</button>

    <button>3</button>

    <button>4</button>

    <button>5</button>

    <button>6</button>

    <button>7</button>

    <script>

        //通过标签名获取一组元素

        var btns = document.getElementsByTagName('button');

        //代码冗余,所以用循环给一组元素注册事件

        for (var i = 0; i < btns.length; i++) {

            btns[i].onclick = function () {

                alert('shijian');  //事件处理程序

            };

        }

    </script>

</body>

循环在此仅仅是给按钮添加事件,但是事件处理程序中代码只有事件触发时(按钮被点击时)才会执行。

3.取消默认行为

1)加return false

<body>

    <!-- 默认行为:a会改变原有的地址,并跳转 -->

    <a id="link" href="#">按钮</a>

    <script>

        //获取a元素

        var link = document.getElementById('link');

        //注册点击事件

        link.onclick = function() {

            alert('nihao');

            //取消默认行为。在事件最后加:

            return false;

        };

    </script>

</body>

2)href="javascript:"

<!-- 告诉浏览器不要跳转,而是仅执行js代码 -->

    <a id="link" href="javascript:">按钮</a>

4.事件处理程序中的this关键字

事件处理程序:就是元素的一个方法

方法:方法中this指向调用者。

调用:对象.方法名();

代码举栗:

<body>

    <button id="btn">按钮</button>

    <script>

        //获取元素(对象)

        var btn = document.getElementById('btn');

        btn.onclick = function () {

            // alert('hello');

            console.log(this);

        }; 

        //若点击了按钮,浏览器会自动调用btn.onclick()

    </script>

</body>

事件处理程序中的this指向事件源

this指向的情况:

1)在构造函数中this指向当前创建的对象

2)在方法中this指向调用者

3)在事件处理程序中this指向事件源。(本质上指向调用者,但是浏览器调用的)

5.鼠标进入事件和鼠标离开事件

代码举栗:

<body>

    <div></div>

    <script>

        //获取事件源div

        var div = document.querySelector('div');

        //鼠标进入事件

        div.onmouseenter = function () {

            console.log('鼠标进入');

        };

        //鼠标离开事件

        div.onmouseleave = function () {

            console.log('鼠标离开');

        }

    </script>

</body>

(三)操作元素的属性

1.常见属性id

<body>

    <a id="link" href="https://www.baidu.com">点击</a>

<script>

    //获取a元素

    var link = document.getElementById('link');

    //获取a元素的href值

    console.dir(link);

    //获取元素的属性

    console.dir(link.href);

    //设置

    link.href = 'https://www.jd.com'

    console.dir(link);

    </script>

</body>

2.常见属性src

<script>

        //获取a元素

        var link = document.getElementById('link');

        //获取图片元素

        var photo = document.getElementById('photo');

        //给a注册onclick事件

        link.onclick = function () {

            //在事件处理程序中更改图片元素的src属性值

            // photo.scr = 'images/mm.gif';

            //获取原有的图片地址,检测是否包含wc.jpg

            if (photo.src.indexOf('wc.jpg') != -1) {

                //说明当前展示的是wc

                photo.src = "images/mm.gif"; //相对路径就可以。

            }

            else {

                //说明当前展示的是mm,要更改为wc

                photo.src = "images/wc.gif";

            }

            console.log(photo.src);

        };

    </script>

3.className

操作类名的目的就是操作样式。

4.操作div的内容(获取和设置内容)

innerText:仅获取文本内容,不包含子标签的标签名

//设置子标签时,标签会当作普通文本输出,不会渲染

console.dir(box.innerText);

innerHTML:获取文本的内容及标签   

//设置子标签时,子标签会渲染展示

相同:都是操作文本

不同:innerText是非标准属性但兼容性好,textContent是标准的属性(官方)但有兼容性问题。

上一篇 下一篇

猜你喜欢

热点阅读