JavaScript mouseover / mouseout проблема с дочерним элементом
У меня есть небольшая проблема, и я прошу вашей помощи. У меня есть элемент div , внутри которого у меня есть элемент img, такой как этот
<div id="parent" onmouseover="MyFuncHover()" onmouseout="MyFuncOut()">
<img id="child" src="button.png" style="visibility: hidden" />
</div>
<script type="text/javascript">
function MyFuncHover() {
// Here I have some code that makes the "child" visible
}
function MyFuncOut() {
// Here I have some code that makes the "child" invisible again
}
</script>
Как вы видите, изображение является дочерним элементомdiv . Я хочу, чтобы только когда я покину div, ребенок исчез. Тем не менее, похоже, что при наведении мыши на изображение вызывается функция MyFuncOut() (Поскольку, я полагаю, я оставляю div, наведя курсор на изображение). Я этого не хочу. случаться. Я хочу, чтобы функция MyFuncOut() вызывалась только тогда, когда я покидаю область div.
Я не знал, что когда вы наводите курсор мыши на дочерний элемент управления, это родитель вызывает событие mouseout (даже если я над ребенком, я все равно над родителем тоже). Я попался в ловушку, и мне нужен твой добрый совет. Спасибо!
Изменения
O. K. событие bubbling не будет отправлять событие " mouseout "родителю, когда я" mouseout " ребенку. Оно также не будет отправлять событие "mouseover "родителю, когда я" mouseover " ребенка. Это не то, что мне нужно. Мне нужно, чтобы событие "mouseout" родителя не отправлялось, когда я" наведу курсор мыши " на ребенка. Понял? Пузырение событий полезно, когда я не хочу, например, чтобы событие щелчка на дочернем элементе распространялось на родительский элемент, но это не мой случай. Что странно, так это то, что у меня есть другие элементы внутри того же родителя, которые не запускают событие "mouseout" родителя, когда я их "наведу".
4 ответа:
Вы можете использовать события "mouseenter" и "mouseleave", доступные в jquery, вот код ниже,
$(document).ready(function () { $("#parent").mouseenter(function () { $("#child").show(); }); $("#parent").mouseleave(function () { $("#child").hide(); }); });
Выше-прикрепить событие,
<div id="parent"> <img id="child" src="button.png" style="display:none;" /> </div>
Вы можете использовать Решение ниже, которое является чистым javascript, и я использовал его с успехом.
var container = document.getElementById("container"); var mouse = {x: 0, y: 0}; function mouseTracking(e) { mouse.x = e.clientX || e.pageX; mouse.y = e.clientY || e.pageY; var containerRectangle = container.getBoundingClientRect(); if (mouse.x > containerRectangle.left && mouse.x < containerRectangle.right && mouse.y > containerRectangle.top && mouse.y < containerRectangle.bottom) { // Mouse is inside container. } else { // Mouse is outside container. } } document.onmousemove = function () { if (document.addEventListener) { document.addEventListener('mousemove', function (e) { mouseTracking(e); }, false); } else if (document.attachEvent) { // For IE8 and earlier versions. mouseTracking(window.event); } }
Надеюсь, это поможет.
Просто добавьте оператор if в свою функцию MyFuncOut, которая проверяет, что целевой объект не является изображением
if (event.target !== imageNode) { imageNode.style.display = 'none' }
У меня тоже были проблемы с этим, и я не смог заставить его работать. Это то, что я сделал вместо этого, и это намного проще и не javascript, поэтому он быстрее и не может быть выключен.
div.container { opacity:0.0; filter:alpha(opacity="00"); } div.container:hover { opacity:1.0; filter:alpha(opacity="100"); }
Вы даже можете добавить переход css3 для непрозрачности, чтобы придать ему более плавный вид.