JS:第4~5天

onclick()触发事件

var btn = document . querySelector ( 'button' );
btn . addEventListener ( 'click' , function () { var rndCol = 'rgb(' + random ( 255 ) + ',' + random ( 255 ) + ',' + random ( 255 ) + ')' ; document . body . style . backgroundColor = rndCol ; });
移除监听事件
btn . removeEventListener ( 'click' , bgChange );
事件B 会覆盖事件A
myElement . onclick = functionA ; myElement . onclick = functionB ;
事件A 和事件B 都会被触发
myElement . addEventListener ( 'click' , functionA ); myElement . addEventListener ( 'click' , functionB );
最好不要在行内元素添加 onclick 方法,因为已经过时,若有多个同类型的元素,onclick的数量将是巨大的。流行用 querySelector 或者是 querySelectorAll 、getEelementById、getEelementByTagName

冒泡:若一个视频被点击,则运行完视频的触发事件后,还会运行它所在div 的触发事件。
目标:为实现只运行当前的事件,避免触发上级事件:stopProgation()
捕获:从外向内触发事件。在上例中,则先触发 div 事件,再触发 video 事件
addEventListener('click ',function(e){....}),true/false} true 为捕获,false为冒泡

事件委托(事件代理):若一个ul 有 N 个 li ,则要设置 N 个 DOM 操作,引起浏览器大量的重绘与重排,增加整体的交互就绪时间。只对这个 ul 对象进行操作,则效率大大提高。
最适用的元素 :click,mousedown,mouseup,keydown,keyup,keypress
在使用事件时: this===target===currentTarget
用父节点的事件,代替下属的所有子节点的事件,做到委托。下面就算是有新增的节点,也会赋予相同的属性。(转换为小写是H5中必要的)

若在li 内有其他子元素,


style 下的 visibility="hidden " 隐藏当前对象 visibility="visible " 显示当前对象

JS 修改 css 样式
1. obj.style.backgroundColor= "black";
2. obj.style.cssText = " display:block;color:White;"
3. obj.setAttribute("class", "style2"); // 推荐
4. obj.setAttribute("href","css2.css");

追加多个className ,先获取原有的类名,再加新类名,最后重新赋值。class="one two";


捕获和冒泡前后的传入的参数要一致

function(e / evn /event ){ // 代表事件的对象,仅在使用期间存在,否则被销毁

}

为事件指定处理程序的方式有多种 :
1)HTML事件处理程序 <input type="button" value="click me" onclick="alert("hello")" />
①存在一个时间差,当用户在html元素一出现在页面上就去触发相应的事件时,事件的处理程序可能还不具备执行条件(比如说调用的函数还木有被解析),就会引发错误。
②html和js代码耦合度太高,如果要改变事件处理程序,就要改动两个地方:html代码和javascript代码。
2)DMO0级事件处理程序 var btn=document.getElementById("myBtn");
btn.onclick=function(){alert(this.id)};
冒泡阶段被处理
3)DOM2级事件处理程序 addEventListener(要处理的事件名,处理函数,布尔值)
removeEventListner(要处理的事件名,处理函数,布尔值)
同一元素可有多个事件处理程序 通过addEventListner添加的匿名函数无法删除。
4)IE事件处理程序 attachEvent(事件处理程序名,事件处理函数) 事件逆序触发
detachEvent(事件处理程序名,事件处理函数)
5)跨浏览器事件处理程序。 addHandler(操作的元素,事件名称,事件处理程序的函数)
removeHandler(操作的元素,事件名称,事件处理程序的函数)


定时:
setTimeout(code,millisec) (要执行的代码,间隔的时间)
间隔
self.setInterval("调用的函数()",间隔)
此方法可以按照指定的周期执行来执行一段程序;周期是以毫秒为单位的。
setInterval 中主要区别在于,调用函数如何表示

案例一:以下是正确写法
function A(){......}
function B(){
setInterval("A()",1000,param);
}
这里加 引号和() 时,把函数A 作为一个全局搜索函数,不在函数B() 内,故函数A()能被调用
若为A 则报错 A 未定义; 若为 A() 则只会执行一次,是setInterval 内部的错误,无法调用A()

案例二:以下是正确写法
function B(){
function A(){......}
setInterval(A,1000,param);
}
与上例同理,若为A()则setInterval 内部的错误,无法调用A();若是 "A()"则寻找的作用域为外部,全局变量无法访问内部变量和函数

总之就是不要写成 A(),局部调用用 A,全局调用用“A()”

最后一部分:精灵图(把所有的小图标集合到一张图片上,通过定位获取某一个小图标,一次性加载到全部的小图标)
精灵图能减少http服务请求的时间,但是在维护、修改、切片时间上,花费的代价也是巨大的。目前随着可同时连接的http请求不断增加,精灵图的优势也就不那么明显了。

猜你喜欢

转载自blog.csdn.net/qq_37786243/article/details/80472565
今日推荐