【问题标题】:How to manage different events with event listener for different elements?如何使用不同元素的事件监听器管理不同的事件?
【发布时间】:2016-11-01 14:39:46
【问题描述】:
$(document).ready(function () 
{
    var player_1_listener = $('#myVid_1')[0];
    $f(player_1_listener).addEvent('ready', ready);

    var player_2_listener = $('#myVid_2')[0];
    $f(player_2_listener).addEvent('ready', ready);

    function addEvent(element, eventName, callback) 
    {
        if (element.addEventListener) 
        {
            element.addEventListener(eventName, callback, false);
        }
        else 
        {
            element.attachEvent(eventName, callback, false);
        }
    }

    function ready(player_id) 
    {
        //var froogaloop = $f(player_id);
        if (player_id === myVid_1)
        {
            var froogaloop = $f(player_id);
            function onFinish() 
            {
                froogaloop.addEvent('finish', function(data)
                {
                    /*var players_unloading;
                    players_unloading=$('#myVid_1');
                    $f(players_unloading[0]).api('unload');*/
                    toggleOverlay_1();
                    $f(froogaloop[0]).api('unload');
                });
            }
            //onFinish();
        }
        else if (player_id === myVid_2)
        {
            var froogaloop = $f(player_id);
            function onFinish() 
            {
                froogaloop.addEvent('finish', function(data)
                {
                    /*var players_unloading;
                    players_unloading=$('#myVid_1');
                    $f(players_unloading[0]).api('unload');*/
                    toggleOverlay_2();
                    $f(froogaloop[0]).api('unload');
                });
            }
            //onFinish();
        }
    }
    onFinish();
});

我有 2 个按钮,点击打开 iframe 并播放视频。我试图让 iframe 中的播放器调用它的 api pause 方法来暂停视频。如果我只使用一个 iframe 视频,我可以做到这一点,但是当有多个 iframe 视频时,我就无法做到这一点。

【问题讨论】:

    标签: javascript addeventlistener vimeo-api


    【解决方案1】:

    您需要向函数添加参数,以便尽可能多地重用代码。在我看来,您可以在所有相关函数中添加 playerid,并使用它来最小化 ready(player_id) 中的代码,方法是利用 player_id 作为主 ID 来帮助访问所有相关的视频项目。

    $(document).ready(function () {
     var player = $('#myVid')[0];
     var player2 = $('#myVid2')[0];
     $f(player).addEvent('ready', ready); 
     $f(player2).addEvent('ready', ready); 
    
      function addEvent(element, eventName, callback) {
        if (element.addEventListener) {
         element.addEventListener(eventName, callback, false);
        }
        else {
          element.attachEvent(eventName, callback, false);
        }
      }
    
      function ready(player_id) {
        var froogaloop = $f(player_id);
    
        function onFinish() {
          froogaloop.addEvent('finish', function(data) {
          toggleOverlay(player_id);
          resetVideo(player_id);
      });
     }
     onFinish();
    }
    
    });
    
    function toggleOverlay(playerid){
      $("#" + playerid).parent("#specialBox").parent().css("opacity",".8");
      $("#" + playerid).parent("#specialBox").parent().toggle();
      $("#" + playerid).parent("#specialBox").toggle();
    }
    
    function resetVideo(vidID)
    {
       var player;
       player=$('#' + vidID);
       $f(player[0]).api('unload');
    }
    

    使用 froogaloop2.js 库的示例[旧]:http://codepen.io/Nasir_T/pen/pEmEJE

    使用 vimeo 中 player.js 的示例[新改进]:http://codepen.io/Nasir_T/pen/GNKjbe

    如果您需要更多帮助,请告诉我。

    【讨论】:

    • 谢谢你纳西尔。此解决方案有效。一个疑问 - 在这里我们正在卸载视频,但是当您重新打开视频时,之前视频的注释仍然存在。这是 vimeo api 的问题吗?
    • 嗯。我没有看到它。可以发截图吗?
    • 我在原始问题中添加了屏幕截图
    • 是的,看到了。我正在研究解决方案。似乎是api卸载方法的问题。
    • 嘿赛丽。我认为问题在于,如果多次调用,卸载 api 恰好隐藏了注释。我仍在研究它,但作为一个快速修复,您可以添加一个 css 类来隐藏该覆盖:.player .outro-wrapper-in { display: none !important;}。
    猜你喜欢
    • 2014-05-18
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 2022-01-17
    • 2017-04-16
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多