2017-02-01 2 views
2

Ich habe eine Schaltfläche, die beim Klicken auf ein Youtube-Video zeigt. Über dem Video habe ich eine Schließen-Schaltfläche platziert, so dass der Benutzer es schließen kann.Das Youtube-Video kann nicht geschlossen werden, während das Video geladen wird.

Alles scheint gut zu funktionieren, aber auf mobilen (mit geringerer Geschwindigkeit als Desktop), bemerkte ich, dass während das Video lädt, wenn ein Benutzer beschließt, es zu schließen, dann kann er nicht. (Aber sobald das Video abgespielt hat, wird das Video geschlossen ...)

Um dieses Problem zu simulieren, habe ich eine jsfiddle erstellt und Sie eingeladen, Google Chrome Dev Tools zu öffnen und auf der Registerkarte Netzwerke festzulegen 2G Geschwindigkeit, um Zeit zu haben, dieses Phänomen zu erleben.

Ich weiß nicht, ob es verwandt ist, aber Kontext geben, verwende ich Bootstrap 3 und jquery.

HTML

<section id="buttons"> 
    <a class="btn btn-primary" id="videoModal"> 
     <span class="title">hello</span><br/> 
    </a> 
</section> 

<div id="container"> 
<button type="button" class="yt-close" data-target="#container">×</button> 
    <div id="ytplayer"></div> 
</div> 

JS

load_yt_player(); 
function load_yt_player() { 
    $("#videoModal").click(function(){ 
     $("#video-container").fadeIn(1000); 
     runPlayer("Aph6N3FI4qI"); 
    }); 

    if(document.getElementById('iframe_api') === null){ 
     var tag = document.createElement('script'); 
     tag.src = "https://www.youtube.com/iframe_api"; 
     tag.id = "iframe_api"; 
     var firstScriptTag = document.getElementsByTagName('script')[0]; 
     firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); 
    } 

    var player; 
    function runPlayer(video_id){ 
     if(player) { 
     player.playVideo(); 
     return player; 
     } 
     player = new YT.Player('ytplayer', { 
     playerVars: { 
      autoplay: 1, 
      html5: 1, 
      controls: 0, 
      modestbranding: 1, 
      showinfo: 0, 
      loop: 0, 
      enablejsapi: 1, 
      origin: document.domain, 
      fs: 1, 
      wmode: "opaque" 
     }, 
     videoId: video_id, 
     events: { 
      onStateChange: function (event) {   
      if(event.data === YT.PlayerState.PAUSED){ 
       event.target.stopVideo(); 
       $("#container").hide(); 
      } 
      // On End 
      if(event.data === YT.PlayerState.ENDED){ 
       event.target.stopVideo(); 
       $("#container").hide(); 
      } 
      // On close button click 
      $(".yt-close").click(function(){ 
       event.target.stopVideo(); 
       $($(this).data("target")).hide(); 
      }); 
      } 
     } 
     }); 
    } 
    } 

CSS

#buttons a { 
    display: block; 
    margin-bottom: 10px; 
    white-space: normal; 
    padding: 6px 7px; 
    width: 5Opx; 
} 

.yt-close { 
    position: absolute; 
    top: 0; 
    right: 0; 
} 

button.yt-close { 
    color: black; 
    cursor: pointer; 
    background: 0 0; 
    border: 0; 
    -webkit-appearance: none; 
    display: block; 
    -ms-touch-action: manipulation; 
    touch-action: manipulation; 
    font-size: 100px; 
} 

JSFIDDLE link

+1

Ihr Klickereignis für '$ (". Yt-close ") innerhalb von 'onStateChange' ist nur dann bindend, wenn das Video abgespielt wird. Ich würde vorschlagen, dies nach draußen zu verschieben und versuchen, das Video 'Element/iframe' durch andere Möglichkeiten zu löschen. –

+1

es funktioniert danke – Mathieu

+1

wenn Sie antworten möchten, könnte ich Ihnen die upvote Punkte geben :) – Mathieu

Antwort

2

Es wird bemerkt, dass Ihr Klickereignis für $(".yt-close") innerhalb onStateChange nicht bindend ist, wenn das Video nicht abgespielt wird. Ich würde vorschlagen, diese click event binding irgendwo nach draußen zu verschieben und versuchen, die video element/iframe durch andere mögliche Wege zu löschen.

+0

Hallo Rao, ich habe ein kleines Problem und kann es aus mysteriösen Gründen nicht auf der Hand reproduzieren. Jetzt mit deinem Vorschlag kann ich das Video BEFORE die onstatechange (= Start des Videos) schließen, aber das Problem ist, dass, wenn ich erneut auf den Button klicke, das Video NICHT von Anfang an lädt, sondern als ob es sich bereits vorwärts bewegt hat (obwohl es war unsichtbar, seit ich Video geschlossen habe). – Mathieu

+0

Folgen Sie dem vorherigen Kommentar: Die Lösung wäre, event.target.stopVideo() wie folgt zu verwenden: $ (". Yt-close"). Click (function() { event.target.stopVideo(); $ ($ (this) .data ("target")) .hide(); Aber wie es jetzt außerhalb der Funktion load_yt_player() ist (Danke an Deinen Vorschlag), dann klappt es nicht, ich erhalte einen Fehler weil natürlich event.target ist nicht mehr definiert ... Wie kann ich der App mitteilen, das Video zu beenden, wenn ich auf die Schließen-Schaltfläche klicke? – Mathieu

+0

@Mathieu .. ** [Diese SO-Post] (http://stackoverflow.com/questions/6671232/youtube- api-stop-video) ** und ** [diese Geige] (http://jsfiddle.net/MadLittleMods/3J2wT/) ** könnte dich dazu bringen, mit einer besseren Idee zu gehen .. :) –

Verwandte Themen