0

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

<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 - 它是这些元素的父元素,所以当我点击页面时,我想滑动 someElement 并且:

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

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



    })

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

4

3 回答 3

3

所有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由选择元素触发的事件除外......以增加对伤害的侮辱)。这实际上意味着body在 W3C 浏览器中注册到元素的单击事件可能正在到达各种复选框,或者它可能是在空 div 中的单击。
同样,在 IE 中,当点击事件到达body标签,它也可能被分派给页面上的任何元素。因此,在您的情况下,它可能对 google: 有用event delegation,或者转向 jQuery 的.delegate()方法。

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

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

属性名称巧妙地显示了冒泡模型和传播模型之间的区别:在第一种情况 ( srcElement) 中,事件来自 dom 中的源元素。在 W3C 传播模型中,当事件前往targetdom 中某处的某个元素时,该事件被咳嗽。
将其视为寻热导弹 (w3c) 与目标被击落后的一阵碎片(IE,总是具有破坏性的导弹,在这种情况下通常对事件做出反应迟到,因此处理迟到他们:P)

于 2012-08-03T10:16:21.887 回答
1

一种方法是检查event's target

$('html').click(function(event){
    if (event.target != this){
    }else{
        //do stuff
    }
});

这是一个工作小提琴

于 2012-08-03T10:09:58.250 回答
-1

文档上的元素是文档的一部分,所以如果你点击文档中的“some_element”,很明显会触发/触发文档上注册的事件。如果您不想执行用于“文档”的代码,那么首先获取发起此事件的元素或“事件源”,并检查它是否是上述问题中的“some_element”。

于 2012-08-03T10:17:03.133 回答