2016-09-03 2 views
0

In einer Django-Website, die ich erstellt habe, können Benutzer Videos hinzufügen, um andere zu sehen und zu kommentieren. Nicht alle Benutzer haben Geräte, die Videowiedergabe unterstützen, und daher möchte ich für solche Randfälle erlauben, Video-Download.So fügen Sie Ereignis-Listener in JS hinzu, wenn HTML5-Video nicht geladen werden kann

Um dies zu tun, muss ich zuerst erkennen, ob das Video fehlgeschlagen ist oder nicht. Wie kann ich das machen? Ich habe unten eine funktionierende Lösung, aber mit Problemen, die ich lösen muss.


Derzeit versuche ich folgendes in meiner Django-Vorlage (wo alle Videos eine ListView mit aufgeführt sind). Das funktioniert tatsächlich, aber bricht, wenn ich die Seite neu zu laden:

<script> 
    var videos = document.querySelectorAll('video'); 
    for (var i = 0; i < videos.length; i++) { 
     (function() { 
      var v = videos[i]; 
      var s = v.querySelector('source'); 
       //console.log(source); 
      s.addEventListener('error', function(ev) { 
       var d = document.createElement('div'); 
       d.innerHTML = v.innerHTML; 
       console.log("hello") 
       console.log(v); 
       v.parentNode.replaceChild(d, v); 
      }, false); 
     }()); 
    } 
</script> 

D.h. zuerst gehe ich durch alle video Tags in der HTML-Seite, dann suche ich für jedes Tag das source-Tag nach innen. Als Nächstes versuche ich, dem Quell-Tag einen Ereignis-Listener hinzuzufügen, den Fehler abzufangen und etwas zu verarbeiten. Ich habe jedoch festgestellt, dass der Ereignis-Listener nicht ausgelöst wird, wenn ich die Seite neu lade. Eventuell wird der Event-Handler zu spät hinzugefügt. der Browser hat bereits versucht, auf die Videoquelle zuzugreifen, bevor der Ereignishandler hinzugefügt wurde. Kann mir hier jemand helfen? Danke im Voraus.

+0

Versuchen Sie, die 'error' Event-Handler auf dem Videoelement setzen und nicht auf dem Quellelement. Verwenden Sie auch etwas, das tatsächlich einen Fehler verursacht, wie eine ungültige URL oder ein Video mit einem Format, von dem Sie wissen, dass es vom Browser nicht unterstützt wird? –

+0

Ahh, scheint die HTML5-Spezifikation die Fehlerbehandlung auf das Quellelement anstelle des Medienelements verschoben. Da es beim Nachladen anscheinend nicht funktioniert, kann ich nur daran denken, dass der Ereignishandler möglicherweise zu spät hinzugefügt wird. Der Browser hat bereits versucht, auf die Videoquelle zuzugreifen, bevor der Ereignishandler hinzugefügt wurde. Und das einzige, was mir dabei einfällt, wäre, wenn das tatsächlich der Fall wäre, einen Inline-Event-Handler hinzuzufügen. '' –

+0

@PatrickEvans: macht Sinn. Ich bin eigentlich ein Backend-Entwickler und ziemlich neu in JS. Also, was du meinst, ist, dass ich den JS-Code in eine Funktion namens 'errorHandler' einschließen und sie im Quell-Tag inline nennen soll, richtig? Wäre gut, wenn Sie das als eine anschauliche Antwort einschließen würden. –

Antwort

0

Sie load Falle window können src von <video> Element zu setzen, Node.replaceChild(), download Attribut bei <a> Element

window.onload = function() { 
 
    var video = document.querySelector("video"); 
 
    video.addEventListener("error", function(event) { 
 
    var a = document.createElement("a"); 
 
    a.href = this.src; 
 
    a.innerHTML = "download media"; 
 
    a.download = ""; // set suggested file name here 
 
    this.parentElement.replaceChild(a, this); 
 
    }); 
 
    video.src = "media.file"; 
 
}
<video controls=""> 
 
    <source src="" type="video/mp4"> 
 
</video>

+0

Ich habe 'querySelectorAll (' video ') 'anstelle von' querySelector (' video ') '' verwendet, weil alle meine Videos über eine for-Schleife aufgelistet sind und dieser JS-Code * nach der for-Schleife * steht. Also denke ich, dass das oben genannte nicht für mein spezielles Setup funktioniert? –

+0

@HassanBaig stacksnippets ist ein Beispiel für Ansatz. Sie sollten '.querySelectorAll()', 'for' loop für' .querySelector() 'single event listener ersetzen können. Benutze 'load' Ereignis von' window', setze 'src' von Element nach dem Anhängen von' error' Ereignis Listener an Element – guest271314

+1

Ja, das dachte ich mir. Ich werde es ausprobieren und Sie wissen lassen, wie es läuft. Danke, dass du mir geholfen hast, ich fange gerade mit JS an, und es ist schwer, mich mit all den Beispielen und Ressourcen auseinanderzusetzen, die ich erforsche, um das Puzzle zusammenzusetzen :-) –

Verwandte Themen