在原型中悬停子元素时,忽略对父元素的关注

时间:2009-07-15 16:29:31

标签: javascript css prototypejs

我有一个div,当我将鼠标悬停在它上面时,我有一个子div(另一个div)来制作动画,但是当我将鼠标悬停在子div上时,父div失去焦点并且子元素开始动画回来,好像我离开了父母div。

以下是我正在使用的代码:

$$(".slide .item").each(function (element) {
    element.observe('mouseover', function (event) {
        element.writeAttribute('doing_animation', 'true');
        element.down('.meta').morph('margin: 103px 0 0;', {
            duration: 0.25,
            afterFinish: function (event) {
                element.writeAttribute('doing_animation', 'false');
            }
        });
    });
    element.observe('mouseout', function (event) {
        setTimeout(function () {
            element.down('.meta').morph('margin: 169px 0 0;', {
                duration: 0.25
            });
        }, 250);
    });
});

这是标记:

<div class="item">
    <div class="meta">
        <h3><a href="#">Space Kitty Needz Moar Balls</a></h3>
        <ul>
            <li>From: <a href="#">Jeffdoe</a></li>
            <li>Posted: 20 minutes ago</li>
            <li>Views: 249,209</li>
        </ul>
    </div>
    <img src="images/tmp/kitty.png" alt="" />
</div>

因此,使用代码,我想悬停.item.item .meta,而.meta div仍将控制.item div的焦点。我知道jQuery在这方面做得更好,但我需要使用Prototype。

谢谢!

2 个答案:

答案 0 :(得分:4)

我是这样做的:

$$(".slide .item").each(function (element) {
    element.observe('mouseover', function (event) {
        var relatedTarget = $(event.relatedTarget || event.fromElement);
        var target = Event.element(event);
        if ((target == element || Element.descendantOf(target, element))
            && !((relatedTarget == element) || Element.descendantOf(relatedTarget, element)))
        {
            element.writeAttribute('doing_animation', 'true');
            element.down('.meta').morph('margin: 103px 0 0;', {
                duration: 0.25,
                afterFinish: function (event) {
                    element.writeAttribute('doing_animation', 'false'); 
                }
            });
        }
    });
    element.observe('mouseout', function (event) {
        var relatedTarget = $(event.relatedTarget || event.fromElement);
        var target = Event.element(event);
        if ((target == element || Element.descendantOf(target, element))
            && !((relatedTarget == element) || Element.descendantOf(relatedTarget, element)))
        {
            setTimeout(function () {
                element.down('.meta').morph('margin: 169px 0 0;', {
                    duration: 0.25
                });
            }, 250);
        }
    });
});

你可以看到我刚刚添加了一个包装器

    var relatedTarget = $(event.relatedTarget || event.fromElement);
    var target = Event.element(event);
    if ((target == element || Element.descendantOf(target, element))
        && !((relatedTarget == element) || Element.descendantOf(relatedTarget, element)))
    {
        ...
    }

围绕您的事件处理程序。因此,如果我们真的进出父容器,只考虑它是“真正的”鼠标输入或鼠标移出。

希望有所帮助。

答案 1 :(得分:0)

最简单的解决方案可能是向mouseover个孩子添加.item.个监听器并清除mouseout超时。下面的代码仅供参考 - 它未经测试,变量当然应该适当确定范围:

var timeout = null;

$$(".slide .item").each(function (element) {
    element.observe('mouseout', function (event) {
        timeout = setTimeout(function () {
            ...
        }, 250);
    });

    element.descendants().each(function (nested) { 
        nested.observe('mouseover', function (nestedEvent) {
            if (timeout) clearTimeout(timeout);
        });
    });
});