所以我需要单击一个文档来调用某些函数,但是问题是当我单击某个想要它的元素时,它不会反应,因此代码:

<body>

<div class="some_element">
some element
</div>



</body>


和js:

$(document).click(function(){

   //something to happen

})


现在,如果我使用class =“ some_element”单击div,将调用document.click事件,但是只有在单击文档时,才需要调用该事件.....或者可以使此元素有例外吗?

更详细:

$('#forma').click(function(e){

    e.stopPropagation();

    $('#assignment_type_list').slideUp();


})


可以说#forma-它是那些元素的父元素,因此当我单击页面时,我想对一些元素进行slideUp并:

$('#assignment_type_select, #assignment_type_label').click(function(){

        $('#assignment_type_list').slideToggle();



    })


这是单击元素时切换的另一个元素,但是问题是当我单击此元素时,$('#forma').click也执行,因为它的父级和e.stopPropagation()-不能帮助

最佳答案

所有这些stopPropagation东西都是正确的,尽管这会导致您的脚本在某些浏览器的旧版本上引发错误。猜猜哪一个?跨浏览器方式:

$('#elem').click(function(e)
{
    e = e || window.event;//IE doesn't pass the event object as standard to the handler
    //event would normally work, but if you declared some event variable in the current scope
    //all falls to pieces, so this e || window.event; thing is to be preferred (IMO)
    if (e.stopPropagation)//check if method exists
    {
        e.stopPropagation();
        return;
    }
    e.cancelBubble = true;//for IE
});


但是,您想检查实际单击的元素是否是您需要的元素。问题在于事件通过DOM传递的方式。在W3C浏览器中,事件首先传递到文档,然后爬升到实际单击的元素(通过dom传播)。相比之下,IE会在元素本身上调度其事件,然后将其发送到文档中(由选择元素触发的change事件除外……会增加侮辱性伤害)。这实际上意味着在W3C浏览器中注册到body元素中的click事件可能正在进入各种复选框,或者可能是在一个空div中单击。再次,在IE中,当click事件到达body标记时,可能已经分派了页面上的任何元素。因此,对于您的情况而言,对于Google:event delegation或转向jQuery的.delegate()方法,可能会很有用。

或检查事件对象以查看事件是否被允许传播:

var target =  e.target || e.srcElement;//target now holds a reference to the clicked element


属性名称巧妙地显示了冒泡模型与传播模型之间的区别:在第一种情况(srcElement)中,事件来自dom中的源元素。在W3C传播模型中,事件在到达dom中某个target元素时进行。将其看成是一枚热寻的导弹(w3c),而不是击落目标后的一堆碎片(即,始终是破坏性的导弹,在这种情况下,往往是对事件的响应较晚,因此处理起来较晚)他们:P)

09-25 16:50
查看更多