什么是js事件里的父级,能简单清晰的说明不?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是js事件里的父级,能简单清晰的说明不?相关的知识,希望对你有一定的参考价值。

理解以下几点后就很清楚了:
DOM是html 文档接口。
DOM将html文档的元素(即html标签)根据层级整理成树状模型。
而js操作html都是通过DOM来操作的。
一棵树,有干、有枝、有叶,叶的父级是枝,枝的父级是干。
如果你只是看文件的内容的话它是可以这样理解的:
中国 包含 云南,云南 包含 红河州, 红河州 包含 红河人hongheren.cn
红河州就是红河人 的父级,云南是红河州的父级,中国是云南的父级
例:<html><body><div></div></body></html>
body是div的父级,html是body的父级
其它一次类推。
以上是DOM父级的理解,有助于理解js事件的父级。
js事件的父级,说白了就是事件发生点的元素的对象的父级对象上的事件。
如下面的代码保存为html文件:
<html><body onclick="alert(\'body\')"><div onclick="alert(\'div\')"
style="width:600px;height:400px;background-color:F00;"> </div></body></html>
用浏览器开打后你会发现点击div是body的onclick事件也被触发了。

如上,应该能够理解了吧。
参考技术A 父级???呵呵,你问this的父级还是event? this父级是当前操作对象的继承对象或者dom树中的上一级对象。event是Object.追问

function menubtnclick()
var leftarrow = document.getElementById("leftarrow");
var rightarrow = document.getElementById("rightarrow");
if(leftarrow)
leftarrow.onclick=function()
curmenuindex--;
if(curmenuindex<=1)
curmenuindex=1;
btnindexfunc();
else
if(curmenuindex ==2)
btngsjjfunc(); 解释下可以吗

追答

就是这样啦:取得id为leftarrow和rightarrow,如果leftarrow取到了就绑定点击事件在它身上,执行curmenuindex--;如果值小于等于1就值为1,执行btnindexfunc函数,否则判断curmenuindex是否为2,是的话就执行btngsjjfunc函数。

怎么样?完整吧?懂了吗?不懂找我

JS中的事件委托详解(未完)

什么是JS事件委托呢?

首先,我们要明确什么是事件:所谓的事件就是像:onclick,onmouseover,onmouseover.......这些事件,那委托呢?就是指原来发生在这些事件上的元素,加到其它的元素身上来完成。

JS事件委托的原理:就是利用冒泡的原理,把事件加到父级或是父级的父级身上,来触发执行操作。

使用事件委托的优势:1)提高性能;

          2)新添加的元素也会有之前加的事件;

下面我们用例子来说明一下:点击改变li的背景颜色

HTML部分:

 1   <ul id="ul1">
 2         <li></li>
 3         <li></li>
 4         <li></li>
 5         <li></li>
 6         <li></li>
 7         <li></li>
 8         <li></li>
 9         <li></li>
10    </ul>

 

style样式部分:

1 <style>
2 *{ margin:0; padding:0; list-style:none; }
3 ul{ overflow:hidden; }
4 li{ width:100px; height:100px; background:#ccc; float:left; margin:10px; }
5 </style>

 

<script>部分:

window.onload=function (){
    var oUl=document.getElementById(‘ul1‘);
    var aLi=oUl.getElementsByTagName(‘li‘);
      for(var i=0; i<aLi.length; i++){
     aLi[i].onclick=function (){
        this.style.background=‘red‘;
     };
   };
};

 

上面的例子就是我们常用的普通写法是如上这种写法,但是大家知道如果页面上有n多个li标签,就会循环无数多次,这样对性能的损耗是巨大的,所以这时候我们就可以考虑用事件委托来完成,把onclick事件加到li的父级上去。

事件委托的写法如下:

<script>
window.onload=function (){
    var oUl=document.getElementById(‘ul1‘);
    var aLi=oUl.getElementsByTagName(‘li‘);
    oUl.onclick=function(){
        this.style.background=‘red‘;
    };
};
</script>

一步操作,省了循环,是不是一下子提高了性能呢?但有些同还可能会问,不对啊,里面的this指向的可是oUl这个元素,不再是指向了aLi[i],是的,你的分析是对的,要想用事件委托做出来跟for循环中一样的效果,我们还必须知道event对象里有一个叫事件源的东西,那什么又是事件源呢?简单讲就是不管在哪个事件中,你操作的那个元素就是事件源,并用它也是有一定的兼容性问题存在的。

在IE,chrome中事件源的获取方法是srcElement 。在FF中事件源的获取方法是target,所以我们还要给它写一个兼容的写法,并且给事件源加样式,就完成了跟for循环一样的效果。

<script>
window.onload=function (){
    var oUl=document.getElementById(‘ul1‘);
    var aLi=oUl.getElementsByTagName(‘li‘);
    oUl.onclick=function(ev){
        var oEvent=ev||event;
        var target=oEvent.srcElement||oEvent.target;
        target.style.background=‘red‘;
    };
};
</script>

不过这还不算完,为什么呢?因为有些同学在点页面的时候突然会点到ul的区域,会出现了整个Ul都变红色的情况,那我们肯定是不希望触发ul的这个事件呢,所以还需要进行有效的判断,在这里面我们判断的时候用到了tagName。

<script>
window.onload=function (){
    var oUl=document.getElementById(‘ul1‘);
    var aLi=oUl.getElementsByTagName(‘li‘);
    oUl.onclick=function(ev){
        var oEvent=ev||event;  //事件兼容写法。
        var target=oEvent.srcElement||oEvent.target; //事件源兼容写法。
        if(target.nodeName!=‘Li‘) return;  //判断如果节点的名字不是LI就返回。
        target.style.background=‘red‘;
    };
};
</script>

好,完美了!

 

以上是关于什么是js事件里的父级,能简单清晰的说明不?的主要内容,如果未能解决你的问题,请参考以下文章

js事件冒泡与捕捉解析

浅谈js冒泡事件1

JS事件冒泡

关于iframe里的子页面如何调取父级页面里的事件(子调父)

jquery如何阻止事件冒泡

js阻止事件冒泡的两种方法