jQuery .on适用于所有中间节点

时间:2013-10-29 11:09:06

标签: javascript css3 javascript-events jquery

考虑到这样的结果:

<body><div class="a"><div class="b"><div class="c"></div></div></div></body>

(在示例中,一切都是div - 但它们可以是任何东西)

我想为点击的div及其所有父

运行一个click事件处理程序

即。如果您点击.c,我希望.c然后.b然后.a触发该事件 如果您点击.b,那么该事件应该触发.b然后.a

N.B。在这个例子中我使用$('body').on('click', function(event){...}) 由于与问题无关的原因,使用$('div').click(function(event){...})在我的实例中不是一个实用选项。

我尝试从事件处理程序中运行dom树,但是事件对象包含错误的偏移量。

所以我的问题是 - 是否有一种内置方法可以使用上述模式调用事件处理程序。

或者失败 - 有一种内置的方法可以在给定“from”和“to”元素的情况下操纵偏移事件对象。 即AdjustOffsets(event, $target, $target.parent())

之类的东西

或者失败 - 为了手动执行这种操作,我需要什么逻辑。

在最后一种情况下,我有这段代码,但它不起作用。

if ($target.css('position') != 'static' && $target.css('position') != '')
    {
        event.clientX += $target.css('left');
        event.clientY += $target.css('top');
    }
    event.clientX += $target.css('borderLeftWidth');
    event.clientY += $target.css('borderTopWidth');
    event.clientX += $target.css('marginLeft');
    event.clientY += $target.css('marginTop');
    $target = $target.parent();
    event.clientX += $target.css('paddingLeft');
    event.clientY += $target.css('paddingTop');

这会失败,因为css属性包含单位。 单位很容易剥离,但我相信有些浏览器会返回原始单位(例如empt),而clientX属性必须是像素 - 因此转换是必要的。

这也是我最好的猜测,可能会错过一千个不起眼的css3案例 - 因此我对某种内置方法抱有雄心勃勃的渴望。

2 个答案:

答案 0 :(得分:0)

您可以在事件处理程序中尝试递归触发器,如下所示:

$(document).on('click', '.someClass', function(e){

    // .. do stuff

    $(this).parent('.someClass').trigger('click');
});

答案 1 :(得分:0)

我不太确定你的问题是什么。当您点击div.a时,是否希望触发点击事件,例如div.c?如果是这样。这应该已经发生,因为默认情况下点击事件会通过DOM冒泡。

查看此fiddle,您会看到如果点击div.cdiv.bdiv.a的点击事件也会被触发。

修改fiddle,只有1 on()