如何在jQuery mouseleave()上停止音频

时间:2018-09-26 00:30:22

标签: javascript jquery

我正在使用javascriptkit.com提供的一些代码,这些代码可动态创建音频元素并加载给定的源文件。我对其进行了一些修改,以设置循环属性,然后在jQuery mouseenter()上连续播放。这一切都正常工作。

我添加了一个功能stopSound和jQuery mouseleave()来触发该stop方法,但是音频继续播放,而无需将鼠标放在该元素上。控制台没有显示任何错误,但是失败了。

这是代码

jQuery(function($) {

// Mouseover/ Click sound effect- by JavaScript Kit (www.javascriptkit.com)
// Visit JavaScript Kit at http://www.javascriptkit.com/ for full source code
// http://www.javascriptkit.com/script/script2/soundlink.shtml

var mimetype = { 
    "mp3": "audio/mpeg",
    "mp4": "audio/mp4",
    "ogg": "audio/ogg",
    "wav": "audio/wav"
}

function soundFx(sound='')
{
    var audioElement = document.createElement('audio');
    if (audioElement.canPlayType)
    { 
        for (var i=0; i<arguments.length; i++)
        {
            var src = document.createElement('source');
            src.setAttribute('src', arguments[i]);
            if (arguments[i].match(/\.(\w+)$/i))
                src.setAttribute('type', mimetype[RegExp.$1]);
            audioElement.appendChild(src);
        }

        audioElement.playsoundFx = function(){
            audioElement.setAttribute('loop','loop');
            audioElement.play();
        }

        // this added method does not execute
        audioElement.stopSound = function() {
            audioElement.pause();
            audioElement.currentTime = 0;
        }

        return audioElement;
    }
    else{
        return {playsoundFx:function(){
            throw new Error("Your browser does not support HTML5 audio");
            }
        }
    }
}

// sound fx trigger
$.fn.runsoundFx = function(soundfile='') {
    this.mouseenter(function() {
        soundFx(soundfile).playsoundFx();
    });
    this.mouseleave(function() {
        soundFx().stopSound();
    });
};

});

我需要在代码中做什么才能使音频在mouseleave上停止?


更新9/26

该代码现在可以与@PatrickEvans提供的已检查解决方案一起使用,请务必阅读他的回答,因为我保留了原始问题。

如果有人想在文档中使用它,则按ID,类或元素名称将声音附加到元素的方法是:

$("#myelement").runsoundFx("/url/to/file.mp3");

或附加到所有图像

$("img").runsoundFx("/url/to/file.mp3");

或将相同的音频附加到多个类和/或ID和元素名称

$(".myclass, .otherclass, #myId, strong").runsoundFx("/url/to/file.mp3");

1 个答案:

答案 0 :(得分:1)

soundFx()将在调用它时创建并返回一个新的音频实例。它不会返回上一个调用中创建的实例。您将需要修改代码以跟踪声音实例,进行测试以查看是否已经创建了声音实例,如果是则返回它,否则创建它并将其添加到跟踪器中。

例如,您可以使用源URL作为键来创建Map列表。

var audioMap = new Map();

function soundFx(sound='') {
  if(audioMap.has(sound)){
    return audioMap.get(sound); 
  }

  //rest of your creation code

  //add instance to map before returning it
  audioMap.set(sound,audioElement);
  return audioElement;
}

然后在鼠标左键中传递源值

$.fn.runsoundFx = function(soundfile='') {
    this.mouseenter(function() {
        soundFx(soundfile).playsoundFx();
    });
    this.mouseleave(function() {
        soundFx(soundfile).stopSound();
    });
};