Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 原型中的重复事件_Javascript_Prototypejs - Fatal编程技术网

Javascript 原型中的重复事件

Javascript 原型中的重复事件,javascript,prototypejs,Javascript,Prototypejs,我有一个设置,其中我有一个元素网格,当我滚动每个元素时,弹出窗口显示为一个高级工具提示。我首先检查弹出窗口是否需要跟随mousedover元素的鼠标位置,如果需要,我使用mousemove事件。我先停止观察,以防之前有一套,然后我开始观察。我是否真的需要这样做,或者原型是否足够聪明,不会在同一个元素上添加重复事件 show:function(param){ if(this.isFollow){ $(param.target).stopObserving('mouse

我有一个设置,其中我有一个元素网格,当我滚动每个元素时,弹出窗口显示为一个高级工具提示。我首先检查弹出窗口是否需要跟随mousedover元素的鼠标位置,如果需要,我使用mousemove事件。我先停止观察,以防之前有一套,然后我开始观察。我是否真的需要这样做,或者原型是否足够聪明,不会在同一个元素上添加重复事件

 show:function(param){
      if(this.isFollow){
        $(param.target).stopObserving('mousemove', this.onMouseMove);
        $(param.target).observe('mousemove', this.onMouseMove);
      }
},

//param.target is the element that is being rolled over. I pass this in to my show method to then find its x and y position.

 onMouseMove:function(event){
    var xPos = Event.pointerX(event);
    var yPos = Event.pointerY(event);
    _self._popup.setStyle({left: xPos + 10 + "px", top:yPos + 10 + "px"});
 }
第二个问题。当我将鼠标快速移动到元素上时,鼠标后面的弹出窗口有时会滞后,鼠标会越过弹出窗口,阻碍下面元素上的鼠标覆盖事件。 我认为这就是mousemove的本质,因为它的渲染速度不够快。我应该使用setTimeout或类似的东西来代替mousemove来防止这种延迟吗

1)不,Prototype不会两次设置相同的事件处理程序。只有在线声明处理程序函数(即
元素。观察('click',function(){…})
)时才会发生这种情况,因为每次都会向处理程序发送一个新创建的函数,而不会发送一个完全相同的函数实例。
但是在您的例子中,如果您指的是
onMouseMove
函数,Prototype将检查该特定函数是否已经为该特定元素上的特定事件注册。如果是,就不会再注册了


2) 您无法避免鼠标快速移动的延迟,不。浏览器发送
mousemove
事件的速度不够快。您可以使用计时器,但我可能会尝试为所有网格元素(甚至可能是
document
本身)的父元素注册一个
mousemove
处理程序,并使用X/Y坐标确定要为哪个网格元素显示工具提示。然后您就不必为每个元素设置事件处理程序了。也就是说,如果网格是一个标准表,我会监听
元素本身上的事件,而不是每个
上的事件。特别是如果你仍然想实现一个计时器,我认为,在一个地方处理所有事情会更容易(否则,计时器可能会意外地在你已经鼠标移出的某个元素上执行,你的工具提示会来回闪烁或其他什么。如果你一次只想要一个工具提示,那么在一个地方管理它会更容易。)

非常感谢您的精彩解释。我对mouseover和mouseout事件也有一些重大问题。他们发射了错误的目标,比如子元素等等。经过两个小时的在线调查,我发现了这些事件。mouseenter和mouseleave将元素视为绕过子元素的块。有些项目没有很好地记录在原型中。再次感谢您的回答。@Chapsterj:FYI、
mouseenter
mouseleave
在除Internet Explorer之外的所有浏览器中都是“假”事件。只有IE在本地实现它们(IE做一些有用的事情的罕见案例之一),但Prototype检测它是否在IE中运行,如果没有,它提供自己的实现。不管怎样:看来你找到了一个好办法。我一直忘了Prototype内置了这些事件,否则我可能会提出同样的建议。谢谢你提醒我:)