Script.aculo.us События в быстрой последовательности приводит к ошибке отображения ...? - PullRequest
0 голосов
/ 02 октября 2009

Использование script.aculo.us Effect.Highlight для события onMouseOver работает отлично - если пользователь только один раз наводит мышью на DIV. Если они наведут курсор мыши на DIV во время выполнения эффекта, другой эффект будет запланирован (или запущен параллельно, в зависимости от того,

{очередь: 'конец'}

включено).

Есть ли в script.aculo.us встроенный способ предотвращения этого, так что DIV будет выделять себя только в том случае, если пользовательская мышь находится над DIV в состоянии покоя? В противном случае, я думаю, что я мог бы сохранить переменную состояния, которая будет восстановлена ​​до «отдыха»:

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

Ранее я замечал похожие ситуации: например, Effect.Shake, если вызываться несколько раз, заставляет DIV дрожать в более широком кадре.

Кроме того, эту проблему можно увидеть на демонстрационном сайте, если вы быстро кликните по демке несколько раз: нажмите, чтобы увидеть демо

Ответы [ 3 ]

1 голос
/ 02 октября 2009

Придумал решение, похожее на то, что я предложил в вопросе, похоже, работает:

$('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')}});
}
0 голосов
/ 02 октября 2009

Так как у их демонстрации основного момента есть та же самая проблема, я представляю, что это просто построено таким образом.

Я не знаком с библиотекой Scriptaculous или прототипом, на котором она была построена. Однако, взглянув на их исходный код для Effect.Highlight ( в настоящее время строка 474 кода ), мы можем увидеть, что мы можем сделать, чтобы исправить вашу проблему.

Я на самом деле не пробовал это, но я хотел бы попробовать что-то вроде этого:

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;
 }
}
0 голосов
/ 02 октября 2009

Событие onMouseOver будет срабатывать каждый раз, когда вы наводите курсор мыши на элемент. Script.aculo.us не имеет встроенного способа проверить, что вы просите.

Однако, что вы можете сделать, это добавить класс onMouseOver к элементу с именем «fired», и, если вы видите, что этот класс не запускается, вызывайте указатель мыши.

Вы также можете добавить таймер в onMouseOut, поэтому, если они попытаются навести курсор мыши на элемент, прежде чем таймер закончится, он не будет выделен. Я признаю, это может стать волосатым, хотя.

...