Звук при наведении мыши воспроизводится дважды, если мышь перетаскивается на значок SVG внутри кнопки

#javascript #jquery #svg

#javascript #jquery #svg

Вопрос:

У меня есть проблема, которую я проверяю, например, на мой идентификатор #homeButton и воспроизводит звук, звук воспроизводится без каких-либо проблем, проблема возникает, когда вы перетаскиваете мышь на значок SVG внутри кнопки и снова нажимаете кнопку, звук воспроизводится, чего я не хочу, он должен тольковы сможете воспроизводить снова, как только мышь окажется за пределами кнопки.

Вот как я проверяю наведение:

 $(homeButton)
            .on('mouseover', function (event) {
                titleDisplay.innerText = 'Hem';
                hoverSound.play();
            })
            .on('mouseout', function (event) {
                titleDisplay.innerText = '';
            });
 

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

Эта часть меню homebutton в коде выглядит так:

 <g transform="translate(0 ,-1.3369) scale(0.9618028136579452)" class="sector selected" data-id="homeButton" data-index="1" id="homeButton"><path d="M35.35534 -35.35534A51.98570776668778 51.98570776668778 0 0 0-35.35534 -35.35534L-14.14214 -14.14214A21.389995436681446 21.389995436681446 0 0 1 14.14214 -14.14214Z"></path><use x="0" y="-35" width="10" height="10" fill="white" xlink:href="#homeSVG" transform="translate(-5,-5)"></use></g>
 

Тег path — это фактическая кнопка, а тег use — значок. Есть ли у кого-нибудь решение для невозможности воспроизведения звука до тех пор, пока вы не выйдете из кнопки полностью или не нажмете одну из других кнопок?

Это не обязательно делать с помощью jQuery, если вы можете сделать это с помощью простого JS, все в порядке

Вот изображение меню, если это поможет

При написании этого я, возможно, придумал одно решение, но еще не тестировал его, потому что мне нужно спать! Но это решение заключается в использовании одной переменной для каждой кнопки, например, homeSoundPlayed = false, conteactSoundPlayed = false . И это был код, о котором я тогда подумал:

 var homePlayed = false; //New line
var contactPlayed = false; //New line
        $(homeButton)
            .on('mouseover', function (event) {
                contactPlayed = false; //New line
                titleDisplay.innerText = 'Hem';
                if(!homePlayed){ //New line
                    hoverSound.play();
                    homePlayed = true; //New line
                }
            })
            .on('mouseout', function (event) {
                titleDisplay.innerText = '';
            });

        $(contactButton)
            .on('mouseover', function () {
                homePlayed = false; //New line
                titleDisplay.innerText = 'Kontakta Oss';
                if(!contactPlayed){ //New line
                    hoverSound.play();
                    contactPlayed = true; //New line
                }
            })
            .on('mouseout', function () {
                titleDisplay.innerText = '';
            });
 

Итак, я думаю, что при наведении курсора на любую кнопку все остальные кнопки с именем var имеют значение false, но не сбрасывают значение var для той, на которую вы в данный момент наводите курсор. Но тогда у меня возникает вопрос, как мне проверить, зависли ли вы за пределами меню.

Это просто решение, которое я придумал, если вы знаете лучшее, пожалуйста, скажите мне!

Ответ №1:

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

 .on('mouseout', function(event) {
  if (event.target !== this) return;

  // Do your logic here
});
 

событие.цель