前端基础(八):DOM事件操作

    技术2023-11-29  99

    下面是小凰凰的简介,看下吧! 💗人生态度:珍惜时间,渴望学习,热爱音乐,把握命运,享受生活 💗学习技能:网络 -> 云计算运维 -> python全栈( 当前正在学习中) 💗您的点赞、收藏、关注是对博主创作的最大鼓励,在此谢过! 有相关技能问题可以写在下方评论区,我们一起学习,一起进步。 后期会不断更新python全栈学习笔记,秉着质量博文为原则,写好每一篇博文。

    文章目录

    一、JavaScript的组成二、onload事件(了解)1、script标签的位置补充 三、事件的三要素1、获取事件源的方式(DOM节点的获取)2、绑定事件的三种方式(1)直接绑定匿名函数(推荐)(2)先单独定义函数,再绑定(3)行内绑定 3、事件驱动程序(1)操作标签样式(2)操作标签属性(3)总结(4)思考(5)innerText、innerHTML与value之间的区别 四、简写小技巧五、事件案例1、盒子显示隐藏两种实现方法(1)js单独实现(2)博客广告栏关闭--js+css实现 2、实现鼠标移入切换图片

    一、JavaScript的组成

    JavaScript基础分为三个部分:

    ECMAScript:JavaScript的语法标准。包括变量、表达式、运算符、函数、if语句、for语句等。DOM:文档对象模型,操作网页上的元素的API。比如让盒子移动、变色、轮播图等。BOM:浏览器对象模型,操作浏览器部分功能的API。比如让浏览器自动滚动。

    二、onload事件(了解)

    1、script标签的位置补充

    前面我们在javascript介绍章节说过js的三种书写方式:https://blog.csdn.net/weixin_44571270/article/details/106938617 如果采用内联式,一般我们的script标签写在body最下面,如果你非要把script标签放在head标签里面,和css放一起,由于代码执行是从上至下,因此你的动作(js)会先于html、css执行,这很不科学!人都没有,怎么做动作!因此这个时候就需要onload事件了!

    onload事件详解: 当页面加载(文本和图片)完毕的时候,触发onload事件。 举例:

    <script type="text/javascript"> window.onload = function () { console.log("小马哥"); //等页面加载完毕时,打印字符串 } </script>

    有一点我们要知道:js的加载是和html同步加载的。因此,如果使用元素在定义元素之前,容易报错。这个时候,onload事件就能派上用场了,我们可以把使用元素的代码放在onload里,就能保证这段代码是最后执行。

    建议是:整个页面上所有元素加载完毕在执行js内容。所以,window.onload可以预防使用标签在定义标签之前。

    缺点:如果用户网很不好,图片无法加载出来,岂不是什么也不能做?我们应该让图片最后加载才对,js放在中间!

    三、事件的三要素

    事件的三要素:事件源、事件、事件驱动程序。 比如:网页上弹出一个广告,我点击右上角的X,广告就关闭了。这件事情里,事件源是:X。事件是:onclick。事件驱动程序是:广告关闭了

    总结如下:

    事件源:引发后续事件的html标签。事件:js已经定义好了(见下图)。事件驱动程序:对样式和html的操作。也就是DOM。

    三者的实现代码如下:

    <body> <div id="box1"></div> <script type="text/javascript"> // 1、获取事件源 var div = document.getElementById("box1"); // 2、绑定事件 div.onclick = function () { // 3、书写事件驱动程序 alert("我是弹出的内容"); } </script> </body>

    下面针对这事件的三要素,进行分别详细介绍。

    1、获取事件源的方式(DOM节点的获取)

    var div1 = document.getElementById("box1"); //方式一:通过id获取单个标签 var arr1 = document.getElementsByTagName("div"); //方式二:通过 标签名 获得 标签数组,所以有s var arr2 = document.getElementsByClassName("hehe"); //方式三:通过 类名 获得 标签数组,所以有s

    我们可以看看这个标签数组到底长啥样: 代码如下:

    <body> <div id="box1" class="haha">谢谢你长的这么好看,还光顾我的博客!</div> <p id="box2" class="haha">三连、三连!</p> <script type="text/javascript"> var arr1 = document.getElementsByTagName("div"); console.log(arr1) var arr2 = document.getElementsByClassName("haha"); console.log(arr2) //得到的是事件源对象的数组 </script> </body>

    我们看下控制台的输出: 我们主要看红色圈住的部分,它是一个看起来像字典的东西,但是它其实是一个伪数组(但我有听说它是一个集合,鬼知道这是个啥东西)!怎么取出来相应标签呢?

    //只有一个直接取即可 var arr1 = document.getElementsByTagName("div")[0]; //因为得到的是事件源对象的数组,class为haha的有两个标签,因此0,1都可以! var arr2 = document.getElementsByClassName("haha")[0]; var arr2 = document.getElementsByClassName("haha")[1]; 也可以采用for循环遍历: for(var i = 0;i < arr2.length;i++){ arr2[i].onclick = function(){ alert('我是弹出的内容') } }

    这里还可以看事件源下面可以做的操作!

    2、绑定事件的三种方式

    (1)直接绑定匿名函数(推荐)
    <div id="box1" ></div> <script type="text/javascript"> var div1 = document.getElementById("box1"); //绑定事件的第一种方式 div1.onclick = function () { alert("我是弹出的内容"); } </script>
    (2)先单独定义函数,再绑定
    <div id="box1" ></div> <script type="text/javascript"> var div1 = document.getElementById("box1"); //绑定事件的第二种方式 div1.onclick = fn; //注意,这里是fn,不是fn()。fn()指的是返回值。 //单独定义函数 function fn() { alert("我是弹出的内容"); } </script>
    (3)行内绑定
    <!--行内绑定--> <div id="box1" onclick="fn()"></div> <script type="text/javascript"> function fn() { alert("我是弹出的内容"); } </script>

    注意第一行代码,绑定时,是写的"fn()",不是写的"fn"。因为绑定的这段代码不是写在js代码里的,而是被识别成了字符串。

    3、事件驱动程序

    我们在上面是拿alert举例,不仅如此,我们还可以操作标签的属性和样式。举例如下:

    (1)操作标签样式
    <div id="box1" >谢谢你长的这么好看,还光顾我的博客!</div> <script type="text/javascript"> var div1 = document.getElementById("box1"); div1.onmouseover = function() { div1.innerText='愿你我都能活成自己心目中那个样子' div1.style.border="4px solid red" div1.style.backgroundColor="skyblue" div1.style.fontFamily="Songti SC" } div1.onmouseout = function() { div1.innerText='谢谢你长的这么好看,还光顾我的博客!' div1.style.border="none" div1.style.backgroundColor="white" div1.style.fontFamily="none" } </script>

    最开始我们是没有边框、没有背景,没有字体样式! 实现效果:

    只要出现了右边在闪动,那么一定用了js! 总结操纵标签样式的方法共性:

    所有标签样式的操作,都是通过对`div1.style.样式名`进行赋值达到操作的目的! // 注意innertext修改的文本内容既不属于标签样式,也不属于标签属性,这是个特例!
    (2)操作标签属性
    <body> <a id="d1" href="http://wujincheng.blog.csdn.net" class="conn" target="_self" title="各位路过的梦想奋斗者,三连支持哦!">点我有你好看!</a> <script type="text/javascript"> var conn = document.getElementById("d1"); conn.onclick = function () { conn.innerText="各位奋斗者,谢谢三连!"; conn.target = "_blank"; //this和python中的self一样的,都是当前调用此方法的对象的引用,也就是conn的引用! this.title="懵逼了吧,哈哈哈!"; this.className="href"; } </script> </body>

    按理来说,我们的效果原来是本页面跳转,class属性为conn,链接名:点我有你好看! 实现效果: 我们的事件驱动成功实现了操作标签属性,我们的href标签属性的值等等都可以修改哦! 总结操纵标签属性的方法:

    1. 记住一个特殊的,修改class属性conn.className 2. 其他的都是`conn.标签属性名`直接赋值修改即可! 3. `其他标签也都是一样的道理!` 4. 上面说了修改标签的文本内容conn.innerText既不是标签属性,也不是标签样式!

    文本内容本就不是行内属性,所以它算是特例,为什么class,不能conn.class呢?因为class在js中是关键字,类嘛!所以不能使用它!

    (3)总结
    1. 操纵标签样式的方法:通过对`div1.style.样式名`进行赋值达到操作的目的! 2. 操纵标签属性的方法: (1)记住一个特殊的,修改class属性conn.className (2)其他的都是`conn.标签属性名`直接赋值修改即可!

    但要注意的是,我们在对标签样式进行操作的时候,使用div1.style.样式名样式名不再是以前的样子,比如样式font-family,变成了fontFamily,不能使用-连接,而且需要使用驼峰命名法!

    (4)思考
    js是怎样达到修改标签样式的?

    对于行内标签属性的修改,js是直接修改的,这个在我们操作标签属性的动图里就可以看到!我们一般写标签样式,都在style标签里里,或者其他文件里写的!它又怎么修改呢?他其实是通过修改行内的style属性,由于行内的style优先级最高,会覆盖你的样式!

    请看下图:

    请注意看我圈的两处的变化!你应该就懂了!

    如果在事件驱动阶段我把标签的id属性修改了,会有影响吗?

    不会!var conn = document.getElementById("d1");这个已经获取到了事件源对象了!后续的操作都在内存中执行,而不会程序从头到尾重新执行一边!

    (5)innerText、innerHTML与value之间的区别
    innerText、innerHTML的区别 <body> <button id="btn">click me!</button> <div id="box1" ><span>隐藏</span></div> <div id="box2" ><span>显示</span></div> <script type="text/javascript"> var div = document.getElementById("box1"); var div1 = document.getElementById("box2"); var btn1 = document.getElementById("btn"); btn1.onclick= function(){ console.log(div.innerText); console.log(div1.innerHTML); } </script> </body>

    代码执行结果: 结论:innerText只获取标签里的文本,innerHTML获取标签里的文本和标签! ,都可以赋值,只不过innerHTML还可以赋值标签!

    value只是针对表单元素 <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <p id="demo">my first demo</p> <input id="input" type="text"> </body> <script> document.getElementById("input").value="<b>hello</b>" </script> </html>

    四、简写小技巧

    我们一个项目一般有很多标签,如果每个都要做如下操作:

    var div1 = document.getElementById("box1"); var div2 = document.getElementById("box2"); var div3 = document.getElementById("box3"); var div4 = document.getElementById("box4"); var div5 = document.getElementById("box5"); // 这样看起来是不是特别臃肿?解决方案如下: function $(id){ return document.getElementById(id); } $("d1").onclick = function(){ alert("我是弹出的内容"); } $("d2").onclick = function(){ alert("我是弹出的内容"); } $("d3").onclick = function(){ alert("我是弹出的内容"); } // 看像上面这样就简洁方便多了吧!当然上面这个只能根据id选择标签 // 你可以根据你的项目情况,把其他选择方式也写上!如下: function $(cls){ return document.getElementsByClassName(cls)[0]; } function $(tagname){ return document.getElementsByTagName(tagname)[0]; }

    五、事件案例

    1、盒子显示隐藏两种实现方法

    (1)js单独实现

    盒子隐藏两种方式,第二种方式我放在博客广告栏关闭中采用

    <head> <style> #d1 { width: 200px; height: 200px; background: red; } </style> </head> <body> <button id="d2">隐藏</button> <div id="d1"> </div> <script> var btn=document.getElementById("d2"); var div=document.getElementById("d1"); var isdisplay = true btn.onclick=function(){ if (isdisplay === true){ div.style.display="none"; isdisplay = false; btn.innerText="显示"; }else{ div.style.display="block"; isdisplay = true; btn.innerText="隐藏"; } } </script>

    实现效果:

    (2)博客广告栏关闭–js+css实现

    看,这该死的广告它又来了! 幸好上面有个❌可以关闭!今天刚学习了js的盒子的隐藏,就想着自己来实践一下!代码如下:

    <head> <style> #d1 { height: 90px; background-image: url("src.png"); } .active { display: none; } #d2 { position: relative; left: 1240px; background-color: #248df2; border: none; } </style> </head> <body> <div id="d1" class="app"> <button id="d2"></button> </div> <script> var btn = document.getElementById('d2'); var div = document.getElementById('d1'); var isdisplay=true btn.onclick=function(){ div.className='active'; } </script> </body>

    实现效果:

    2、实现鼠标移入切换图片

    图片命名如下: 实现代码如下:

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <!-- <link rel="stylesheet" href="style.css">--> <style> body { margin: 0; } #box1 { width: 236px; height: 354px; position: relative; left: 50%; top: 50%; margin-top: 177px; margin-left: -118px; background-image: url("1.jpg"); } </style> </head> <body> <div id="box1"></div> <script type="text/javascript"> var div=document.getElementById("box1"); div.onmouseover = function(){ var num = Math.floor(Math.random() * 5) + 1; div.style.backgroundImage="url("+"\""+num+".jpg\")"; } </script> </body> </html>

    除了字符串拼接的方法,你也可以采用数组实现,把所有的url存进数组,然后遍历一个,count++,下次就取到下一个了!

    注意:数组应该把"url(\"1.jpg\")"整个存进去,到时候直接赋值给div.style.backgroundImage就行了!

    Processed: 0.020, SQL: 10