DOM初体验(绑定事件,监听事件)

时间:2023-03-09 01:10:26
DOM初体验(绑定事件,监听事件)

JavaScript的组成:

ECMAScript(js的基本语法)、DOM(文档对象模型)、BOM(浏览器对象模型)

DOM的作用:

1、 找到页面上的元素

2、 增添、删除、修改页面上的元素

3、 增添、删除、修改页面上的属性

4、 删除页面上的元素

5、 创建页面元素

DOM做的是就是增删改查

DOM级别

1、 DOM0:js在浏览器中最初的获取页面元素的方式

2、 DOM1:w3c为了统一标准,规定了节点类型,使不同的浏览器有相同的使用方法

3、 DOM2,DOM3:各自在之前的标准基础上新增一些新的内容,但是很多浏览器支持的不够完善。

文档树:

把HTML和XML的结构建立成树模型,模型由一个一个节点组成

文档树的html节点做为树的根节点

节点(node)

树模型由一个一个的节点组成,也可以说成文档由节点组成

节点类型

标签(元素)节点:页面上的标签(元素),对应的节点编号为1

属性节点:标签的属性,对应的节点编号为2

文本节点:标签中的文本、标签之间的回车、空格等,对应的节点编号为3

注释节点:注释掉的内容,对应的节点编号为8

Html元素的属性

<img id="img" class="cImg img1 img2" src="img/Bing1.jpg" width="300" height="300" alt="这是图片的alt属性">
<script>
//先获取元素
var img = document.getElementById("img");
// 输出元素的属性 -- 这些事html里面的一般属性,可以直接通过html元素对象直接点出来
console.log(img.id);
console.log(img.src);
console.log(img.width);
console.log(img.height);
console.log(img.alt);
//尝试点出class属性
//class等这些特殊的属性,并不是直接点出来,因为在js中,class是保留字,所以为了避开这个东西,使用className来代替
console.log(img.class);
//元素对象的calssName属性,可以得到这个元素身上的所有的class
console.log(img.className);
</script>

获取页面上的元素

1、 根据元素的id属性获取元素

语法:element.getElementById(‘标签名’)

页面元素:

<div id="box">根据id获取元素</div>
<input type="button" id="btn" value="点我">

Js代码

<script>

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

   console.log(box);

</script>
<script> var btn= document.getElementById('btn'); console.log(btn); btn.onclick=function () { alert('我是通过js获取元素之后弹出的框'); } </script>

返回:根据id属性找到的页面上第一个id与参数相匹配的元素,这是一个DOM对象,如果页面上没有id属性与参数相匹配的的元素,返回null

兼容:所有的主流浏览器都支持这个方法

<script>

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

   console.log(box);

</script>

<input type="button" id="btn" value="点我">

<script>

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

    console.log(btn);

    btn.onclick=function () {//绑定点击事件

        alert('我是通过js获取元素之后弹出的框');

    }

</script>

console.dir可以查看元素的详细属性信息

console.dir(btn);//只要是这个对象的属性,就能通过对象点出来

//console.dir可以查看元素的详细属性信息

注意:

如果只有一个元素的id符合要求,得到的就是这个元素

如果多个元素的id符合要求,得到的就是从上到下的第一个元素
       如果没有id符合要求,得到的就是null

绑定事件:

Element.onclick=function (){ 你希望这个元素被点击时执行的事件
}

2、 根据元素的标签名获取元素

语法:element.getElementsByTagName(‘标签名’)

元素结构:

<img src="img/Bing1.jpg" alt="">

<img src="img/Bing2.jpg" alt="">

代码:

var imgs = document.getElementsByTagName('img');

console.log(imgs);

返回:获取标签名为与参数相匹配的页面上的所有的标签,得到的是一具NodeList对象,可以使用对象的length属性遍历到获取到的所有元素

绑定事件:

<img src="img/Bing1.jpg" alt="">

<img src="img/Bing2.jpg" alt="">

<script>

        var imgs = document.getElementsByTagName('img');

    console.log(imgs);

    //imgs.onclick=function () {alert(imgs.src);}错误写法

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

                imgs[i].onclick = function () {

            alert(this.src);

        }

    }

</script>

注意:

获取到的是满足条件的元素的对象的集合,是不能直接注册事件的

要遍历其中的所有元素,分别绑定事件

事件所绑定的函数是会在事件触发的时候才执行

案列:当点击按钮之后,把a标签的链接地址修改成163.com

思路:

1、 获取元素

2、 绑定事件

3、 修改链接地址

<input id="btn" type="button" value="点击按钮修改超链接地址">

<a id="link" href="baidu.com" target="_blank">百度</a>

<script> 

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

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

        btn.onclick = function () {

                link.href = 'http://www.163.com';

    }

兼容:所有的主流浏览器都支持这个方法

3、根据元素的类名获取元素

语法:element.getElementByClassName(‘标签名’)

元素结构

<div class="color-red">啦啦啦</div>

<span class="color-red">啦啦啦</span>

<p class="color-red">啦啦啦</p>

代码

<script>

    var classList=document.getElementsByClassName('color-red');

    console.log(classList);

    console.dir(classList);

</script>

4、获取元素的注意点

获取元素的代码一定要在元素存在之后,就是把代码写在元素结构的后面。

5、获取元素属性:

一般属性:

HTML的属性和元素对象是一模一样

在获取对象之后直接使用对象点出来

格式:元素 .属性

特殊属性:

Class属性:因为class属性是保留字,所以为了避免将来出问题,使用className来代替

自定义属性:W3C标准之外的,由用户自己定义的

获取自定义属性:

Element. GetAttribute(属性名)属性名是字符串

设置自定义属性:

Element. setAttribute(属性名,属性值)

<div id="box" class="box1" title="我是title" data_title="2343214"></div>

<script>

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

    console.log(box.title);

    //    box.setAttribute("data_title",2343214);

    console.log(box.getAttribute("data_title"));

</script>

6、事件

1、 什么是事件:

事件就是文档或浏览器中发生的特定的交互瞬间

例如:文档加载完毕,点击某个按钮,鼠标移入移出......

HTML和js的通信是通过事件来实现的

事件分为触发响应

2、 事件三要素:

事件源    -  谁  -  DOM对象

事件类型(名称)  -  发生了什么  -  触发了什么事件

事件处理程序  -  如何应对  -  要执行什么代码(函数)

3、注册(绑定)事件:

行内式:在标签内使用属性的方式注册事件

让按钮在被点击的时候弹出一个提示框

<input type="button" id="btn" value="点我" onclick="alert('hi')">

内嵌式:在页面中的script标签中注册事件

页面上的标签

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

console.log(btn);

btn.onclick=function () {

    alert('我是通过js获取元素之后弹出的框');

}

外联式:就是把内嵌式的代码写到外部的js文件里面,在大型项目中用的多

1、on的方式:

写在script标签中的代码

使用方式:

事件源.on+事件名称 = 函数

<input type="button" value="点击" id="btn">

<script>

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

    btn.onclick = function () {

        alert('我是a的工作区域');

    }

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

    btn2.onclick = function () {

        alert('我是b的工作区域');

    }

    //使用on的方式注册事件的时候,只能注册一次,

    // 当重复注册的时候,后注册会把前面注册的给覆盖掉

</script>

优缺点:

所有的主流浏览器都支持,但是只能绑定一个处理函数,因为后面的会把前面的覆盖掉。这时候有个解决办法,就是使用监听事件

AddEventListener的方式

写在script标签中的代码

使用方式:DOM对象.addEventListener(事件名称,处理函数,函数执行时机)

<input type="button" value="点击" id="btn">

<script>

    //使用on的方式不能重复绑定事件

    //addEventListener

    //element.addEventListener(事件类型,事件处理程序,false)

    //1、获取元素

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

    //不需要on

    btn.addEventListener('click',function () {

        alert('我是第一次的弹框');

    },false);

    function fn2() {

        alert('外面声明函数的弹框');

    }

    btn.addEventListener('click',fn2,false);

    btn.addEventListener('click',function () {

        alert('我是第三次的弹框');

    },false);

    //在ie8下不受支持
</script>

优缺点:可以添加多个事件处理程序,但是不能被所有的浏览器都支持

兼容:chrome1.0,IE9.0,Firefox1.0,Safari1.0,opera7.0 这些版本及以上都支持

attachEvent的方式

当addEventListener因为兼容性不被其他浏览器版本支持的时候,可以使用这个方式

使用方式:elment.attachEvent("事件类型",事件处理函数);

<input type="button" value="点击" id="btn"/>

<script>

    //    浏览器的兼容范围:从ie6-ie10

    //    语法:

    //    elment.attachEvent("事件类型",事件处理函数);

    //和addEventListener不同,这个用法的事件类型必须有on

    document.getElementById("btn").attachEvent("onclick",function(){

        alert("第一次注册事件");

    });

    document.getElementById("btn").attachEvent("onclick",function(){

        alert("第二次注册事件");

    });

    document.getElementById("btn").attachEvent("onclick",function(){

        alert("第三次注册事件");

    });

</script>

注册事件的兼容写法

需求:写一个程序,可以让任何的的浏览器都可以注册事件

思路:判断这个这个浏览器是否支持这个方法,如果浏览器支持这个方式,这个条件就是true

<input type="button" value="点播" id="btn"/>

<script>

    //    var btn = document.getElementById("btn");

    //要求写一个程序,可以让任何的浏览器都可以注册事件

    //判断浏览器的版本,根据不同的版本使用不同的方法 -- 蠢

    //正确的思路:判断这个浏览器是否支持这个方法

    //    console.log(document.addEventListener);

    //    console.log(document.attachEvent);

    //如果浏览器支持这个方式,这个条件就是true

    //    if(document.addEventListener){

    //        btn.addEventListener("click",function (){},false)

    //    }else if (document.attachEvent){

    //        btn.attachEvent("on"+"click" ,function(){

    //

    //        });

    //    }else {

    //        btn.onclick

    //        btn["on"+"click"] = function(){

    //

    //        }

    //    }

    //    封装函数

    /**

     * 功能:兼容的为dom对象注册时事件

     * @param element 想要注册事件的对象

     * @param eventType 事件类型

     * @param callBack 事件处理程序

     */

    function addEvent(element,eventType,callBack){

        if(document.addEventListener){

            element.addEventListener(eventType,callBack,false)

        }else if (document.attachEvent){

            element.attachEvent("on"+eventType , callBack);

        }else {

            element["on"+ eventType] = callBack;

        }

    }

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

    addEvent(btn,"click",function(){

        console.log(123456);

    });

</script>