問題は、iframe 内のイベントを制御できないため、ユーザーがその領域をいつスワイプしたかがわからないことです。私が提案する回避策は、見ないときに iframe を画像プレースホルダーに置き換えることです。これを行うには、YouTube の Iframe APIを使用してビデオ イベントを追跡します。ビデオが再生から一時停止に移行すると、ビデオが非表示になり、画像が表示されます。ここにデモがあります。
HTML
<div ng-app="app">
<div ng-controller="ctrl" ng-swipe-right="msg($event, 'right')" ng-swipe-left="msg($event, 'left')">
<div id="player"></div>
<img id="player-cover" src="http://img.youtube.com/vi/M7lc1UVf-VE/hqdefault.jpg" />
</div>
</div>
JS
開始すると、ビデオが非表示になります。画像をクリックするたびに、ビデオが表示され、再生されます。ビデオが一時停止から再生に移行onPlayerStateChange
すると、画像とビデオの切り替えが処理されます。スワイプ イベントが画像で呼び出されるたびに、画像のクリック イベント ハンドラーもトリガーされます。この変数swiping
は、イベントがクリックだけだったのかスワイプだったのかを追跡します。
var app = angular.module('app', ['ngTouch']);
app.controller('ctrl', function($scope) {
$scope.msg = function(event, msg) {
swiping = true;
alert(msg);
}
});
// keep track of the user swiping. onYouTubeIframeAPIReady needs to occur outside of Angular.
var swiping = false;
// Youtube related.
document.getElementById('player').style.display = 'none';
document.getElementById('player-cover').addEventListener("click", function() {
if (swiping) {
swiping = false;
return;
}
document.getElementById('player').style.display = 'block';
player.playVideo();
});
// This code loads the IFrame Player API code asynchronously.
var tag = document.createElement('script');
tag.src = "https://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
// This function creates an <iframe> (and YouTube player) after the API code downloads.
var player;
function onYouTubeIframeAPIReady() {
player = new YT.Player('player', {
height: '390',
width: '640',
videoId: 'M7lc1UVf-VE',
events: { 'onStateChange': onPlayerStateChange }
});
}
function onPlayerStateChange(event) {
if (event.data === YT.PlayerState.PAUSED || event.data === YT.PlayerState.ENDED) {
document.getElementById('player-cover').style.display = 'block';
document.getElementById('player').style.display = 'none';
} else {
document.getElementById('player-cover').style.display = 'none';
document.getElementById('player').display = 'block';
}
}