我想用Scriptaculous中的Effect.Move创建这个界面(当然是使用Prototype)。
当鼠标悬停时触发顶部div
时,span
标记将向左移动50个像素 - 并在不移动到鼠标移动时的原始位置时重置。问题是,每当从子元素输入这个div
元素时,我想移动的元素移动另外50个像素。我尝试使用relatedTarget
和toElement
来阻止此事件传播,但无济于事。这是代码,但尚未完成:
e.observe('mouseover', function(evt) {
var block = e.down('span');
if(evt.target == block && !evt.relatedTarget.descendantOf(block)){
new Effect.Move(block, { x: -50, duration: 0.4,
});
} else {
}
});
HTML示例:
<div class='trigger'>
<span class='to-be-moved'>...</span>
<p>Child Element</p>
<h2>Another Child Element</h2>
<a>Link</a>
</div>
我完全迷失在这里 - 有什么建议吗?
答案 0 :(得分:2)
您是否尝试使用"mouseenter" and "mouseleave"而不是“mouseover”和“mouseout”?即使使用子元素,它们也只会触发一次,并且Prototype supports it since 1.6.1。
答案 1 :(得分:0)
尝试此功能
function hover(elem, over, out){
$(elem).observe("mouseover", function(evt){
if(typeof over == "function"){
if(elem.innerHTML){
if(elem.descendants().include(evt.relatedTarget)){ return true; }
}
over(elem, evt);
}else if(typeof over == "string"){
$(elem).addClassName(over);
}
});
$(elem).observe("mouseout", function(evt){
if (typeof out == "function") {
if(elem.innerHTML){
if(elem.descendants().include(evt.relatedTarget)){ return true; }
}
out(elem, evt);
}else if(typeof over == "string"){
$(elem).removeClassName(over);
}
});
return elem;
}
用法是:
hover($('el_id'), function(elem, evt){
/* Mouse over code here */
},
function(elem, evt){
/* Mouse out code is here */
});
这很简单。
答案 2 :(得分:0)
看here。
如果您正在寻找触发onmouseover
事件的特定元素,请使用Prototype的Event.findElement(...)
方法筛选不需要的孩子。
Serkan的回答是一种完成任务的简单方法,但不适用于所有浏览器。