代码之家  ›  专栏  ›  技术社区  ›  Garrett

在原型中悬停子元素时失去对父元素的关注

  •  2
  • Garrett  · 技术社区  · 17 年前

    我有一个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仍将控制 项目 我知道jquery在这方面做得更好,但我需要使用原型。

    谢谢!

    2 回复  |  直到 17 年前
        1
  •  4
  •   edsoverflow    17 年前

    我会这样做:

    $$(".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)))
        {
            ...
        }
    

    在事件处理程序周围。所以,只有当我们真正移入或移出父容器时,才将其视为“真正的”鼠标移入或移出。

    希望有帮助。

        2
  •  0
  •   ChssPly76    17 年前

    最简单的解决方案可能是添加 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);
            });
        });
    });