如何防止使用javascript再次调用函数?

如何防止使用javascript再次调用函数?,javascript,Javascript,我使用youtube iframe api来检测视频何时开始播放,有时会发生状态更改为缓冲,然后再次播放,因此myFunction在每个会话中执行多次,如何使其仅运行一次 if (event.data == YT.PlayerState.PLAYING) { playing = true; player.mute(); player.setPlaybackQuality('small'); function myFunction() { setT

我使用youtube iframe api来检测视频何时开始播放,有时会发生状态更改为缓冲,然后再次播放,因此
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(){
我