JQuery - Как продолжить анимацию, когда мышь нависает над элементом?

Мне нужен способ выполнить какую-то функцию "whileonmouseover", чтобы продолжить анимацию, когда мышь над элементом...

Например, с учетом этой функции:

$(document).ready(function()
{
    function doAlert()
    {
        alert(1);
    }

    $('#button').hover(function()
    {
        doAlert();
    });
});

Предупреждение будет срабатывать один раз, когда мышь наводится над #button. Мне нужно, чтобы продолжить этот огонь с предупреждением, пока мышь остается над #button...

Я попытался выполнить какую-то функцию рекурсии для продолжения предупреждения до тех пор, пока не будет установлен триггер, заставляющий его остановить:

$(document).ready(function()
{
    var doLoop = true;

    function doAlert()
    {
        if (!doLoop) return;

        alert(1);
        doAlert();
    }

    $('#button').hover(function()
    {
        doAlert();
    }, function()
    {
        doLoop = false;
    });
});

Но это не удалось. Кажется, функция полностью игнорирует назначение doLoop = false в 'hover off'.

Можно ли это сделать?

Ответ 1

Я бы рекомендовал установить интервал вместо рекурсии, потому что, предполагая, что окончательное решение не просто предупреждает, а делает что-то неблокирующее, рекурсия во время зависания может быстро вызвать зависание памяти и невосприимчивость.

Что-то вроде:

var hoverInterval;

function doStuff() {
    // Set button background to a random color
    $("#button").css("background", "#" + Math.floor(Math.random() * 16777215).toString(16));
}

$(function() {
    $("#button").hover(
        function() {
            // call doStuff every 100 milliseconds
            hoverInterval = setInterval(doStuff, 100);
        },
        function() {
            // stop calling doStuff
            clearInterval(hoverInterval);
        }
    );
});

Ответ 2

Я бы предложил переместить следующую часть за пределы функции $(document).ready():

var doLoop = true;

function doAlert()
{
    if (!doLoop) return;

    alert(1);
    doAlert();
}

Итак, попробуйте этот код:

var doLoop = true;

function doAlert()
{
    if (!doLoop) return;

    alert(1);
    doAlert();
}

$(document).ready(function()
{
    $('#button').hover(function()
    {
        doAlert();
    }, function()
    {
        doLoop = false;
    });
});