|
| 1 | + |
| 2 | +> 本文最初发表于[博客园](http://www.cnblogs.com/smyhvae/p/8366012.html),并在[GitHub](https://github.com/qianguyihao/Web)上持续更新**前端的系列文章**。欢迎在GitHub上关注我,一起入门和进阶前端。 |
| 3 | +
|
| 4 | +> 以下是正文。 |
| 5 | +
|
| 6 | +## 事件简介 |
| 7 | + |
| 8 | +事件:就是文档或浏览器窗口中发生的一些特定的交互瞬间。对于 Web 应用来说,有下面这些代表性的事件:点击某个元素、将鼠标移动至某个元素上方、关闭弹窗等等。 |
| 9 | + |
| 10 | +JavaScript 是以**事件驱动为核心**的一门语言。JavaScript 与 HTML 之间的交互是通过事件实现的。 |
| 11 | + |
| 12 | +### 事件的三要素 |
| 13 | + |
| 14 | +**事件的三要素:事件源、事件、事件驱动程序**。 |
| 15 | + |
| 16 | +比如,我用手去按开关,灯亮了。这件事情里,事件源是:手。事件是:按开关。事件驱动程序是:灯开了或者关了。 |
| 17 | + |
| 18 | +再比如,网页上弹出一个广告,我点击右上角的`X`,广告就关闭了。这件事情里,事件源是:`X`。事件是:onclick。事件驱动程序是:广告关闭了。 |
| 19 | + |
| 20 | +于是我们可以总结出:谁引发的后续事件,谁就是事件源。 |
| 21 | + |
| 22 | +**总结如下:** |
| 23 | + |
| 24 | +- 事件源:引发后续事件的html标签。 |
| 25 | + |
| 26 | +- 事件:js已经定义好了(见下图)。 |
| 27 | + |
| 28 | +- 事件驱动程序:对样式和html的操作。也就是DOM。 |
| 29 | + |
| 30 | +也就是说,我们可以在时间对应的属性中写一些js代码,当事件被触发时,这些代码将会执行。 |
| 31 | + |
| 32 | +**代码书写步骤如下:**(重要) |
| 33 | + |
| 34 | +- (1)获取事件源:document.getElementById(“box”); // 类似于Android里面的findViewById |
| 35 | + |
| 36 | +- (2)绑定事件: 事件源box.事件onclick = function(){ 事件驱动程序 }; |
| 37 | + |
| 38 | +- (3)书写事件驱动程序:关于DOM的操作。 |
| 39 | + |
| 40 | +最简单的代码举例:(点击box1,然后弹框) |
| 41 | + |
| 42 | +```html |
| 43 | +<body> |
| 44 | +<div id="box1"></div> |
| 45 | + |
| 46 | +<script type="text/javascript"> |
| 47 | + // 1、获取事件源 |
| 48 | + var div = document.getElementById("box1"); |
| 49 | + // 2、绑定事件 |
| 50 | + div.onclick = function () { |
| 51 | + // 3、书写事件驱动程序 |
| 52 | + alert("我是弹出的内容"); |
| 53 | + } |
| 54 | +</script> |
| 55 | + |
| 56 | +</body> |
| 57 | +``` |
| 58 | + |
| 59 | +常见的事件如下: |
| 60 | + |
| 61 | + |
| 62 | + |
| 63 | +下面针对这事件的三要素,进行分别介绍。 |
| 64 | + |
| 65 | +### 1、获取事件源的方式(DOM节点的获取) |
| 66 | + |
| 67 | +获取事件源的常见方式如下: |
| 68 | + |
| 69 | +```javascript |
| 70 | + var div1 = document.getElementById("box1"); //方式一:通过id获取单个标签 |
| 71 | + |
| 72 | + var arr1 = document.getElementsByTagName("div"); //方式二:通过 标签名 获得 标签数组,所以有s |
| 73 | + |
| 74 | + var arr2 = document.getElementsByClassName("hehe"); //方式三:通过 类名 获得 标签数组,所以有s |
| 75 | +``` |
| 76 | + |
| 77 | +### 2、绑定事件的方式 |
| 78 | + |
| 79 | +方式一:直接绑定匿名函数 |
| 80 | + |
| 81 | +```html |
| 82 | +<div id="box1" ></div> |
| 83 | + |
| 84 | +<script type="text/javascript"> |
| 85 | + var div1 = document.getElementById("box1"); |
| 86 | + //绑定事件的第一种方式 |
| 87 | + div1.onclick = function () { |
| 88 | + alert("我是弹出的内容"); |
| 89 | + } |
| 90 | +</script> |
| 91 | +``` |
| 92 | + |
| 93 | +方式二:先单独定义函数,再绑定 |
| 94 | + |
| 95 | +```html |
| 96 | + <div id="box1" ></div> |
| 97 | + |
| 98 | +<script type="text/javascript"> |
| 99 | + var div1 = document.getElementById("box1"); |
| 100 | + //绑定事件的第二种方式 |
| 101 | + div1.onclick = fn; //注意,这里是fn,不是fn()。fn()指的是返回值。 |
| 102 | + //单独定义函数 |
| 103 | + function fn() { |
| 104 | + alert("我是弹出的内容"); |
| 105 | + } |
| 106 | +</script> |
| 107 | +``` |
| 108 | + |
| 109 | +注意上方代码的注释。**绑定的时候,是写fn,不是写fn()**。fn代表的是整个函数,而fn()代表的是返回值。 |
| 110 | + |
| 111 | +方式三:行内绑定 |
| 112 | + |
| 113 | +```html |
| 114 | +<!--行内绑定--> |
| 115 | +<div id="box1" onclick="fn()"></div> |
| 116 | + |
| 117 | +<script type="text/javascript"> |
| 118 | +
|
| 119 | + function fn() { |
| 120 | + alert("我是弹出的内容"); |
| 121 | + } |
| 122 | +
|
| 123 | +</script> |
| 124 | +``` |
| 125 | + |
| 126 | +注意第一行代码,绑定时,是写的`"fn()"`,不是写的`"fn"`。因为绑定的这段代码不是写在js代码里的,而是被识别成了**字符串**。 |
| 127 | + |
| 128 | +### 3、事件驱动程序 |
| 129 | + |
| 130 | +我们在上面是拿alert举例,不仅如此,我们还可以操作标签的属性和样式。举例如下: |
| 131 | + |
| 132 | +点击鼠标时,原本粉色的div变大了,背景变红: |
| 133 | + |
| 134 | +```html |
| 135 | + <style> |
| 136 | + #box1 { |
| 137 | + width: 100px; |
| 138 | + height: 100px; |
| 139 | + background-color: pink; |
| 140 | + cursor: pointer; |
| 141 | + } |
| 142 | + </style> |
| 143 | +</head> |
| 144 | + |
| 145 | +<body> |
| 146 | + |
| 147 | +<div id="box1" ></div> |
| 148 | + |
| 149 | +<script type="text/javascript"> |
| 150 | + var div1 = document.getElementById("box1"); |
| 151 | + //点击鼠标时,原本粉色的div变大了,背景变红了 |
| 152 | + div1.onclick = function () { |
| 153 | + div1.style.width = "200px"; //属性值要写引号 |
| 154 | + div1.style.height = "200px"; |
| 155 | + div1.style.backgroundColor = "red"; //属性名是backgroundColor,不是background-color |
| 156 | + } |
| 157 | +</script> |
| 158 | +``` |
| 159 | + |
| 160 | +上方代码的注意事项: |
| 161 | + |
| 162 | +- 在js里写属性值时,要用引号 |
| 163 | + |
| 164 | +- 在js里写属性名时,是`backgroundColor`,不是CSS里面的`background-color`。 |
| 165 | + |
| 166 | +实现效果如下: |
| 167 | + |
| 168 | + |
| 169 | + |
| 170 | +### onload事件 |
| 171 | + |
| 172 | +> onload事件比较特殊,这里单独讲一下。 |
| 173 | +
|
| 174 | +**当页面加载(文本和图片)完毕的时候,触发onload事件。** |
| 175 | + |
| 176 | +举例: |
| 177 | + |
| 178 | +```html |
| 179 | +<script type="text/javascript"> |
| 180 | + window.onload = function () { |
| 181 | + console.log("smyhvae"); //等页面加载完毕时,打印字符串 |
| 182 | + } |
| 183 | +</script> |
| 184 | +``` |
| 185 | + |
| 186 | +有一点我们要知道:**js的加载是和html同步加载的**。因此,如果使用元素在定义元素之前,容易报错。这个时候,onload事件就能派上用场了,我们可以把使用元素的代码放在onload里,就能保证这段代码是最后执行。 |
| 187 | + |
| 188 | +建议是:整个页面上所有元素加载完毕在执行js内容。所以,window.onload可以预防使用标签在定义标签之前。 |
| 189 | + |
| 190 | +### 事件举例:京东顶部广告栏 |
| 191 | + |
| 192 | + |
| 193 | + |
| 194 | +比如上面这张图,当鼠标点击右上角的`X`时,关掉整个广告栏,这就要用到事件。 |
| 195 | + |
| 196 | +代码实现如下: |
| 197 | + |
| 198 | +```html |
| 199 | +<!DOCTYPE html> |
| 200 | +<html> |
| 201 | +<head lang="en"> |
| 202 | + <meta charset="UTF-8"> |
| 203 | + <title></title> |
| 204 | + <style> |
| 205 | + * { |
| 206 | + padding: 0; |
| 207 | + margin: 0; |
| 208 | + } |
| 209 | + .top-banner { |
| 210 | + background-color: pink; |
| 211 | + height: 80px; |
| 212 | + } |
| 213 | + .w { |
| 214 | + width: 1210px; |
| 215 | + margin: 10px auto; |
| 216 | + position: relative; |
| 217 | + } |
| 218 | + img { |
| 219 | + display: block; |
| 220 | + width: 1210px; |
| 221 | + height: 80px; |
| 222 | + background-color: blue; |
| 223 | + } |
| 224 | + a { |
| 225 | + position: absolute; |
| 226 | + top: 5px; |
| 227 | + right: 5px; |
| 228 | + color: #fff; |
| 229 | + background-color: #000; |
| 230 | + text-decoration: none; |
| 231 | + width: 20px; |
| 232 | + height: 20px; |
| 233 | + font: 700 14px/20px "simsum"; |
| 234 | + text-align: center; |
| 235 | + } |
| 236 | + .hide { |
| 237 | + display: none!important; |
| 238 | + } |
| 239 | + </style> |
| 240 | +</head> |
| 241 | +<body> |
| 242 | + <div class="top-banner" id="topBanner"> |
| 243 | + <div class="w"> |
| 244 | + <img src="" alt=""/> |
| 245 | + <a href="#" id="closeBanner">×</a> |
| 246 | + </div> |
| 247 | + </div> |
| 248 | + |
| 249 | + |
| 250 | +<script> |
| 251 | + //需求:点击案例,隐藏盒子。 |
| 252 | + //思路:点击a链接,让top-banner这个盒子隐藏起来(加隐藏类名)。 |
| 253 | +
|
| 254 | + //1.获取事件源和相关元素 |
| 255 | + var closeBanner = document.getElementById("closeBanner"); |
| 256 | + var topBanner = document.getElementById("topBanner"); |
| 257 | + //2.绑定事件 |
| 258 | + closeBanner.onclick = function () { |
| 259 | + //3.书写事件驱动程序 |
| 260 | + //类控制 |
| 261 | +// topBanner.className += " hide"; //保留原类名,添加新类名 |
| 262 | + topBanner.className = "hide";//替换旧类名(方式一) |
| 263 | +// topBanner.style.display = "none"; //方式二:与上一行代码的效果相同 |
| 264 | + } |
| 265 | +
|
| 266 | +</script> |
| 267 | +</body> |
| 268 | +</html> |
| 269 | + |
| 270 | +``` |
| 271 | + |
| 272 | +注意最后一行代码,这种方式会替换旧类名,意思是,不管之前的类名叫什么,都会被修改。 |
| 273 | + |
| 274 | +### 事件举例: |
| 275 | + |
| 276 | +要求实现效果:当鼠标悬停在img上时,更换为另外一张图片;鼠标离开时,还原为本来的图片。 |
| 277 | + |
| 278 | +代码实现: |
| 279 | + |
| 280 | +```html |
| 281 | +<!DOCTYPE html> |
| 282 | +<html> |
| 283 | +<head lang="en"> |
| 284 | + <meta charset="UTF-8"> |
| 285 | + <title></title> |
| 286 | + <script> |
| 287 | + //window.onload页面加载完毕以后再执行此代码 |
| 288 | + window.onload = function () { |
| 289 | + //需求:鼠标放到img上,更换为另一张图片,也就是修改路径(src的值)。 |
| 290 | + //步骤: |
| 291 | + //1.获取事件源 |
| 292 | + //2.绑定事件 |
| 293 | + //3.书写事件驱动程序 |
| 294 | +
|
| 295 | + //1.获取事件源 |
| 296 | + var img = document.getElementById("box"); |
| 297 | + //2.绑定事件(悬停事件:鼠标进入到事件源中,立即触发事件) |
| 298 | + img.onmouseover = function () { |
| 299 | + //3.书写事件驱动程序(修改src) |
| 300 | + img.src = "image/jd2.png"; |
| 301 | +// this.src = "image/jd2.png"; |
| 302 | + } |
| 303 | +
|
| 304 | + //2.绑定事件(悬停事件:鼠标进入到事件源中,立即触发事件) |
| 305 | + img.onmouseout = function () { |
| 306 | + //3.书写事件驱动程序(修改src) |
| 307 | + img.src = "image/jd1.png"; |
| 308 | + } |
| 309 | + } |
| 310 | + </script> |
| 311 | +</head> |
| 312 | +<body> |
| 313 | + |
| 314 | +<img id="box" src="image/jd1.png" style="cursor: pointer;border: 1px solid #ccc;"/> |
| 315 | + |
| 316 | +</html> |
| 317 | +``` |
| 318 | + |
| 319 | +## 我的公众号 |
| 320 | + |
| 321 | +想学习**代码之外的技能**?不妨关注我的微信公众号:**千古壹号**(id:`qianguyihao`)。 |
| 322 | + |
| 323 | +扫一扫,你将发现另一个全新的世界,而这将是一场美丽的意外: |
| 324 | + |
| 325 | + |
| 326 | + |
0 commit comments