Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何区分代码调用的操作侦听器和用户调用的操作侦听器?_Javascript_Video_Youtube Javascript Api_Event Listener - Fatal编程技术网

Javascript 如何区分代码调用的操作侦听器和用户调用的操作侦听器?

Javascript 如何区分代码调用的操作侦听器和用户调用的操作侦听器?,javascript,video,youtube-javascript-api,event-listener,Javascript,Video,Youtube Javascript Api,Event Listener,我正在使用Youtube Iframe Javascript API开发一个应用程序。我必须根据另一个应用程序(称为调用应用程序)的输入播放或暂停视频。我还必须从这个Youtube播放器获得更新(无论它是被播放还是暂停),并更新调用应用程序 现在的问题是如何区分YouTube播放器是由用户操作播放还是基于调用应用程序的输入播放。因为它们都调用了动作侦听器。当由调用应用程序播放时,我不希望调用应用程序再次更新 例如: 案例1: 调用应用程序向youtube播放器发送播放请求 播放Youtube播放

我正在使用Youtube Iframe Javascript API开发一个应用程序。我必须根据另一个应用程序(称为调用应用程序)的输入播放或暂停视频。我还必须从这个Youtube播放器获得更新(无论它是被播放还是暂停),并更新调用应用程序

现在的问题是如何区分YouTube播放器是由用户操作播放还是基于调用应用程序的输入播放。因为它们都调用了动作侦听器。当由调用应用程序播放时,我不希望调用应用程序再次更新

例如:

案例1:

  • 调用应用程序向youtube播放器发送播放请求
  • 播放Youtube播放器
  • 调用onStateChange侦听器
  • 调用应用程序将收到播放机状态已更改的通知(我不希望这种情况发生)。
  • 案例2:

  • 用户点击播放器上的播放按钮
  • 播放Youtube播放器
  • 调用onStateChange侦听器
  • 调用应用程序将收到播放机状态已更改的通知(我希望这样做)。
  • 我可以在程序调用开关变量时使用开关变量来实现这一点,在用户调用开关变量时禁用开关变量。但是这种情况太多了,考虑到所有这些情况,我不能期望所有的开发人员都能处理它

    因此,我需要一种适当的方式让动作监听器知道用户是调用了该动作还是程序调用了该动作。API中是否有内置的方法来实现这一点

    function callback(responseText) {
        var response=JSON.parse(responseText.body);
        var player = getPlayer();
        var seekAhead = true;
        switch (response.playerState) {
        case YT.PlayerState.PLAYING:
            player.seekTo(response.seconds,seekAhead);
            player.playVideo();
            break;
        case YT.PlayerState.PAUSED:
            player.seekTo(response.seconds,seekAhead);
            player.pauseVideo();
            break;
        case YT.PlayerState.BUFFERING:
            break;
        case YT.PlayerState.ENDED:
                    break;
        }
    

    使用变量管理交换机的问题在于,当调用应用程序发送播放状态时,有一个seekTo调用调用暂停、缓冲和播放事件。它们需要一段时间才能完成,但变量开关在第一个事件时被切换。

    Hm。对于案例2,寄存器事件加载程序将推送一些数据。对于案例1寄存器,在“调用应用程序”中注册相同的回调,但不发送额外的数据

    // In calling application:
    $('selector').on('click', cb)
    
    
    // For case 2:
    $('selector').on('click', {userAction: true}, cb)
    
    
    function cb (evt) {
      if (evt.data.userAction) {
        // react here
        // this reaction will be not
        // executed if 
      }
    }
    

    我没有看到jQuery标记。OP使用的是StateChange事件,而不是click。@Waldemarlce调用还有一个问题。如果我通过编程在播放器上调用seekTo,那么动作监听器将被调用三次,每次都用于暂停、缓冲和播放。在这种情况下,我无法传递附加数据,因为它是由调用应用程序调用的单个操作的API顺序调用的。您的代码在哪里?“调用应用程序如何向youtube播放器发送播放请求”?调用应用程序发送json。它包含需要应用于播放机的播放机状态。我会更新代码。