目录
在 JavaScript 的世界里,我们能够创建充满活力的动态页面,这其中事件与元素操作扮演着举足轻重的角色。
一、事件概述
事件,简单来说,就是可以被 JavaScript 侦测到的行为,遵循着 “触发 ---- 响应机制”。在网页中,每一个元素都具备触发特定 JavaScript 事件的能力,例如常见的点击事件。
事件由三要素构成:事件源、事件类型以及事件处理程序。事件源,即事件被触发的对象,也就是 “谁被触发”;事件类型,表明事件是如何被触发的,像鼠标点击、鼠标经过、键盘按下等都属于不同的事件类型;而事件处理程序,则通过函数赋值的方式来完成。
执行事件一般遵循以下步骤:首先要获取事件源,接着进行注册事件(也就是绑定事件),最后添加事件处理程序(采用函数赋值的形式)。例如:
<script type="text/javascript"> // 第一步:获取按钮对象 var btn = document.getElementById("btn"); // 第二步:绑定一个单击事件 // 第三步:添加事件处理程序 btn.onclick = function () { // 像这种为单击事件绑定的函数,我们称为单击响应函数 alert("你好"); } </script> |
常见的事件类型丰富多样,包括鼠标事件、键盘事件以及表单事件等。
- 鼠标事件:
- onclick:当用户单击鼠标时运行脚本。
- onmousedown:按下鼠标按钮时运行脚本。
- onmouseup:松开鼠标按钮时运行脚本。
- onmousemove:鼠标指针移动时运行脚本。
- onmouseover:鼠标指针移至元素之上时运行脚本,不可以阻止冒泡。
- onmouseout:鼠标指针移出元素时运行脚本,不可以阻止冒泡。
- onmouseenter:鼠标指针移至元素之上时运行脚本,可以阻止冒泡。
- onmouseleave:鼠标指针移出元素时运行脚本,可以阻止冒泡。
- onmousewheel:转动鼠标滚轮时运行脚本。
- onscroll:滚动元素的滚动条时运行脚本。
- 键盘事件:
- onkeyup:某个键盘按键被松开时触发(document,window)。
- onkeydown:某个键盘按键被按下时触发,通常不会触发事件冒泡,除非特别处理。
- onkeypress:某个键盘按键被按下时触发,会触发事件冒泡。
- 表单事件:
- onfocus:表单获得焦点时触发。
- onblur:表单失去焦点时触发。
- oninput:表单每次输入时触发。
- onchange:表单内容发生改变时触发。
- onselect:表单文本被选取时触发。
- onreset:表单重置时触发。
- onsubmit:表单提交时触发。
二、操作元素
JavaScript 的 DOM 操作堪称强大,它赋予我们改变网页内容、结构以及样式的能力。通过 DOM 操作元素,我们能够对元素的内容、属性等进行灵活修改。
(一)改变元素内容
- element.innerText:它获取的是从起始位置到终止位置的内容,在这个过程中,会去除 HTML 标签,同时空格和换行也会一并被去掉。
- element.innerHTML:能获取从起始位置到终止位置的全部内容,其中包括 HTML 标签,并且会保留空格和换行。
基本使用示例:
<body> <!-- 需求:点击button,切换内容 --> <button>点我切换内容</button> <div>天气炎热</div> <script> // 1、获取元素 var btn = document.querySelector("button"); var div = document.querySelector("div"); // 2、绑定事件 // 3、事件处理函数 btn.onclick = function () { // console.log(div.innerText); // console.log(div.innerHTML); // 方式一、操作元素内容--innerText // div.innerText = "天气凉爽"; // 方式二、操作元素内容--innerHTML div.innerHTML = "天气凉爽"; }; </script> </body> |
两者区别:
- 写:innerText不识别 HTML 标签,而innerHTML能够识别 HTML 标签。
- 读:innerText和innerHTML都可以获取元素内部的内容,但innerText会去除空格、换行和标签,innerHTML则可以获取到元素里面的标签,同时保留空格和换行。
(二)改变元素其他属性
对于元素的src、href、id、alt、title等属性,同样可以进行修改。
示例如下:
<body> <!-- 需求:点击对应的按钮,可以切换图片已经更改title值 --> <button id="dog">小狗</button> <button id="cat">小猫</button><br /><br /> <img src="./img/pic_01.jpg" title="小狗" /> <script> // 1、获取元素 var dog = document.querySelector("#dog"); var cat = document.querySelector("#cat"); var img = document.querySelector("img"); // 2、绑定事件、处理函数 dog.onclick = function () { img.src = "./img/pic_01.jpg"; img.title = "小狗"; }; cat.onclick = function () { img.src = "./img/pic_02.jpg"; img.title = "小猫"; }; </script> </body> |
(三)操作表单元素属性
表单元素的type、value、checked、selected、disabled等属性也能通过 JavaScript 进行操作。
例如:
<body> <!-- 需求:1、点击按钮,更换input里的显示内容为:‘内容被修改了’ 需求2:点击按钮,按钮就被禁用了 --> <button>按钮</button> <input type="text" value="请输入内容" /> <script> // 1、获取元素 var btn = document.querySelector("button"); var int = document.querySelector("input"); // 绑定点击事件,处理函数 btn.onclick = function () { int.value = "内容被修改了"; btn.disabled = true; }; </script> </body> |
(四)操作样式属性操作
通过 JavaScript,我们可以轻松修改元素的大小、颜色、位置等样式。
- element.style行内样式操作:
- 在 JavaScript 里面,样式采用小驼峰命名法,比如fontSize、backgroundColor。
- 使用 JavaScript 修改style样式,会产生行内样式,其 CSS 权重比较高。
- element.className类名样式操作:
- 当样式修改较多时,可以采用操作类名的方式来更改元素样式。
- 由于class是保留字,所以使用className来操作元素的类名属性。
- className会直接更改元素的类名,会覆盖原先的类名。如果想保留原先的类名,在添加更改时,需要把原先类名加上。
示例如下:
<body> <div class="box">box</div> <script> // 需求1:点击div,div颜色变色,用行内样式实现 var box = document.querySelector(".box"); box.onclick = function () { box.style.backgroundColor = "red"; }; // 需求2:鼠标移入,div的宽高发生变化,字体大小变化,字体加粗 box.onmouseover = function () { // js里有个this的存在,在不同的情况下,指代不同的内容 // 在事件函数里,this指代调用者,也就是指向事件源 this.className = "box1"; }; </script> </body> |
(五)排他思想
当有同一组元素,且希望其中某一个元素实现特定样式时,就需要用到循环的排他思想算法。其步骤如下:
- 清除所有元素的样式。
- 给当前元素设置样式。
需特别注意,这两个步骤的顺序不能颠倒。
示例如下:
<body> <!-- 需求:给当前点击的按钮,添加背景色 --> <button>按钮1</button> <button>按钮2</button> <button>按钮3</button> <button>按钮4</button> <script> // 1、获取到所有的按钮 var btns = document.querySelectorAll("button"); // 2、通过循环,给所有的按钮绑定点击事件,处理函数 for (var i = 0; i < btns.length; i++) { btns[i].onclick = function () { // 2.1清楚所有按钮的背景色 for (var i = 0; i < btns.length; i++) { btns[i].style.backgroundColor = ""; } // 2.2 this.style.backgroundColor = "red"; }; } </script> </body> |
(六)操作自定义属性
- 获取属性值:
- 方式一:element.属性,这种方式用于获取元素自身自带的属性,例如id,href,src等。
- 方式二:element.getAttribute('属性'),主要用于获取自定义的属性,当然也可以获取元素自带属性。
- 设置属性值:
- 方式一:element.属性='值',用于设置属性值。
- 方式二:element.setAttribute('属性','值'),用于设置自定义属性,同样也能设置元素自带属性。
- 移除某个属性:使用element.removeAttribute("属性")来移除某个属性。
示例如下:
<body> <!-- 需求1:获取a标签对应的href属性值以及index属性值 需求2:设置a标签对应的href属性值为京东,以及修改index属性值为2 需求3:移除abc属性 --> <a href="https://www.baidu.com/" index="1" abc="123">百度</a> <br /><br /> <button id="btn1">获取</button> <button id="btn2">设置</button> <button id="btn3">移除</button> <script> var a = document.querySelector("a"); var btn1 = document.querySelector("#btn1"); var btn2 = document.querySelector("#btn2"); var btn3 = document.querySelector("#btn3"); btn1.onclick = function () { // 需求1 console.log(a.href, "自带属性"); console.log(a.getAttribute("index"), "自定义属性"); console.log(a.getAttribute("href"), "自带属性"); }; btn2.onclick = function () { // 需求2 a.href = "https://www.jd.com/"; a.setAttribute("index", "2"); }; btn3.onclick = function () { // 需求3 a.removeAttribute("abc"); }; </script> </body> |
- 设置 H5 自定义属性:
为了清晰区分自定义属性和元素自带属性,H5 新增了自定义属性规范:自定义属性以data-开头作为属性名并附值。
获取自定义属性:
-
- 方式一:element.getAttribute('属性')
- 方式二:element.dataset.去除掉data-的属性名
示例如下:
<body> <div data-index="abc" data-last-name="王"></div> <script> var div = document.querySelector("div"); // 设置自定义属性 div.setAttribute("data-id", "hello"); // 获取自定义属性 // 方式一:element.getAttribute("自定义属性名") console.log(div.getAttribute("data-index")); // 方式二:element.dataset.属性名 console.log(div.dataset); //得到一个对象 console.log(div.dataset.index); //读取对象 console.log(div.dataset["id"]); //读取对象 console.log(div.dataset.lastName); //驼峰命名法读取 </script> </body> |
</doubaocanvas>