Повторяющиеся вызовы onmouseover / onmouseout для тега li - PullRequest
0 голосов
/ 07 декабря 2011

У меня есть следующий код. (Вы можете скопировать его в файл для отладки в Firefox и просмотреть результаты на вкладке Console в Firebug).

Когда я добавляю onmouseover envent к тегам li и перемещаю мышь в область li, появляется информация о консоли.

Проблема в том, что когда я перемещаю мышь с изображения (логотип Google) на текст под ним, выводится многократная информация. Почему срабатывает событие onmouseout, так как я не покидаю область li?

Что я должен сделать, чтобы предотвратить запуск событий onmouseout в этой ситуации.

Спасибо!

<html>
<body>

<div>
    <ul>
        <li onmouseover="console.info('over')" onmouseout="console.info('out')" style="float:left;display:block;width:30%;height:200px;border: 2px solid red;">
            <img src="https://www.google.com/intl/en_com/images/srpr/logo3w.png">
            <br/>
            <br/>
            <a href="#">Google</a>
        </li>
        <li style="float:left;display:block;width:30%;">
            <img src="https://www.google.com/intl/en_com/images/srpr/logo3w.png">
            <br/>
            <br/>
            <a href="#">Google</a>
        </li>
        <li style="float:left;display:block;width:30%;">
            <img src="https://www.google.com/intl/en_com/images/srpr/logo3w.png">
            <br/>
            <br/>
            <a href="#">Google</a>
        </li>
    </ul>
</div>

</body>
</html>

Ответы [ 2 ]

3 голосов
/ 07 декабря 2011

События пузырь вверх по дереву DOM .Поэтому, когда курсор покидает элемент img, генерируется событие mouseout и запускается обработчик события, связанный с родительским элементом li.

Существует два пути , которые вы можетеиметь дело с этой ситуацией:

Предотвращение всплытия события

Если вы хотите предотвратить всплытие события, вы назначаете обработчик события для элемента, из которого происходит событиеи вызовите метод stopPropagation объекта event (или свойство cancelBubble в IE):

function handler(event) {
    event = event || window.event; // IE
    if(event.stopPropagation) {
        event.stopPropagation();   // W3C
    }
    else {
        event.cancelBubble = true; // IE
    }
}

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

Проверка источника события

Вы можете получить ссылку на элемент, откуда происходит событие, с помощью event.target (или event.srcElement в IE).Обработчик событий, который вы привязываете к элементу li, должен выглядеть следующим образом:

function handler(event) {
    event = event || window.event; // IE
    var target = event.target || event.srcElement; // IE

    if(target === this) {   // event originated where the handler was bound to
        console.info('out');
    }
}

и вызывать его с помощью

onmouseout="handler.call(this, event);"

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


Я рекомендую прочитать статьи об обработке событий на quirksmode.org .

0 голосов
/ 07 декабря 2011

Дополнительно к onMouseOver и onMouseOut существует концепция onMouseEnter и onMouseLeave. На самом деле я не знаю, как это implemented в разных браузерах. Я иду с JQuery, который делает все для меня. Прочитайте все об этом здесь , с хорошим примером того, что происходит при использовании различных событий внизу страницы.

...