Статьи

Написание подключаемого модуля Mousestop с использованием jQuery

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

Я хотел перестроить эту функциональность и закончил тем, что написал свой собственный маленький плагин для mousestop в jQuery, которым я поделился. Это довольно простой маленький фрагмент кода, который в основном срабатывает, когда мышь останавливается над определенным элементом с несколькими опциями для таймеров.

Вы можете проверить документацию здесь: плагин jQuery mousestop
Также проверьте это в действии с моим плагином всплывающей подсказки здесь: плагин всплывающей подсказки jQuery

1. Событие остановки мыши

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

var movementTimer = null; $("#element").mousemove(function(e) { clearTimeout(movementTimer); movementTimer = setTimeout(function() { //do something here }, 300); }) 

2. Остановка таймера при наведении мыши

У нас работает mousestop, но что теперь происходит, когда мы отключаемся от элемента? Мы бы не хотели, чтобы событие mousestop сработало, поскольку технически мы не останавливаемся на элементе. Все, что нам нужно сделать здесь, это добавить событие mouseout, которое очищает наш таймер, чтобы убедиться, что оно не выполняется.

 var movementTimer = null; $("#element").mouseout(function(e) { clearTimeout(movementTimer); }) 

3. Установка льготного периода

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

 var counter = 0; var counterMax = 20; var movement = false; elem .mouseover(function(e) { movement = true; //check if movement has stopped to a maximum time of 100*counterMax, after that event will not run at all unless you re-mouseover displayTimer = setInterval(function() { counter++; if(counter < counterMax) { if(!movement) { //run some code } //else do nothing, just iterate } }, 100) }) [/js] This starts a timer that checks to see if movement has stopped, which would be set by our previous timer. The max here is 20 intervals for 100 milliseconds each giving us a two second grace period. Since this timer now controls our function, if it does not execute within the grace period, we are done. 

4. Получение правильных координат Здесь есть еще один важный момент, который мы должны добавить. Так как мы запускаем это из события mouseover, наши координаты event.pageX и event.pageY будут от того места, где они вошли в элемент, однако нам, вероятно, понадобится положение мыши там, где оно находится сейчас, пока мышь движется вокруг. [JS] var x = null; var y = null; var motionTimer = null; $ ( "# Элемент"). MouseMove (функция (е) { x = e.pageX; y = e.pageY; })

5. Соединяем все вместе

Теперь мы можем собрать все это в плагин, как показано ниже. Этот маленький плагин jQuery имеет менее 100 строк кода и размер менее 1 КБ при минимизации.

(Функция ($)
{
var defaultSettings =
{
timeToStop: null, // количество времени остановки, даже до того момента, когда он больше не будет работать
delayToStop: «300», // задержка для того, что считается «остановкой»
onMouseout: null, // функция, запускаемая при наведении мыши на наш элемент
onStopMove: null // функция, запускаемая, когда мы снова начинаем движение после остановки
};

$ .fn.mousestop = function (func, settings)
{
settings = $ .extend ({}, defaultSettings, settings || {});

вернуть this.each (function ()
{
var elem = $ (это);

var движение = ложь;

var displayTimer = null
var motionTimer = null;

// нужен только этот кусок, если есть ограничение по времени, когда может произойти остановка мыши.
if (settings.timeToStop! = null)
{
var x = null;
var y = null;

счетчик переменных = 0;
var counterMax = Math.ceil (settings.timeToStop / 100);

эль
.mouseover (функция (е)
{
движение = правда;

// проверяем, остановилось ли движение до максимального времени 100 * counterMax, после этого событие вообще не запустится, пока вы не повторно наведите курсор мыши
displayTimer = setInterval (function ()
{
Счетчик ++;

if (counter <counterMax) {if (! motion) {clearTimeout (displayTimer); // сбрасываем тайм-аут, чтобы избежать каких-либо шуток // устанавливаем координаты для события из координат документа e.pageX = x; e.pageY = y; FUNC (е); } // иначе ничего не делаем, просто повторяем} else motion = false; // мы можем отключить это, чтобы избежать использования таймаута в mousemove}, 100)})} elem .mouseout (function (e) {// kill this таймеры, если он по-прежнему работает mouseout}) .mousemove (function (e) {x = e.pageX; y = e.pageY; if (движение) // если мы наведем курсор на это, будет на {// очистить таймер и установить снова, это определит наша «остановка», которая произойдет, если мышь будет в том же положении в течение времени delayToStop или более миллисекунд. ;}, settings.delayToStop);} else {settings.onStopMove (e); // вызвать наше перемещение мыши - это после остановки движения = true;}}); }); }}) (jQuery); [/ js] Мы действительно предоставляем три типа функциональности для нашего плагина, которые мы можем использовать сейчас. Первый - это остановка мыши, которая срабатывает каждый раз, когда мы останавливаем мышь на определенный период времени. Вторая функциональность позволяет нам установить событие mousestop только один раз, что мы можем сделать, просто установив тайм-аут на очень большое значение. Третий - это льготный период, когда событие mousestop может быть активировано вообще. Этот плагин действительно не занимал так много времени, особенно с использованием jQuery, просто нужно было установить некоторые флаги в правильном порядке, чтобы таймеры работали правильно. В общем, хороший маленький плагин, который дает нам дополнительное событие для игры в нашем коде.

об авторе
websanova
Роберт Нова - веб-разработчик, который особенно интересуется плагинами jQuery и ищет способы помочь разработчикам создавать свои проекты как можно быстрее. Он является основателем www.websanova.com , сайта, посвященного плагинам jQuery и другим предпринимательским ресурсам.