Слушатель событий Javascript mousemove не работает должным образом

Я пытаюсь сделать определенный элемент <p> видимым, только когда моя мышь находится внутри элемента <iframe> и перемещается внутри элемента <iframe>. Если мышь находится за пределами элемента <iframe> или неподвижна в элементе <iframe>, то она должна скрыть элемент <p>.

Я использую прослушиватель событий mousemove, который после просмотра https://developer.mozilla.org/en-US/docs/Web/Events/mousemove определяет событие mousemove как «Событие mousemove запускается, когда указывающее устройство (обычно мышь) перемещается над элементом»..

Однако, если вы протестируете код в фрагменте HTML, это не похоже на меня, потому что как только моя мышь перемещается внутри элемента <iframe>, он делает <p>element, однако он все равно исчезает через некоторое время, срабатывает тайм-аут и скрывает его. . Перемещение мыши в элементе iframe не вызывает повторного запуска события mousemove, пока вы не переместите мышь за пределы окна iframe, а затем снова вернете ее внутрь.

Кроме того, событие mousemove не всегда запускается, когда я перемещаю мышь из-за пределов элемента <iframe> внутрь элемента.

Может ли кто-нибудь объяснить мне, почему событие mousemove не запускается снова, когда мышь перемещается внутри элемента <iframe>, а также покажите мне, как я могу добиться, чтобы мой элемент <p> появлялся только тогда, когда мышь находится внутри элемента <iframe> и перемещается внутри элемент.

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

Большое спасибо и счастливого Рождества.

function showP() {
  document.getElementById('p').classList.remove('hide');
}

function hideP() {
  document.getElementById('p').classList.add('hide');
}

var timer;

document.getElementsByClassName('iframe')[0].addEventListener('mousemove', function() {
  console.info('Entered iframe');
  clearTimeout(timer);
  showP();
  timer = setTimeout(hideP, 3000);
});
.hide {
  display: none;
}
<iframe class = "iframe" src = "https://test.com/" width = "100px" height = "100px">

</iframe>

<p id = "p" class = "hide">
  Showing P Tag
</p>

Вы пробовали onmouseover и onmouseout? Когда onmouseover запускается для iframe, вы показываетеP, а когда onmouseout запускается для iframe, вы скрываетеP.

Vlam 26.12.2018 02:51

@vlam Я пробовал и onmouseover, и onmouseout, однако они срабатывают только при входе в элемент извне или наоборот для onnmouseout и не работают, когда вы перемещаете мышь внутри элемента. В настоящее время кажется, что событие mousemove ведет себя точно так же, как и событие onmouseover, то есть оно запускается только один раз, когда вы перемещаете мышь из-за пределов iframe внутрь него. Но это не решает мою другую проблему, которая заключается в том, чтобы он повторно запускался, когда мышь перемещается внутри элемента.

SShah 26.12.2018 02:56
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
1 105
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Использование iframe может быть непростым делом. Вы можете попробовать обернуть iframe в div и вместо этого настроить этот div в своем JS:

<div class = "iframe" width = "100px" height = "100px">
   <iframe src = "https://test.com/" width = "100px" height = "100px">
   </iframe>
</div>

Я уверен, что таким образом вы также можете использовать onmouseover и onmouseout или любое другое событие. Возможно, вам понадобится добавить CSS:

iframe {
pointer-events: none;
}

см. рабочий код: https://codepen.io/geochanto/pen/wRqvqo

Просто попробовал, но, к сожалению, после помещения его в div событие больше не запускается. См .: jsfiddle.net/jewyLqum/1.

SShah 26.12.2018 04:20

хорошо, вам нужно еще кое-что, добавить события-указатели CSS: none; для вашего <iframe>. Тогда это работает. Проверьте это: codepen.io/geochanto/pen/wRqvqo

geochanto 26.12.2018 18:31

Это не сработало, потому что ваш <iframe> все еще перекрывал <div class = "iframe">, поэтому ваше событие mousemove не обнаруживалось. Другой способ сделать это - разместить div над iframe.

geochanto 26.12.2018 18:33

Спасибо, установка pointer-events: none помогает заставить его работать, но теперь, к сожалению, из-за этого сайт, который я загрузил в свой Iframe, не может обнаружить ни одно из своих событий щелчка. Я нашел следующий stackoverflow.com/questions/9990536/…, который я могу использовать для обнаружения щелчка даже на контейнере div, а затем, надеюсь, если он сработает, передать событие в iframe, однако это все еще может быть неточным, поскольку я не могу определить для iframe, в котором позиция мыши было инициировано событием щелчка. У вас есть решение? Спасибо.

SShah 26.12.2018 19:42

затем вы можете играть с указателями-событиями и включать / отключать их, когда вам нужно. Я изменил его с помощью jQuery здесь: codepen.io/geochanto/pen/LMjVaB Это позволит щелкать, но только после перемещения мыши. Если время истекает, мышь должна переместиться, прежде чем вы сможете щелкнуть. Во всяком случае, есть много способов сделать это. На основании того, что вы просили, это работает. Если вам нужно что-то большее, пожалуйста, предоставьте полное описание того, чего вы пытаетесь достичь, иначе мы будем слишком долго ходить туда-сюда;)

geochanto 26.12.2018 21:26

Хорошо, дружище, большое спасибо, ты определенно ответил на мой вопрос и помог мне решить мою проблему. Чтобы дать вам представление о том, чего я пытался достичь, это то, что вы увидите, когда посмотрите любое видео YouTube в режиме рабочего стола. Когда вы наводите указатель мыши на видео, появляются элементы управления, и если вы перестанете перемещать мышь или переместите ее за пределы видеопроигрывателя, элементы управления исчезнут через некоторое время, и я хотел сделать наложение, подобное этому, для переключения между куча источников iframe :), но без нарушения событий мыши в источниках iframe.

SShah 26.12.2018 23:30

Другие вопросы по теме