Обнаружение наведения курсора мыши при загрузке страницы с помощью jQuery

Я хотел определить, находилась ли мышь над элементом при загрузке веб-страницы. Похоже, что это невозможно с jQuery - наведение курсора мыши, наведение и т. Д. Требует перемещения мыши; как и получение текущей позиции мыши (для сравнения с границами элемента).

Я не видел, чтобы этот конкретный вопрос задавался, но видел, как люди говорили, что различные части этого невозможны ...


person Ian Grainger    schedule 05.07.2011    source источник


Ответы (5)


Мое решение: добавить новое значение CSS с помощью псевдоселектора наведения, а затем проверить это. Однако кажется, что это работает только иногда.

CSS:

#el:hover {background-color: transparent; }

jQuery:

if ($('#el').css('background-color') == 'transparent')
person Ian Grainger    schedule 06.07.2011
comment
Это работает в большей степени, чем большинство решений, то есть никогда, поэтому я думаю, что это ваш лучший выбор. Сайты-розыгрыши определенно использовали это в свое время, чтобы определить, какие сайты вы посетили с помощью псевдоселекторов, так что приятно видеть законное использование. - person shelhamer; 06.07.2011

Вот как я это решил:

/** detect if the mouse was hovering over and element when the page loaded */
function detectHoverOnLoad(options) {
    var sel = options.selector

    if ($(sel + ':hover').length) {
        console.log('loaded while HOVERING over ' + sel)
    } else {
        console.log('loaded, but NOT hovering over ' + sel)
    }
}

потом я назвал это так:

detectHoverOnLoad({selector: '#headerNav'})

При дополнительном тестировании я заметил, что иногда, если мышь двигалась, она не всегда обнаруживала наведение, поэтому я добавил в else запасной вариант для обнаружения движения мыши над элементом:

function detectHoverOnLoad(options) {
    var sel = options.selector

    if ($(sel + ':hover').length) {
        console.log('loaded while HOVERING over ' + sel)
    } else {
        console.log('NOT hovering')
        $(sel).one('mousemove', function (e) {
            if ($(e.target).parents(sel).length) {
                console.log('MOUSEMOVEed over ' + sel)
            }
        });
    }
}
person TriumphST    schedule 24.09.2013
comment
Просто попытался написать JSFiddle, чтобы проверить это (jsfiddle.net/FB8se/4), но там похоже, проблема с порядком событий в JSFiddle - поскольку он загружает элементы после того, как пытается определить, над чем они плавают - поэтому переместился в JSBin и использовал предварительный просмотр в реальном времени, но, похоже, это не работает для меня: jsbin.com/uGUYeQA/1 - person Ian Grainger; 25.09.2013
comment
@IanGrainger Я не могу говорить о внутренней работе JSFiddle, но он работает для меня в реальном мире. - person TriumphST; 02.10.2013
comment
а jsbin? Это работает? Если нет, что я сделал иначе? - person Ian Grainger; 02.10.2013

РЕДАКТИРОВАТЬ: после тестирования я пришел к выводу, что это не сработает. Сэкономьте время и попробуйте что-нибудь еще.

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

Это немного уловка, но стратегия заключается в использовании element.offset () для получения координат элемента относительно документа вместе с element.width () и element.height () для создания ограничивающей рамки для положение мыши. Затем вы можете сравнить значения .pageX и .pageY события с этим ограничивающим прямоугольником.

Как вы правильно сказали, вам нужно событие для получения этих координат, что для вас не работает, так как они нужны вам немедленно. Тем не менее, задумывались ли вы о подделке события щелчка мыши путем вызова $ ('# some-element'). Trigger ('click') после загрузки документа? Вы можете зарегистрировать функцию для проверки ограничивающего прямоугольника с помощью $ ('# some-element) .click () заранее и посмотреть, что она делает.

person shelhamer    schedule 05.07.2011
comment
Дает ли $ ('# some-element'). Trigger ('click') текущие координаты мыши? Или какие-то неправильные, фальшивые мышиные координаты? - person Ian Grainger; 06.07.2011
comment
После некоторого тестирования кажется, что в большинстве случаев моя безумная идея обычно не генерирует координаты. События, запускаемые из-за trigger (), похоже, не заполняются значениями pageX и pageY. - person shelhamer; 06.07.2011

Почему нет! :)

Вот мое решение:

ДЕМО

Код из демонстрации:

function handler(ev) {
    var target = $(ev.target);
    var elId = target.attr('id');
    if( target.is(".el") ) {
       alert('The mouse was over'+ elId );
    }
}
$(".el").mouseleave(handler);
person Roko C. Buljan    schedule 06.07.2011

Я нашел самый простой способ, который возможен в мире! Забудьте о JQ hover, используйте его .mouseover и .mouseleave и определите функции для них обоих, это не создает никаких проблем при загрузке и после загрузки!

   $('li').mouseover(function () {
       codes
   } 


   $('li').mouseleave(function () {
       codes
   }
person ThisIsWilliam    schedule 18.08.2020
comment
Но, как я уже сказал в своем посте, у меня уже есть функция, я хочу знать, над чем закончилась мышь. Не дожидайтесь, пока мышь НАПРАВЛЯЕТСЯ чем-то, это просто! - person Ian Grainger; 20.08.2020