首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mouseout事件的问题

mouseout事件的问题
EN

Stack Overflow用户
提问于 2008-09-08 12:55:34
回答 6查看 5.7K关注 0票数 6

我正在使用JavaScript来隐藏一个图像,并显示隐藏在它下面的一些文本。但是,当文本显示时,如果您在它上面滚动,它会在容器上触发mouseout事件,然后隐藏文本并再次显示图像,然后就会进入一个奇怪的循环。

html如下所示:

代码语言:javascript
复制
<div onmouseover="jsHoverIn('1')"
     onmouseout="jsHoverOut('1')">
    <div id="image1" />
    <div id="text1" style="display: none;">
        <p>some content</p>
        <p>some more content</p>
    </div>
</div>

和javascript (它使用scriptaculous):

代码语言:javascript
复制
function jsHoverIn(id) {
  if(!visible[id]) {
    new Effect.Fade ("image" + id, {queue: { position: 'end', scope: id } });
    new Effect.Appear ("text" + id, {queue: { position: 'end', scope: id } });
    visible[id] = true;
  }
}
function jsHoverOut (id) {
  var scope = Effect.Queues.get(id);
  scope.each(function(effect) { effect.cancel(); });

  new Effect.Fade ("text" + id, {queue: { position: 'end', scope: id } });
  new Effect.Appear ("image" + id, {queue: { position: 'end', scope: id } });
  visible[id] = false;
}

这看起来很简单,但我就是不能理解它。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2008-09-08 13:20:29

我会给容器div:

代码语言:javascript
复制
position: relative;

并使用以下命令在容器中添加第三个div (应该是容器的最后一个子级):

代码语言:javascript
复制
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;

并捕获此div上的mouseover和mouseout事件。

因为它没有子元素,你不应该得到虚假的mouseover和mouseout事件传播给它。

编辑:

我相信,当光标从父元素移动到子元素时,父元素上会发生mouseout事件,子元素上会发生mouseover事件。但是,如果子元素上的mouseover处理程序未捕获事件并停止传播,则父元素也将接收mouseover事件。

票数 5
EN

Stack Overflow用户

发布于 2008-10-13 06:22:52

听起来你真正想要的是mouseenter/mouseleave (IE专有事件,但很容易模仿):

代码语言:javascript
复制
// Observe mouseEnterLeave on mouseover/mouseout
var mouseEnterLeave = function(e) {
    var rel = e.relatedTarget, cur = e.currentTarget;
    if (rel && rel.nodeType == 3) {
        rel = rel.parentNode;
    }
    if(
        // Outside window
        rel == undefined ||
        // Firefox/other XUL app chrome
        (rel.tagName && rel.tagName.match(/^xul\:/i)) ||
        // Some external element
        (rel && rel != cur && rel.descendantOf && !rel.descendantOf(cur))
    ) {
        e.currentTarget.fire('mouse:' + this, e);
        return;
    }
};
$(yourDiv).observe('mouseover', mouseEnterLeave.bind('enter'));
$(yourDiv).observe('mouseout', mouseEnterLeave.bind('leave'));

// Use mouse:enter and mouse:leave for your events
$(yourDiv).observe(!!Prototype.Browser.IE ? 'mouseenter' : 'mouse:enter', yourObserver);
$(yourDiv).observe(!!Prototype.Browser.IE ? 'mouseleave' : 'mouse:leave', yourObserver);

或者,自信地使用patch prototype.jsmouseentermouseleave。请注意,我已经扩展了离开窗口或进入XUL chrome的检查;这似乎为我修复了Firefox中的一些边缘情况。

票数 4
EN

Stack Overflow用户

发布于 2008-09-08 13:12:50

onmouseover事件不应该在image div上,onmouseout事件不应该在text div上吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档