2016-10-21 4 views
0

"YouTube 비디오 재생"을위한 Github xAPI 스크립트를 가져 와서 하나 대신 두 개의 비디오를 표시하도록 수정하려고 시도했습니다. 궁극적으로이 페이지에 5 ~ 6 개의 비디오를 나열하고 싶습니다. 불행히도 한 번에 둘 이상의 비디오를 보여줄 수는 없습니다. 대신 하나의 비디오 만 보여 주며 내가 나열한 두 번째 비디오입니다. 다른 사람이이 코드를 수정하여 하나 이상의 비디오를 나열 할 수있는 방법을 말해 줄 수 있습니까? 또한 명백한 이유로이 질문을 게시하기 전에 LRS 자격 증명을 변경했습니다. 많은 감사합니다.페이지에 하나 이상의 비디오를 표시하고 싶습니다.

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="utf-8"> 
    <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> 
    <meta name="description" content="A shorthand syntax for communicating xAPI Statements"> 
    <meta name="author" content="ADL"> 
    <link rel="icon" href="favicon.ico"> 

    <title>xAPI Youtube Video Tracking</title> 
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css"> 
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css"> 
</head> 

<body> 

    <section class="container"> 

    <div class="page-header"> 
     <h1 class="text-primary"><i class="fa fa-youtube"></i> xAPI Youtube Video Tracking</h1> 
     <h3 class="text-muted">Send Youtube Video interactions to an LRS with xAPI</h3> 
    </div> 

    <div class="row"> 

     <div class="form-group col-md-12"> 

     <div id="player"></div> 

     <div id="player2"></div> 

     <p>This example uses minimal javascript and the youtube <a href="https://developers.google.com/youtube/iframe_api_reference" target="_blank">iframe API</a>.</p> 
     <p>Statements are built with xapi-youtube-statements.js and dispatched to an LRS with xapiwrapper.min.js using a custom ADL.XAPIYoutubeStatements.onStateChangeCallback function.</p> 
     <p>You can view statements <a href="http://adlnet.github.io/xapi-statement-viewer/">with the statement viewer</a>.</p> 

     </div><!-- .col-md-12 --> 

    </div><!-- .row --> 

    </section><!-- .container --> 

    <script type="text/javascript" src="lib/xapiwrapper.min.js"></script> 
    <script type="text/javascript" src="src/xapi-youtube-statements.js"></script> 

    <script> 

    var video = "6hwHKOYCYL4"; // Change this to your video ID 
    var videoName = "Microlearning vs Traditional Learning"; 


    var video2 = "SUJkBCHB4vQ"; // Change this to your video ID 
    var videoName2 = "Micro Learning is a BIG deal"; 





    // "global" variables read by ADL.XAPIYoutubeStatements 
    ADL.XAPIYoutubeStatements.changeConfig({ 
     "actor": {"mbox":"mailto:[email protected]", "name":"John M."}, 
     "videoActivity": {"id":"https://www.youtube.com/watch?v=" + video, "definition":{"name": {"en-US":videoName}} } 
    }); 

    ADL.XAPIYoutubeStatements.changeConfig({ 
     "actor": {"mbox":"mailto:[email protected]", "name":"John M."}, 
     "videoActivity": {"id":"https://www.youtube.com/watch?v=" + video2, "definition":{"name": {"en-US":videoName2}} } 
    }); 





    function initYT() { 
     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 player; 
    function onYouTubeIframeAPIReady() { 
     player = new YT.Player('player', { 
     height: '390', 
     width: '640', 
     videoId: video, 
     playerVars: { 'autoplay': 0 }, 
     events: { 
      'onReady': ADL.XAPIYoutubeStatements.onPlayerReady, 
      'onStateChange': ADL.XAPIYoutubeStatements.onStateChange 
     } 
     }); 
    } 


    var player2; 
    function onYouTubeIframeAPIReady() { 
     player2 = new YT.Player('player2', { 
     height: '390', 
     width: '640', 
     videoId: video2, 
     playerVars: { 'autoplay': 0 }, 
     events: { 
      'onReady': ADL.XAPIYoutubeStatements.onPlayerReady, 
      'onStateChange': ADL.XAPIYoutubeStatements.onStateChange 
     } 
     }); 
    } 



    initYT(); 



    // Auth for the LRS 
    var conf = { 
     "endpoint" : "https://www2.test.com/test/ScormEngineInterface/TCAPI/", 
     "auth" : "Basic " + toBase64("test:test"), 
    }; 

    ADL.XAPIWrapper.changeConfig(conf); 

    /* 
    * Custom Callbacks 
    */ 
    ADL.XAPIYoutubeStatements.onPlayerReadyCallback = function(stmt) { 
     console.log("on ready callback"); 
    } 

    // Dispatch Youtube statements with XAPIWrapper 
    ADL.XAPIYoutubeStatements.onStateChangeCallback = function(event, stmt) { 
     console.log(stmt); 
     if (stmt) { 
     stmt['timestamp'] = (new Date()).toISOString(); 
     ADL.XAPIWrapper.sendStatement(stmt, function(){}); 
     } else { 
     console.warn("no statement found in callback for event: " + event); 
     } 
    } 

    </script> 

</body> 
</html> 

답변

1

당신은 iframe이가 준비되면 첫 번째 콜백은 더 이상 함수의 값이되도록, 첫 번째를 설정하지에 즉시 onYouTubeIframeAPIReady 콜백을 덮어 쓸 수 있습니다. (비동기로 생각해야합니다.) 해당 함수는 한 번 호출되어야하며 단일 정의 만 있어야합니다. 이 작업을 수행하려면 이라는 인스턴스를 onYouTubeIframeAPIReady 함수로 옮겨야합니다. (이 부분은 onYouTubeIframeAPIReady called once but multiple videos needed on a page의 복제본입니다.)

또한 ADL의 래퍼는 LRS와의 통신에 효과적으로 싱글 톤을 사용하므로, 활동이있는 두 동영상에 대한 모든 진술을 두 번째 비디오 (changeConfig에 대한 이후 호출이기 때문에). 이 문제를 해결하기 위해 자신의 함수로 상태 변경 처리기를 포장하는 것 이외에 다른 방법은 보이지 않습니다.이 함수는 이벤트가 발생할 때마다 changeConfig을 호출하고 심지어 경쟁 조건의 가능성이 있습니다.

관련 문제