Script.aculo.us Rapid Succession中的事件导致显示错误......?

时间:2009-10-01 20:04:45

标签: javascript scriptaculous effects highlight

在onMouseOver事件上使用script.aculo.us Effect.Highlight可以很好地工作 - 如果用户只将鼠标悬停在DIV上一次。如果他们在执行效果期间鼠标回到DIV上,则会安排另一个效果(或并行运行,具体取决于是否

  

{queue:'end'}

已启用。)

script.aculo.us是否有内置的方法来防止这种情况发生,因此如果用户鼠标在静止状态下的DIV上,DIV只会突出显示自己?否则我想我可以保留一个恢复为“休息”的状态变量:

  

afterFinish:function(obj){rest = true; }

我之前注意到类似的情况:例如,如果多次调用Effect.Shake会导致DIV在更宽的帧中抖动。

此外,如果您快速连续多次点击演示,可以在演示网站上看到此问题:click to see demo

3 个答案:

答案 0 :(得分:1)

提出类似于我在问题中提出的解决方案似乎有效:

$('id').writeAttribute('resting');
//
// other code here
//
if($('id').readAttribute('resting') == 'resting') {
    $('id').writeAttribute('resting',false); 
    new Effect.Highlight('id', {queue: 'end', startcolor:'#b3ff8d', endcolor:'#ffffff',afterFinish:function(obj) {obj.element.writeAttribute('resting')}});
}

答案 1 :(得分:0)

每次将鼠标悬停在元素上时,都会触发onMouseOver事件。 Script.aculo.us没有内置方法来检查你要求的内容。

但是,您可以做的是onMouseOver向名为“fired”的元素添加一个类,如果您看到该类不触发,则触发鼠标悬停。

您还可以向onMouseOut添加计时器,因此如果他们在计时器用完之前尝试将鼠标悬停在元素上,则不会突出显示。我承认,这可能会变得毛茸茸。

答案 2 :(得分:0)

由于他们的突出显示具有相同的问题,我想它只是这样构建的。

我不熟悉Scriptaculous库或构建它的Prototype。但是,浏览一下Effect.Highlight(currently line 474 of the code)的源代码,我们可以看到我们可以采取哪些措施来解决您的问题。

我还没有尝试过这个,但我想尝试的是这样的:

function MySiteSetup(){
 var highlight = new Effect.Highlight('id_of_element', [options]);

 var firing = false;
 var oldSetup = highlight.setup;
 highlight.setup = function(){
  if(firing) return; // Short circuit the effect if it's already firing

  firing = true;
  oldSetup();
  firing = false;
 }
}