Javascript 如何检测/处理浏览器';播放媒体文件失败

Javascript 如何检测/处理浏览器';播放媒体文件失败,javascript,ajax,error-handling,media-player,soundmanager2,Javascript,Ajax,Error Handling,Media Player,Soundmanager2,我正在使用JavaScript来播放mp3文件。由于我无法控制的情况,我会定期链接到无法播放的文件。当这种情况发生时,我在Firebug中看到一条消息,解释该文件无法解码 无法解码媒体资源 因为我无法替换文件,所以我正在寻找一种方法来确定文件是否可以播放。该框架提供了一个onerror()方法,用于在脚本本身无法加载时执行,但在文件无法播放时不执行任何操作 虽然特定于SoundManager2的答案是可以接受的,但我更喜欢独立于任何特定库或框架的解决方案。如果您使用标准的符号,您可以使用此脚

我正在使用JavaScript来播放mp3文件。由于我无法控制的情况,我会定期链接到无法播放的文件。当这种情况发生时,我在Firebug中看到一条消息,解释该文件无法解码

无法解码媒体资源


因为我无法替换文件,所以我正在寻找一种方法来确定文件是否可以播放。该框架提供了一个
onerror()
方法,用于在脚本本身无法加载时执行,但在文件无法播放时不执行任何操作


虽然特定于SoundManager2的答案是可以接受的,但我更喜欢独立于任何特定库或框架的解决方案。

如果您使用标准的
符号,您可以使用此脚本连接到发生的任何音频错误:

function handleSourceError(e) { alert('Error loading: '+e.target.src) }
function handleMediaError(e) {
  switch (e.target.error.code) {
    case e.target.error.MEDIA_ERR_ABORTED:
      alert('You aborted the media playback.'); break;
    case e.target.error.MEDIA_ERR_NETWORK:
      alert('A network error caused the media download to fail.'); break;
    case e.target.error.MEDIA_ERR_DECODE:
      alert('The media playback was aborted due to a corruption problem or because the media used features your browser did not support.'); break;
    case e.target.error.MEDIA_ERR_SRC_NOT_SUPPORTED:
      alert('The media could not be loaded, either because the server or network failed or because the format is not supported.'); break;
    default:
      alert('An unknown media error occurred.');
  }
}

var toArray = Array.prototype.slice;
toArray.apply(document.getElementsByTagName('audio')).forEach(function(audio){
  audio.addEventListener('error', handleMediaError);
  toArray.apply(audio.getElementsByTagName('source')).forEach(function(source){
    source.addEventListener('error', handleSourceError);
  });
});
如果可以获得对
音频
实例的引用,则可以添加如下错误处理程序:

audioInstance.addEventListener('error', handleMediaError)

如果您使用的是标准的
符号,则可以使用此脚本连接到发生的任何音频错误:

function handleSourceError(e) { alert('Error loading: '+e.target.src) }
function handleMediaError(e) {
  switch (e.target.error.code) {
    case e.target.error.MEDIA_ERR_ABORTED:
      alert('You aborted the media playback.'); break;
    case e.target.error.MEDIA_ERR_NETWORK:
      alert('A network error caused the media download to fail.'); break;
    case e.target.error.MEDIA_ERR_DECODE:
      alert('The media playback was aborted due to a corruption problem or because the media used features your browser did not support.'); break;
    case e.target.error.MEDIA_ERR_SRC_NOT_SUPPORTED:
      alert('The media could not be loaded, either because the server or network failed or because the format is not supported.'); break;
    default:
      alert('An unknown media error occurred.');
  }
}

var toArray = Array.prototype.slice;
toArray.apply(document.getElementsByTagName('audio')).forEach(function(audio){
  audio.addEventListener('error', handleMediaError);
  toArray.apply(audio.getElementsByTagName('source')).forEach(function(source){
    source.addEventListener('error', handleSourceError);
  });
});
如果可以获得对
音频
实例的引用,则可以添加如下错误处理程序:

audioInstance.addEventListener('error', handleMediaError)

通常,您可以向加载资源的元素添加onerror事件侦听器。因此,例如,由于您正在进行音频处理,因此需要将事件侦听器附加到音频元素

//assume this html:
//<audio id="myaudio" src="http://badurl.com/mp3.mp3"></audio>
document.getElementById("myaudio").addEventListener("error",function(event){
  //do error handling here
});

通常,您可以向加载资源的元素添加onerror事件侦听器。因此,例如,由于您正在进行音频处理,因此需要将事件侦听器附加到音频元素

//assume this html:
//<audio id="myaudio" src="http://badurl.com/mp3.mp3"></audio>
document.getElementById("myaudio").addEventListener("error",function(event){
  //do error handling here
});

第二种解决方案只有在以编程方式创建声音时才有效。如果我依靠SoundManager2查找mp3链接并为其创建播放器,我无法访问它们的参数。@Keyslinger,然后将更改为使用onload事件:
soundManager.defaultOptions.onload=function(){}
第二种解决方案仅在我以编程方式创建声音时有效。如果我依赖SoundManager2查找mp3链接并为其创建播放器,则我无权访问它们的参数。@Keyslinger,然后将更改为使用onload事件:
soundManager.defaultOptions.onload=function(){}