In modern web applications, it is essential to provide users with a seamless experience where their progress is saved across sessions. One of the most common use cases for this is tracking how much of a video a user has watched, so they can pick up where they left off. This tutorial will walk you through how to implement such a system using JavaScript, localStorage, and event listeners, while also integrating server-side communication to store watched time.
**
Overview of the Code
**
The provided solution allows for tracking the watched time of multiple videos on a webpage. It stores the watch progress in the browser’s localStorage and, if a user exceeds the last watched time, updates the progress in a server-side database using a POST request. The goal is to offer a generic, scalable method that works for all videos with minimal effort.
<video> <pre class="brush:php;toolbar:false"><video> <p>: This element embeds a video player on the page.</p> <p>The> The data-idvideo="123" is a custom attribute that holds a unique identifier for each video. This ID allows us to track and store the watch progress for individual videos.<br> <source src="path/to/video.mp4" type="video/mp4">: Specifies the path to the video file and the video format (in this case, MP4)<br> </source></p> <pre class="brush:php;toolbar:false">// Function to update the watched time function updateWatchedTime(video, videoId) { var timeInSeconds = video.currentTime; // Time watched in seconds var minutes = Math.floor(timeInSeconds / 60); // Whole part (minutes) var seconds = timeInSeconds % 60; // Remaining seconds var decimalTime = minutes + (seconds / 60); // Converts seconds into a fractional minute // Get the last recorded time for the video (saved in localStorage or a global variable) var lastRecordedTime = localStorage.getItem("lastRecordedTime_" + videoId); if (lastRecordedTime === null) { lastRecordedTime = 0; // Default value if no previous time is found } else { lastRecordedTime = parseFloat(lastRecordedTime); } // Check if the current time is greater than the last recorded time if (decimalTime > lastRecordedTime) { // If the current time is greater, save the new time var requestData = "VIDEO_ID=" + videoId + "&WATCHED_TIME=" + decimalTime.toFixed(4); console.log("Sending: " + requestData); // Shows the watched time in decimal (4 decimal places) // Send the data to the server (replace with actual URL) $.post("path/to/api", requestData, function(response) { // Handle server response if needed console.log("Server response: " + response); // After saving, update the localStorage with the new watched time localStorage.setItem("lastRecordedTime_" + videoId, decimalTime.toFixed(4)); }); } else { console.log("Watched time is less than the last recorded time. No update sent."); } } // Add an event listener for the 'timeupdate' event to all video elements document.querySelectorAll('.videoCourse').forEach(function(video) { // Get the video ID (should be uniquely assigned to each video element) var videoId = video.getAttribute('data-idvideo'); // Add the 'timeupdate' event listener video.addEventListener('timeupdate', function(event) { updateWatchedTime(video, videoId); // Pass the video and its ID directly }); });
**
Explanation of the Code
- Update Watched Time Function** The core of this solution is the updateWatchedTime() function. This function is responsible for:
Calculating the Watch Progress: The function first retrieves the currentTime of the video (in seconds) and converts this into minutes and seconds. The time is then converted to a decimal format (e.g., 3 minutes 30 seconds becomes 3.50).
Checking the Last Recorded Time: Using the localStorage.getItem() method, we retrieve the last recorded time for the video. If no time has been recorded yet (i.e., the first time the user watches the video), it defaults to 0. This ensures that progress tracking starts from zero.
Storing the Time: If the current time is greater than the last recorded time, it means the user has watched more of the video since the last update. The function sends the updated time to the server using a POST request. After the data is successfully sent, the localStorage is updated with the new time.
2. Handling Multiple Videos
The script adds an event listener to all videos on the page with the>
Event Listener: Every time the video’s time is updated (i.e., as the user watches the video), the timeupdate event is triggered. This event fires continuously as the video plays, providing an opportunity to track the progress.
querySelectorAll(): This method selects all video elements on the page, making the script adaptable for any number of videos. It loops through each video, attaching the timeupdate listener, ensuring that the watch progress is tracked for each video independently.
**
How This Works: A Step-by-Step Flow
**
User Watches Video: As the user watches the video, the timeupdate event continuously triggers.
Watch Progress Calculated: The script calculates how much of the video has been watched in minutes and seconds, then converts it to a decimal format.
Last Recorded Time: The script compares the current watch time to the last recorded time saved in localStorage.
Update if Necessary: If the current watch time is greater than the previously saved time, the new time is sent to the server. Afterward, the new time is saved in localStorage.
Next Visit: The next time the user visits the page, the script checks localStorage for the last saved time. If available, it starts tracking from where the user left off.
**
Benefits and Use Cases
**
Scalability: This approach works for any number of videos on a page. It uses the data-idvideo attribute to uniquely identify each video, making the system scalable without modification.
Persistence: Using localStorage, the user’s progress is saved across sessions. Even if the page is reloaded or if the user leaves and returns, their progress is retained.
Seamless Integration: The solution integrates smoothly with existing video players, making it easy to implement on websites that already use the HTML5
The above is the detailed content of Tracking Video Watch Progress with JavaScript. For more information, please follow other related articles on the PHP Chinese website!

JavaScript core data types are consistent in browsers and Node.js, but are handled differently from the extra types. 1) The global object is window in the browser and global in Node.js. 2) Node.js' unique Buffer object, used to process binary data. 3) There are also differences in performance and time processing, and the code needs to be adjusted according to the environment.

JavaScriptusestwotypesofcomments:single-line(//)andmulti-line(//).1)Use//forquicknotesorsingle-lineexplanations.2)Use//forlongerexplanationsorcommentingoutblocksofcode.Commentsshouldexplainthe'why',notthe'what',andbeplacedabovetherelevantcodeforclari

The main difference between Python and JavaScript is the type system and application scenarios. 1. Python uses dynamic types, suitable for scientific computing and data analysis. 2. JavaScript adopts weak types and is widely used in front-end and full-stack development. The two have their own advantages in asynchronous programming and performance optimization, and should be decided according to project requirements when choosing.

Whether to choose Python or JavaScript depends on the project type: 1) Choose Python for data science and automation tasks; 2) Choose JavaScript for front-end and full-stack development. Python is favored for its powerful library in data processing and automation, while JavaScript is indispensable for its advantages in web interaction and full-stack development.

Python and JavaScript each have their own advantages, and the choice depends on project needs and personal preferences. 1. Python is easy to learn, with concise syntax, suitable for data science and back-end development, but has a slow execution speed. 2. JavaScript is everywhere in front-end development and has strong asynchronous programming capabilities. Node.js makes it suitable for full-stack development, but the syntax may be complex and error-prone.

JavaScriptisnotbuiltonCorC ;it'saninterpretedlanguagethatrunsonenginesoftenwritteninC .1)JavaScriptwasdesignedasalightweight,interpretedlanguageforwebbrowsers.2)EnginesevolvedfromsimpleinterpreterstoJITcompilers,typicallyinC ,improvingperformance.

JavaScript can be used for front-end and back-end development. The front-end enhances the user experience through DOM operations, and the back-end handles server tasks through Node.js. 1. Front-end example: Change the content of the web page text. 2. Backend example: Create a Node.js server.

Choosing Python or JavaScript should be based on career development, learning curve and ecosystem: 1) Career development: Python is suitable for data science and back-end development, while JavaScript is suitable for front-end and full-stack development. 2) Learning curve: Python syntax is concise and suitable for beginners; JavaScript syntax is flexible. 3) Ecosystem: Python has rich scientific computing libraries, and JavaScript has a powerful front-end framework.


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

VSCode Windows 64-bit Download
A free and powerful IDE editor launched by Microsoft

Notepad++7.3.1
Easy-to-use and free code editor

SAP NetWeaver Server Adapter for Eclipse
Integrate Eclipse with SAP NetWeaver application server.

SublimeText3 Mac version
God-level code editing software (SublimeText3)

ZendStudio 13.5.1 Mac
Powerful PHP integrated development environment
