2010-03-08 3 views
0

Учитывая следующую таблицу и скрипт html, показанные ниже, у меня возникает проблема, когда появляется событие мыши после запуска мыши, даже если я не перемещаюсь мышь вне строки.jQuery: событие mouseleave, похоже, срабатывает, когда оно не должно быть

<script type="text/javascript" language="javascript"> 
    function highlightRows(iMainID) 
    { 
     $('tr[mainid=' + iMainID+ ']').each(function() { 
      if ($(this).attr('old') == undefined) { 
       $(this).attr('old', $(this).css('backgroundColor')); 
      } 
      $(this).animate({ backgroundColor: "#FFFFCC" }, 500); 
      $(this).mouseout(function() { 
       if ($(this).attr('old') != undefined) { 
        $(this).animate({ backgroundColor: $(this).attr('old') }, 500); 
       } 
      }); 
     });   
    } 
</script> 
<table> 
    <tr> 
     <td mainid="1" onmouseover='highlightRows(1)'><div>text</div></td> 
     <td mainid="1" onmouseover='highlightRows(1)'><div>text</div></td>  
     <td mainid="2" onmouseover='highlightRows(2)'><div>text</div></td> 
    </tr> 
<table> 
+2

Вы действительно не должны настраивать обработчик «mouseout» внутри обработчика «mouseover». Настройте оба обработчика отдельно, заранее, и сделайте это с помощью jQuery вместо атрибутов элемента onfoo. – Pointy

+0

Это случилось со мной, когда у меня были перекрывающиеся элементы. Компьютер переключается между двумя элементами и при этом входит и уходит очень быстро. –

ответ

2

Как указал Уокей и Джер, вы должны выбрать одну модель (JQuery) или другую (в любом случае в HTML), не смешивайте их.

Скорее всего, ваш двойной ввод связан с тем фактом, что вы подписали несколько раз на одно и то же событие. (Если вы дважды нажмете мышь, вы получите два обработчика событий mouseout, которые оба будут вызваны.)

Также следите за повторяющимися значениями «mainid». Это похоже на проблему и может быть причиной вашей проблемы.

+0

Мне нужны повторяющиеся значения mainid, потому что я хочу выделить несколько строк, которые содержат одно и то же основное значение. Единственная причина, по которой я использовал атрибут onmouseenter в элементе, заключался в том, что мой элемент управления восстанавливается с помощью ajax, поэтому метод document.ready только устанавливает события в начале – Jeremy

+1

@Jeremy: вам следует рассмотреть возможность использования JQuery «live»() функции тогда. Из того, что я могу сказать, он работает лучше и позволяет писать более чистый код. –

+0

live()! Спасибо, не знал об этом. – Jeremy

0

Вы, вероятно, хотите сделать что-то вроде этого:

function yourMouseOver(){...} 
function yourMouseOut(){...} 

с:

<td onmouseover="yourMouseOver()" onmouseout="yourMouseOut()">html</td> 

Установка уровня onmouseout событие каждый раз, когда onmouseover событие вызывается избыточно.

1

JQuery способ сделать это было бы просто использовать hover, установленный в $(document).ready функции и как @pointy сказал отказаться от onmouseover все вместе

$(document).ready(function(){ 
    $('tr').hover(function() { 
     if ($(this).attr('old') == undefined) { 
      (this).attr('old', $(this).css('backgroundColor')); 
     } 
     $(this).animate({ backgroundColor: "#FFFFCC" }, 500); 
    }, function() { 
     if ($(this).attr('old') != undefined) { 
      $(this).animate({ backgroundColor: $(this).attr('old') }, 500); 
     } 
    }); 
}); 
+0

Проблема, с которой я столкнулась при использовании document.ready, заключалась в том, что строки моих таблиц находятся на панели обновлений, которая обновляется по таймеру, поэтому, когда документ первоначально загружает события, они устанавливаются, но после обновления панели обновления события теряются – Jeremy

1

почему бы не использовать .hover?

$('tr[mainid=' + iMainID+ ']').hover(
     function() 
     { 
      $(this).addClass('hoverClass'); 
     }, 
     function() 
     { 
      $(this).removeClass('hoverClass'); 
     } 
    ); 
+0

Я должен согласиться, событие зависания делает его настолько легким. – ryanulit