-1

给定这样的文件:

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

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

我想为单击的 div 及其所有父项运行单击事件处理程序

即,如果您单击.c我希望事件会触发.c然后 如果您单击.b然后事件应该触发然后.a.b.b.a

注意在这种情况下,我使用$('body').on('click', function(event){...}) using$('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 案例——因此我雄心勃勃地渴望某种内置方法。

4

2 回答 2

0

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

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

    // .. do stuff

    $(this).parent('.someClass').trigger('click');
});
于 2013-10-29T11:18:51.830 回答
0

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

看看这个小提琴,你会发现如果你点击,和div.c的点击事件也会被触发。div.bdiv.a

编辑:小提琴,只有 1on()

于 2013-10-29T11:23:37.703 回答