Detecting HTML5 audio element file not found error

前端 未结 3 1413
暗喜
暗喜 2020-12-30 08:01

I am trying to make a the browser display an alert if an audio element src attribute points to a non existent file, however I do not get any response if I attach the the \"

相关标签:
3条回答
  • 2020-12-30 08:47

    You actually need to bind to the source tag for listening to error event when willing to detect "file not found error". Have a look at this fiddle.

    HTML:

    <p id="player1">Non existent audio files - click to play</p>
    
    <audio preload="none" controls>
        <source id="wav" src="http://example.com/non-existant.wav" />
        <source id="mp3" src="http://example.com/non-existant.mp3" />
        <source id="ogg" src="http://example.com/non-existant.ogg" />
    </audio>
    

    Script:

    $("#player1").on("click", function () {
        //I've tried catching the error like this - no effect
        alert("Trying to play file.");
        try {
            $('audio')[0].play();
        } catch (e) {
            alert("Error playing file!");
        }
    });
    
    $("audio").on("error", function (e) {
            alert("Error at audio tag level!");
        });
    
    // try this then
    $("#wav").on("error", function (e) {
            alert("Error with wav file!");
        });
    $("#mp3").on("error", function (e) {
            alert("Error with mp3 file!");
        });
    $("#ogg").on("error", function (e) {
            alert("Error with ogg file!");
        });
    

    It is described in this MDN article - section error handling. Let me know if it works for you.

    0 讨论(0)
  • 2020-12-30 08:49

    Getting audio errors

    $('audio').addEventListener('error', function failed(e) {
       // audio playback failed - show a message saying why
       // to get the source of the audio element use $(this).src
       switch (e.target.error.code) {
         case e.target.error.MEDIA_ERR_ABORTED:
           alert('You aborted the video playback.');
           break;
         case e.target.error.MEDIA_ERR_NETWORK:
           alert('A network error caused the audio download to fail.');
           break;
         case e.target.error.MEDIA_ERR_DECODE:
           alert('The audio playback was aborted due to a corruption problem or because the video used features your browser did not support.');
           break;
         case e.target.error.MEDIA_ERR_SRC_NOT_SUPPORTED:
           alert('The video audio not be loaded, either because the server or network failed or because the format is not supported.');
           break;
         default:
           alert('An unknown error occurred.');
           break;
       }
     }, true);
    

    Quoted from How to check if HTML5 audio has reached different errors

    0 讨论(0)
  • 2020-12-30 08:59

    This should handle both cases (e.g. using <audio> with <source> tags or using <audio src="">).
    See example fiddle.

    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);
        });
    });
    
    0 讨论(0)
提交回复
热议问题