我有一个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。
谢谢!
答案 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);
});
});
});