如何防止使用javascript再次调用函数?
我使用youtube iframe api来检测视频何时开始播放,有时会发生状态更改为缓冲,然后再次播放,因此如何防止使用javascript再次调用函数?,javascript,Javascript,我使用youtube iframe api来检测视频何时开始播放,有时会发生状态更改为缓冲,然后再次播放,因此myFunction在每个会话中执行多次,如何使其仅运行一次 if (event.data == YT.PlayerState.PLAYING) { playing = true; player.mute(); player.setPlaybackQuality('small'); function myFunction() { setT
myFunction
在每个会话中执行多次,如何使其仅运行一次
if (event.data == YT.PlayerState.PLAYING) {
playing = true;
player.mute();
player.setPlaybackQuality('small');
function myFunction() {
setTimeout(function(){
var videoData = player.getVideoData();
var video_id = videoData['video_id'];
const Http = new XMLHttpRequest();
const url='https://url?viewcounter=' + video_id;
Http.open("GET", url);
Http.send();
}, 3000);
}
}
使用布尔标志
var alreadyRun = false;
if (event.data == YT.PlayerState.PLAYING && !alreadyRun) {
playing = true;
alreadyRun = true;
player.mute();
player.setPlaybackQuality('small');
function myFunction() {
setTimeout(function(){
var videoData = player.getVideoData();
var video_id = videoData['video_id'];
const Http = new XMLHttpRequest();
const url='https://url?viewcounter=' + video_id;
Http.open("GET", url);
Http.send();
}, 3000);
}
}
使用布尔标志
var alreadyRun = false;
if (event.data == YT.PlayerState.PLAYING && !alreadyRun) {
playing = true;
alreadyRun = true;
player.mute();
player.setPlaybackQuality('small');
function myFunction() {
setTimeout(function(){
var videoData = player.getVideoData();
var video_id = videoData['video_id'];
const Http = new XMLHttpRequest();
const url='https://url?viewcounter=' + video_id;
Http.open("GET", url);
Http.send();
}, 3000);
}
}
我尚未对此进行测试,但您可以在if语句中使用一个变量,即:
var isplaying = false;
if (event.data == YT.PlayerState.PLAYING && isplaying === false) {
isplaying = true;
playing = true;
player.mute();
player.setPlaybackQuality('small');
function myFunction() {
setTimeout(function(){
var videoData = player.getVideoData();
var video_id = videoData['video_id'];
const Http = new XMLHttpRequest();
const url='https://url?viewcounter=' + video_id;
Http.open("GET", url);
Http.send();
}, 3000);
}
}
我尚未对此进行测试,但您可以在if语句中使用一个变量,即:
var isplaying = false;
if (event.data == YT.PlayerState.PLAYING && isplaying === false) {
isplaying = true;
playing = true;
player.mute();
player.setPlaybackQuality('small');
function myFunction() {
setTimeout(function(){
var videoData = player.getVideoData();
var video_id = videoData['video_id'];
const Http = new XMLHttpRequest();
const url='https://url?viewcounter=' + video_id;
Http.open("GET", url);
Http.send();
}, 3000);
}
}
我还要检查视频是否正在缓冲,以便yt返回
yt.PlayerState.buffering
if(event.data==YT.PlayerState.PLAYING&&event.data!==YT.PlayerState.BUFFERING){
玩=真;
player.mute();
player.setPlaybackQuality(“小”);
函数myFunction(){
setTimeout(函数(){
var videoData=player.getVideoData();
var video_id=videoData['video_id'];
const Http=new XMLHttpRequest();
常量url=https://url?viewcounter=“+视频标识;
Http.open(“GET”,url);
Http.send();
}, 3000);
}
}
我还要检查视频是否正在缓冲,以便yt返回yt.PlayerState.buffering
if(event.data==YT.PlayerState.PLAYING&&event.data!==YT.PlayerState.BUFFERING){
玩=真;
player.mute();
player.setPlaybackQuality(“小”);
函数myFunction(){
setTimeout(函数(){
var videoData=player.getVideoData();
var video_id=videoData['video_id'];
const Http=new XMLHttpRequest();
常量url=https://url?viewcounter=“+视频标识;
Http.open(“GET”,url);
Http.send();
}, 3000);
}
}
使用全局变量仅运行一次
var sw_myFunction=false;
if(event.data==YT.PlayerState.PLAYING){
玩=真;
player.mute();
player.setPlaybackQuality(“小”);
函数myFunction(){
if(sw_myFunction)返回;
setTimeout(函数(){
var videoData=player.getVideoData();
var video_id=videoData['video_id'];
const Http=new XMLHttpRequest();
常量url=https://url?viewcounter=“+视频标识;
Http.open(“GET”,url);
Http.send();
}, 3000);
sw_myFunction=true;
}
}
使用全局变量仅运行一次
var sw_myFunction=false;
if(event.data==YT.PlayerState.PLAYING){
玩=真;
player.mute();
player.setPlaybackQuality(“小”);
函数myFunction(){
if(sw_myFunction)返回;
setTimeout(函数(){
var videoData=player.getVideoData();
var video_id=videoData['video_id'];
const Http=new XMLHttpRequest();
常量url=https://url?viewcounter=“+视频标识;
Http.open(“GET”,url);
Http.send();
}, 3000);
sw_myFunction=true;
}
}
出现错误,30秒后未调用http请求。
完整代码
<!DOCTYPE html>
<html>
<body>
<!-- 1. The <iframe> (and video player) will replace this <div> tag. -->
<div id="player"></div>
<script>
// 2. 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);
var sw_myFunction = false;
var player, playing = false;
function onYouTubeIframeAPIReady() {
player = new YT.Player('player', {
height: '100%',
width: '100%',
videoId: '<?php if (empty($vid)) {
echo "YbJOTdZBX1g";
}
else {
echo $vid;
}
?>',
playerVars: {'controls': 0, 'fs': 0,'playsinline': 1 },
events: {
'onError': onPlayerError,
'onReady': onPlayerReady,
'onStateChange': onPlayerStateChange
}
});
}
function onPlayerStateChange(event) {
if (event.data == YT.PlayerState.PLAYING) {
playing = true;
player.mute();
player.setPlaybackQuality('small');
var videoData = player.getVideoData();
var video_id = videoData['video_id'];
function myFunction() {
if(sw_myFunction) return;
setTimeout(function(){
const Http = new XMLHttpRequest();
const url='https://www.url.com?viewcounter=' + video_id;
Http.open("GET", url);
Http.send();
}, 30000);
sw_myFunction = true;
}
}
else if(event.data == YT.PlayerState.PAUSED){
}
else if(event.data == YT.PlayerState.ENDED){
}
}
function onPlayerReady(event) {
}
function onPlayerError(event)
{
}
</script>
</body>
</html>
// 2. 此代码异步加载IFrame播放器API代码。
var tag=document.createElement('script');
tag.src=”https://www.youtube.com/iframe_api";
var firstScriptTag=document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(标记,firstScriptTag);
var sw_myFunction=false;
var player,playing=false;
函数onyoutubeiframeapiredy(){
player=新的YT.player('player'{
高度:“100%”,
宽度:“100%”,
videoId:“”,
playerBars:{'controls':0,'fs':0,'playsinline':1},
活动:{
“onError”:OnPlayeError,
“onReady”:onPlayerReady,
“onStateChange”:onPlayerStateChange
}
});
}
函数onPlayerStateChange(事件){
if(event.data==YT.PlayerState.PLAYING){
玩=真;
player.mute();
player.setPlaybackQuality(“小”);
var videoData=player.getVideoData();
var video_id=videoData['video_id'];
函数myFunction(){
if(sw_myFunction)返回;
setTimeout(函数(){
const Http=new XMLHttpRequest();
常量url=https://www.url.com?viewcounter=“+视频标识;
Http.open(“GET”,url);
Http.send();
}, 30000);
sw_myFunction=true;
}
}
如果(event.data==YT.PlayerState.PAUSED){
}
如果(event.data==YT.PlayerState.end){
}
}
函数onPlayerReady(事件){
}
函数onplayerror(事件)
{
}
出现错误,30秒后未调用http请求。
完整代码
<!DOCTYPE html>
<html>
<body>
<!-- 1. The <iframe> (and video player) will replace this <div> tag. -->
<div id="player"></div>
<script>
// 2. 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);
var sw_myFunction = false;
var player, playing = false;
function onYouTubeIframeAPIReady() {
player = new YT.Player('player', {
height: '100%',
width: '100%',
videoId: '<?php if (empty($vid)) {
echo "YbJOTdZBX1g";
}
else {
echo $vid;
}
?>',
playerVars: {'controls': 0, 'fs': 0,'playsinline': 1 },
events: {
'onError': onPlayerError,
'onReady': onPlayerReady,
'onStateChange': onPlayerStateChange
}
});
}
function onPlayerStateChange(event) {
if (event.data == YT.PlayerState.PLAYING) {
playing = true;
player.mute();
player.setPlaybackQuality('small');
var videoData = player.getVideoData();
var video_id = videoData['video_id'];
function myFunction() {
if(sw_myFunction) return;
setTimeout(function(){
const Http = new XMLHttpRequest();
const url='https://www.url.com?viewcounter=' + video_id;
Http.open("GET", url);
Http.send();
}, 30000);
sw_myFunction = true;
}
}
else if(event.data == YT.PlayerState.PAUSED){
}
else if(event.data == YT.PlayerState.ENDED){
}
}
function onPlayerReady(event) {
}
function onPlayerError(event)
{
}
</script>
</body>
</html>
// 2. 此代码异步加载IFrame播放器API代码。
var tag=document.createElement('script');
tag.src=”https://www.youtube.com/iframe_api";
var firstScriptTag=document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(标记,firstScriptTag);
var sw_myFunction=false;
var player,playing=false;
函数onyoutubeiframeapiredy(){
player=新的YT.player('player'{
高度:“100%”,
宽度:“100%”,
videoId:“”,
playerBars:{'controls':0,'fs':0,'playsinline':1},
活动:{
“onError”:OnPlayeError,
“onReady”:onPlayerReady,
“onStateChange”:onPlayerStateChange
}
});
}
函数onPlayerStateChange(事件){
if(event.data==YT.PlayerState.PLAYING){
玩=真;
player.mute();
player.setPlaybackQuality(“小”);
var videoData=player.getVideoData();
var video_id=videoData['video_id'];
函数myFunction(){
我