在用zepto的on事件中遇到的一个奇怪问题.

最近在一个项目运用zepto的on事件绑定,发现与jquery的事件有很大的区别,不知道是不是zepto的问题,

HTML结构如下

<div>
      <ul id="test1">
    <li><a id="test2">11111111</a></li>
      </ul>
</div>

然后给上面的test1 和test2绑定事件,代码如下

$(document).on("click","#test1",function(){
    alert("点击了父节点")
});
$(document).on("click","#test2",function(){
    alert("点击了子节点")
});

此时,我点击a标签.理论上应该弹出 alert("点击了子节点"),alert(弹出了父节点);

可是实际上发现,用zepto的事件绑定的时候却恰好相反,先弹出了父节点,再弹出子节点,用jquery的事件绑定,一切正常,后来把事件的绑定顺序换下,先绑定子节点的再绑定父节点的则正常.

此为第一个感觉很不合理的地方.

 

最坑爹的第二点来了.

此时如果我需要阻止事件冒泡,理论上来说,只需要加上阻止冒泡的方法就行了.代码如下

$(document).on("click","#test2",function(event){
    alert("点击了子节点");
    event.stopPropagation();
});
$(document).on("click","#test1",function(){
    alert("点击了父节点")
});

此时,在jquery下的确没有任何问题,但是在zepto下则失效.于是只好查看源码,发现代码如下

 

  handler.del = getDelegate && getDelegate(fn, event)
        var callback = handler.del || fn
        handler.proxy = function (e) {
            var result = callback.apply(element, [e].concat(e.data))
            //当事件处理函数返回false时,阻止默认操作和冒泡
            if (result === false) e.preventDefault(), e.stopPropagation()
            return result
     }

于是我按照上面的要求修改.代码如下:

$(document).on("click","#test2",function(event){
    alert("点击了子节点");
    return false;
});
$(document).on("click","#test1",function(){
    alert("点击了父节点")
});

发现还是不行.看来zepto与Jquery还是有很大的区别,不知道各位有没有遇到这个问题,或者知道这个问题的根本原因.当然如果纯粹只是为了实现这个功用如下代码也可以解决

$("#test2").on("click",function(event){
    alert("点击了子节点");
    return false;
});
$("#test1").on("click",function(){
    alert("点击了父节点")
});

上面的绑定方式就一切正常 在zepto下.

我就想知道为什么第一种的绑定方式为什么不行.欢迎提出看法

 

posted @ 2014-12-11 10:03  jsasjs  阅读(3689)  评论(5编辑  收藏  举报