2013-07-23 2 views
0
jQuery('#test .track, :not(.btn)').mousemove(function(e){ 
     var el = e.target; 
     jQuery(el).mouseover(function (e) { 
      e.stopPropagation(); 
      jQuery(this).addClass('highlight'); 
      jQuery(this).click(function(){ 
       jQuery('.active').removeClass('active'); 
       show_data(this); // a small function for showing this class, css 
      }) 
     }).mouseout(function() { 
      jQuery(this).removeClass('highlight'); 
     }); 

}); 

Этот код разбивает мой firefox при непрерывном нажатии. Я использую этот код, чтобы выделить текущий элемент DOM под мышью.jQuery - mousemove crashing my firefox

+1

может быть, вы можете заменить JQuery с $. Это, по сути, одно и то же, но сделать коды лучше. – revolver

+0

Ошибка типа: $ не является функцией – user007

+1

Использование $ - не большая проблема, у вас есть 2 обработчика событий внутри mousemove. Может, в этом и проблема. – Praveen

ответ

1

Проблема заключалась в том, что ваша модель регистрации событий вы регистрировали mouseover и mouseout обработчиками указанных элементов всякий раз, когда мышь перемещается по ним, в результате могут быть зарегистрированы тысячи обработчиков событий для каждого из них. Это может привести к тому, что браузер приостановит выполнение js.

Попробуйте

jQuery('#test .track, :not(.btn)').mouseover(function (e) { 
    e.stopPropagation(); 
    jQuery(this).addClass('highlight'); 
}).mouseout(function() { 
    jQuery(this).removeClass('highlight'); 
}).click(function(){ 
    jQuery('.active').removeClass('active'); 
    show_data(this); // a small function for showing this class, css 
}); 

Демо: Fiddle

+0

Спасибо, что работает – user007

2

Кажется, что вы прикрепляете новый обработчик событий каждый «галочку» мыши, перемещающийся по целевым элементам. Это может очень быстро привести к сотням, тысячам обработчиков событий. Это плохая новость в Vanilla JavaScript; в jQuery это ядерное оружие.

Затем вы добавляете новый обработчик событий click каждый раз, когда мышь перемещается по целевому элементу, устанавливая другое ядерное оружие.

Затем вы нажимаете несколько раз ... и BOOM!

+0

Как это исправить? – user007

+0

Вы почти никогда не должны назначать обработчик события внутри другого обработчика события. Посмотрите на свой код, подумайте о том, что вы пытаетесь сделать ... потому что, честно говоря, я не могу сказать. Я * думаю * вы должны взять свой класс .highlight' в CSS и заменить его на '#test .track: hover,: not (.btn): hover' применить стили, а затем просто удалить весь этот скрипт, кроме обработчик 'click' и поместите ваш' #test .track,: not (.btn) 'selector в функцию' jQuery'. –

0

Если вы хотите, чтобы получить элемент на основе координат мыши.

var element = $(selector) 
function handler(e){  
    var x = event.clientX, y = event.clientY, 
    var elementMouseIsOver = document.elementFromPoint(x, y); 
    $(elementMouseIsOver).addClass('yourClass'); 
} 
element.on('click', handler); 
element.on('mouseover', handler); 

Если вы хотите, чтобы получить элементы на основе парения

var element = document.querySelectorAll(':hover'); 

Если вы хотите применить стили при наведении курсора мыши и удалить курсор мыши

$(ele).hover(function(){ 
    // Hover Event 
    $(this).addClass('xyz'); 
}, function(){ 
    // Hover done Event 
    $(this).removeClass('xyz'); 
});