У меня возникли проблемы с onmouseout
функцией в абсолютном положенном div. Когда мышь попадает в дочерний элемент в div, происходит событие mouseout, но я не хочу, чтобы оно срабатывало, пока мышь не вышла из родительского элемента, абсолютный div.
Как я могу предотвратить mouseout
запуск события, когда оно попадает в дочерний элемент БЕЗ jquery.
Я знаю, что это как-то связано с пузырями событий, но мне не повезло узнать, как это решить.
Я нашел похожий пост здесь: Как отключить события mouseout, запускаемые дочерними элементами?
Однако это решение использует jQuery.
Ответы:
Я сделал быструю демонстрацию JsFiddle, со всеми необходимыми CSS и HTML, посмотрите ...
РЕДАКТИРОВАТЬ ИСПРАВЛЕННУЮ ссылку для кросс-браузерной поддержки http://jsfiddle.net/RH3tA/9/
Обратите внимание, что это проверяет только непосредственного родителя, если родительский div имел вложенные дочерние элементы, то вы должны каким-то образом пройти через родительские элементы, ища «оригинальный элемент»
РЕДАКТИРОВАТЬ пример для вложенных детей
РЕДАКТИРОВАТЬ Исправлено для, надеюсь, кросс-браузер
И новый JSFiddle , EDIT обновил ссылку
источник
mouseleave
правильный ответИспользование
onmouseleave
.Или в jQuery используйте
mouseleave()
Это именно то, что вы ищете. Пример:
или в jQuery:
пример здесь .
источник
onMouseLeave
это то, что я в конечном итоге тоже использовал, так как он не пузырится.mouseleave
не может быть отмененоДля более простого решения CSS, которое работает в некоторых случаях ( IE11 или новее ), можно удалить детей,
pointer-events
установив их вnone
источник
pointer-events
свойствоВот более элегантное решение, основанное на том, что было ниже. это объясняет всплеск событий от более чем одного уровня детей. Это также объясняет кросс-браузерные проблемы.
источник
this
из строки определения функции, упомянутой @GregoryLewis, исправленную проблему. Также для большей кросс-браузерной поддержки попробуйте это: if (window.addEventListener) {document.getElementById ('parent'). AddEventListener ('mouseout', onMouseOut, true); } else if (window.attachEvent) {document.getElementById ('parent'). attachEvent ("onmouseout", onMouseOut); }Спасибо Амджаду Масаду, который вдохновил меня.
У меня есть следующее решение, которое работает в IE9, FF и Chrome, и код довольно короткий (без сложного замыкания и поперечных дочерних элементов):
источник
вместо onmouseout используйте onmouseleave.
Вы не показали нам свой конкретный код, поэтому я не могу показать вам на вашем конкретном примере, как это сделать.
Но это очень просто: просто замените onmouseout на onmouseleave.
Вот и все :) Итак, все просто :)
Если вы не уверены, как это сделать, см. Объяснение:
https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_onmousemove_leave_out
Мир торта :) Наслаждайтесь этим :)
источник
Если вы используете jQuery, вы также можете использовать функцию "mouseleave", которая справится со всем этим для вас.
do_something сработает, когда мышь войдет в целевой целевой элемент или любого из его дочерних элементов, do_something_else сработает только тогда, когда мышь покинет целевой целевой элемент и любой из его дочерних элементов.
источник
Я думаю, что Quirksmode имеет все ответы, которые вам нужны (разные всплывающие окна браузеров и события mouseenter / mouseleave ), но я думаю, что наиболее распространенным выводом для этого беспорядочного всплывающего события является использование инфраструктуры, такой как JQuery или Mootools (которая имеет mouseenter и события mouseleave , которые в точности соответствуют вашей интуиции).
Посмотрите, как они это делают, если вы хотите, сделайте это сами,
или вы можете создать свою собственную версию Mootools для «скудного среднего» только с частью события (и его зависимостями).
источник
Пытаться
mouseleave()
Пример :
;)
источник
Я нашел очень простое решение,
просто используйте событие onmouseleave = "myfunc ()", чем событие onmousout = "myfunc ()"
В моем коде это сработало !!
Пример:
Тот же пример с функцией mouseout:
Надеюсь, поможет :)
источник
Хотя решение вы упомянули изез JQuery, MouseEnter и MouseLeave являются носителями событий DOM, так что вы можете использовать без JQuery.
источник
Есть два способа справиться с этим.
1) Проверьте результат event.target в вашем обратном вызове, чтобы увидеть, соответствует ли он вашему родительскому div
2) Или используйте захват событий и вызовите event.stopPropagation в функции обратного вызова.
источник
Я заставляю это работать как шарм с этим:
Ах, и
MyDiv
тег выглядит так:Таким образом, когда onmouseout переходит к ребенку, внуку и т. Д.
style.display='none'
Он не выполняется; но когда onmouseout выходит из MyDiv, он запускается.Поэтому не нужно останавливать распространение, использовать таймеры и т. Д.
Спасибо за примеры, я мог бы сделать из них этот код.
Надеюсь, это кому-нибудь поможет.
Также может быть улучшено, как это:
А затем теги DIVs, как это:
Так что более общий, не только для одного div и нет необходимости добавлять
id="..."
на каждом слое.источник
Если у вас есть доступ к элементу, к которому событие прикреплено внутри
mouseout
метода, вы можете использовать,contains()
чтобы увидеть,event.relatedTarget
является ли дочерний элемент или нет.Как
event.relatedTarget
и элемент, в который перешла мышь, если это не дочерний элемент, вы удалили его из элемента.источник
На угловых 5, 6 и 7
Затем на
источник
Я проверяю смещение исходного элемента, чтобы получить координаты страницы границ элемента, а затем проверяю, что действие mouseout запускается только тогда, когда mouseout выходит за эти границы. Грязно, но это работает.
источник
источник
Если вы добавили (или имеете) класс CSS или идентификатор к родительскому элементу, то вы можете сделать что-то вроде этого:
Таким образом, материал выполняется только тогда, когда событие находится в родительском div.
источник
Я просто хотел чем-то поделиться с вами.
Я получил некоторое трудное время с
ng-mouseenter
иng-mouseleave
события.Тематическое исследование:
Я создал плавающее навигационное меню, которое переключается, когда курсор находится над значком.
Это меню было в верхней части каждой страницы.
ng-class="{down: vm.isHover}"
ng-mouseenter="vm.isHover = true"
ng-mouseleave="vm.isHover = false"
На данный момент все было хорошо и работало как положено.
Решение чисто и просто.
Поступающая проблема:
В конкретном представлении у меня есть список элементов.
Я добавил панель действий, когда курсор находится над элементом списка.
Я использовал тот же код, что и выше, для обработки поведения.
Эта проблема:
Я выяснил, когда мой курсор находится в плавающем меню навигации, а также в верхней части элемента, существует конфликт между собой.
Панель действий появилась, а плавающая навигация была скрыта.
Дело в том, что даже если курсор находится над плавающим меню навигации, элемент списка ng-mouseenter срабатывает.
Это не имеет смысла для меня, потому что я ожидал бы автоматического прерывания событий распространения мыши.
Я должен сказать, что я был разочарован, и я трачу некоторое время, чтобы выяснить эту проблему.
Первые мысли:
Я пытался использовать это:
$event.stopPropagation()
$event.stopImmediatePropagation()
Я объединил много событий указателя ng (mousemove, mouveover, ...), но ни одно из них мне не помогло.
CSS решение:
Я нашел решение с помощью простого свойства CSS, которое я использую все больше и больше:
По сути, я использую это так (в моих элементах списка):
С этим хитрым, события ng-mouse больше не будут вызываться, и мое плавающее меню навигации больше не будет закрывать себя, когда курсор находится над ним и над элементом из списка.
Чтобы идти дальше:
Как и следовало ожидать, это решение работает, но мне оно не нравится.
Мы не контролируем наши события, и это плохо.
Кроме того, у вас должен быть доступ к области
vm.isHover
действия, чтобы достичь этого, и это может быть невозможным или невозможным, но грязным в той или иной мере.Я мог бы поиграть, если кто-то захочет посмотреть.
Тем не менее, у меня нет другого решения ...
Это длинная история, и я не могу дать вам картошку, поэтому, пожалуйста, прости меня, мой друг.
Во всяком случае,
pointer-events: none
это жизнь, так что запомни это.источник