通过调用需要传递给它的事件的函数来播放下一个视频

时间:2016-10-02 20:23:12

标签: javascript events onclicklistener

我已经问过JavaScript如何调用下一个视频的问题,因为我在发布之前已经彻底研究了这个主题。但是,在我将要描述的情况下,在onclick事件调用函数:function(e)之后视频正在运行,并且我需要能够在代码检测到代码后通过再次调用函数(e)来调用下一个视频通过使用addEventListener方法结束事件。

我在下面发布了所有代码。此外,我添加了评论来说明我“思考”正在发生的事情。我是JavaScript的新手,最近退休了,所以我有时间研究互联网,试图拼凑正在发生的事情。请随时澄清我的注释代码,因为我希望能够直接了解我的意见。

我还尝试将代码放在jsfiddle

https://jsfiddle.net/dan2004/tuouh36d/

但它似乎只能在Chrome中运行。

我对每个人的主要问题是关于声明:

的document.getElementById( '录像机')的addEventListener( '结束',处理程序,假);

如果我在函数外部调用函数,我可以通过警报发出消息,但如果我调用我所在的函数(处理程序(e)),我就无法运行下一个视频。不知何故,我需要能够调用处理程序(e)函数并将其发送到下一个onclick事件。

感谢您的帮助。

	
		var video_playlist, links, i, videotarget, filename, video, source;
			
				// Gets the video object from <div id="player"> in the HTML 
			video_playlist = document.getElementById("player");
				
				// "links" is an array which contains all the <a href> tags in the <div id="playlist">.
				// This div is located within <div id="player"> and contains a clickable playlist.	 
			links = video_playlist.getElementsByTagName('a');
				
				// This "for loop" scrolls through the links array of <a href> attributes and 
				// assigns an "onclick = handler" event to each one. 
			for (i=0; i<links.length; i++) {
				links[i].onclick = handler; 
			};
			
			
				// e is an [object MouseEvent]
			function handler(e) {
		
					
					// The handler function receives the full path to the mp4 file when it is clicked on in the playlist. 
					// The "preventDefault" method stops the function from following that path. 
					// This is so the data in the path may be parsed and manipulated below
				e.preventDefault();
				
					// videotarget grabs the href attribute of the item clicked on 
					// in the "playlist". This is the full path to the video file. 
				videotarget = this.getAttribute("href");
							
					// Through the use of substr, filename grabs that part of the href which
					// does not include the extension.
				filename = videotarget.substr(0, videotarget.lastIndexOf('.')) || videotarget;
				
					// The variable "video" contains the video object. This is obtained by using document.querySelector().
					// This document method uses the css id class, #player, and grabs the [object HTML VideoElement].
					// The [object HTML VideoElement] resides in <div id="player">
				video = document.querySelector("#player video"); 
									 
					//Removes the poster attribute in the video tag
				video.removeAttribute("poster");
					
					// The source variable is used to hold an array of all the source tags in the 
					// [object HTML VideoElement] from <div id="player">.					
				source = document.querySelectorAll("#player video source"); 
				
					// Using the substring extracted from the user's click choice in <div id="playlist">
					// the three file types for browsers to choose from are concatenated to the string.
					// These thre source files are then stored under the video object located in <div id="player">.
				source[0].src = filename + ".mp4"; 
				source[1].src = filename + ".webm";
				source[2].src = filename + ".ogv"; 
				
					// The video object will load the appropriate source[].src file then play it
				video.load();  
				video.play();

					// When the  video ends the following statement will call the function  test()
					// which will then broadcast the alert message "Video Ended"
				document.getElementById('videoPlayer').addEventListener('ended',test,false);
				
					// This statement will not call the handler function in order to play the next video selection.
//				document.getElementById('videoPlayer').addEventListener('ended',handler,false);
			 
			}; // function handler(e)
			
			function test(){
				alert("Video Ended"); 
			};	
<!DOCTYPE html>
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<title>Video Playlist Tutorial</title>
		<style>
			body {font-family:Arial, Helvetica, sans-serif;background:#fff}
			.center {text-align:center;width:640px;margin:0 auto;}
			#player {background:#000; padding:10px;width:640px;margin:0 auto;border-radius:10px;}
			#player video {width:640px;}
			#playlist {background:#333;list-style:none;padding:0;margin:0; width:640px;}
			#playlist h1 {font: 24px Arial, Helvetica, sans-serif; color:#FFF; font-weight:bold;padding:5px 2px;margin:0;}
			#playlist a {color:#eeeedd;background:#333;padding:10px 5px;display:block;text-decoration:none;border-bottom:1px solid #222;}
			#playlist a:hover {text-decoration:none; background:#999;color:#000}
		</style>
	</head>
	<body>
		<div id="player">  <!-- Assign id to video tag for ended event and to call handler to play next video -->		
			<video id="videoPlayer" controls="controls" width="640" height="360" preload="auto" autoplay >
				<source src="1.mp4" type="video/mp4" />
				<source src="1.webm" type="video/webm" />
				<source src="1.ogv" type="video/ogg" /> 
			</video>
			<div id="playlist">
				<h1>Videos</h1>
				<a href="http://www.w3schools.com/html/movie.mp4">Bear</a> <br>
				<a href="http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4">Buck Bunny</a>	
			</div>
		</div>
		
		<script>
          </script>
		
	</body>
</html>

1 个答案:

答案 0 :(得分:0)

看到handler()函数依赖this作为点击元素,您无法调用该函数,您还必须将此值设置为下一个锚点等,并以一种让它看起来像是由实际元素触发的方式触发事件。

更简单的方法是将播放逻辑分离,获取下一个元素,然后播放视频

&#13;
&#13;
var video_playlist = document.getElementById("player");
var links = video_playlist.getElementsByTagName('a');

for (var i = 0; i < links.length; i++) {
    (function(j) {
        links[j].addEventListener('click', function(e) {
            handler.apply(this, [e, j])
        });
    })(i);
};

function handler(e, index) {
    e.preventDefault();
    var videotarget = this.getAttribute("href");
    
    play(videotarget, index).addEventListener('ended', function() {
        index = (++index) >= links.length ? 0 : index;
        play(links[index].getAttribute("href"), index);
    });
};

function play(videotarget) {
    var filename = videotarget.substr(0, videotarget.lastIndexOf('.')) || videotarget;
    var video = document.querySelector("#player video");
    var source = document.querySelectorAll("#player video source");
    
    video.removeAttribute("poster");
    source[0].src = filename + ".mp4";
    source[1].src = filename + ".webm";
    source[2].src = filename + ".ogv";
    video.load();
    video.play();
    return video;
};
&#13;
<div id="player">
    <!-- Assign id to video tag for ended event and to call handler to play next video -->
    <video id="videoPlayer" controls="controls" width="640" height="360" preload="auto" autoplay>
        <source src="1.mp4" type="video/mp4" />
        <source src="1.webm" type="video/webm" />
        <source src="1.ogv" type="video/ogg" />
    </video>
    <div id="playlist">
        <h1>Videos</h1>
        <a href="http://www.w3schools.com/html/movie.mp4">Bear</a>
        <a href="http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4">Buck Bunny</a>
    </div>
</div>
&#13;
&#13;
&#13;