Hey there! I’m absolutely thrilled to walk you through how to control HTML5 audio with jQuery. If you’ve been looking for ways to take complete control of audio elements without relying on default browser controls, you’ve landed in exactly the right place!
As a follow-up to my earlier HTML5 audio Player tutorial, I want to show you how incredibly powerful the combination of HTML5 audio and jQuery can be. This guide will revolutionize how you implement audio in your web projects – guaranteed!
Let’s be honest – if you’re building a web application with multiple audio elements, letting users deal with numerous separate audio players is just plain inefficient. Instead, you can create a unified, customized interface that controls everything seamlessly with jQuery.
The possibilities are endless:
By the end of this tutorial, you’ll have mastered complete control over HTML5 audio elements using jQuery’s powerful methods. Let’s dive right in!
First things first – we need to create our audio element. Here’s the basic HTML5 markup we’ll use:
<audio class="audioDemo" controls preload="none">
<source src="audio/music.mp3" type="audio/mpeg">
<source src="audio/music.ogg" type="audio/ogg">
</audio>Code language: JavaScript (javascript) Notice I’ve included two source formats for maximum browser compatibility. Modern browsers support MP3 format universally, but it’s still good practice to provide an OGG fallback.
The preload="none" attribute is crucial here. It tells the browser not to load any audio data when the page loads, which significantly improves initial page performance. We’ll handle the loading ourselves with jQuery for complete control.
Since we’ve set preload="none", we need to manually trigger the loading process when appropriate. Here’s how to do it:
// Trigger loading of the audio file
$(".audioDemo").trigger('load');Code language: JavaScript (javascript) Want to know when your audio has finished loading? Let’s add an event listener:
// Listen for when audio metadata is loaded
$(".audioDemo").on("loadedmetadata", function(){
$(".alert-success").html("Audio metadata loaded successfully!");
});
// Listen for when audio can play through
$(".audioDemo").on("canplaythrough", function(){
$(".alert-success").html("Audio loaded and ready to play!");
});
// Now trigger the load
$(".audioDemo").trigger('load');Code language: JavaScript (javascript) The loadedmetadata event fires when basic information about the audio file (like duration) is available, while canplaythrough fires when the browser estimates it can play the entire file without stopping for buffering.
Now let’s implement the fundamental audio controls:
Starting and pausing playback is incredibly simple:
// Play the audio
$(".audioDemo").trigger('play');
// Pause the audio
$(".audioDemo").trigger('pause');Code language: JavaScript (javascript) Interestingly, HTML5 audio doesn’t have a built-in “stop” event – but we can easily create our own function by combining pause with resetting the playback position:
function stopAudio() {
// First pause the audio
$(".audioDemo").trigger('pause');
// Then reset current time to beginning
$(".audioDemo").prop("currentTime", 0);
}Code language: JavaScript (javascript) Let’s go beyond the basics with some more advanced controls!
The default HTML5 player doesn’t provide skip forward/backward buttons, but we can implement them ourselves:
// Skip forward 5 seconds
function skipForward() {
var audio = $(".audioDemo")[0];
audio.currentTime = Math.min(audio.currentTime + 5, audio.duration);
}
// Skip backward 5 seconds
function skipBackward() {
var audio = $(".audioDemo")[0];
audio.currentTime = Math.max(audio.currentTime - 5, 0);
}Code language: JavaScript (javascript) I’ve improved the original code by adding boundary checks to prevent errors when trying to skip beyond the audio’s duration or before its beginning.
Controlling volume is essential for a good user experience:
function volumeUp() {
var audio = $(".audioDemo")[0];
var newVolume = audio.volume + 0.1;
// Make sure we don't exceed maximum volume (1.0)
audio.volume = newVolume > 1 ? 1 : newVolume;
// Update volume display if needed
updateVolumeDisplay(audio.volume);
}
function volumeDown() {
var audio = $(".audioDemo")[0];
var newVolume = audio.volume - 0.1;
// Make sure we don't go below minimum volume (0)
audio.volume = newVolume < 0 ? 0 : newVolume;
// Update volume display if needed
updateVolumeDisplay(audio.volume);
}
function updateVolumeDisplay(volume) {
// Optional: update a visual indicator like a progress bar
$("#volumeLevel").css("width", (volume * 100) + "%");
}Code language: JavaScript (javascript) Implementing a mute toggle is beautifully simple:
function toggleMute() {
var audio = $(".audioDemo")[0];
audio.muted = !audio.muted;
// Update UI to reflect muted state
if (audio.muted) {
$("#muteButton").addClass("active");
} else {
$("#muteButton").removeClass("active");
}
}Code language: JavaScript (javascript) Now let’s put everything together and create a beautiful custom audio player:
<div class="custom-audio-player">
<div class="player-controls">
<button id="playPauseBtn" class="control-btn">Play</button>
<button id="stopBtn" class="control-btn">Stop</button>
<button id="rewindBtn" class="control-btn">-5s</button>
<button id="forwardBtn" class="control-btn">+5s</button>
</div>
<div class="progress-container">
<div id="progressBar" class="progress-bar"></div>
<div id="progressTime" class="time-display">0:00 / 0:00</div>
</div>
<div class="volume-controls">
<button id="muteBtn" class="control-btn">Mute</button>
<button id="volumeDownBtn" class="control-btn">-</button>
<div id="volumeBar" class="volume-bar">
<div id="volumeLevel" class="volume-level"></div>
</div>
<button id="volumeUpBtn" class="control-btn">+</button>
</div>
</div>
<!-- Hidden HTML5 audio element -->
<audio id="audioPlayer" preload="none">
<source src="audio/music.mp3" type="audio/mpeg">
<source src="audio/music.ogg" type="audio/ogg">
</audio>Code language: HTML, XML (xml) And here’s the jQuery code to wire everything up:
$(document).ready(function() {
var audio = document.getElementById('audioPlayer');
var playPauseBtn = $("#playPauseBtn");
var progressBar = $("#progressBar");
var progressTime = $("#progressTime");
// Initialize by loading audio metadata
$(audio).on('loadedmetadata', function() {
updateProgressDisplay(0);
});
$(audio).trigger('load');
// Play/Pause button
playPauseBtn.click(function() {
if (audio.paused) {
audio.play();
playPauseBtn.text("Pause");
} else {
audio.pause();
playPauseBtn.text("Play");
}
});
// Stop button
$("#stopBtn").click(function() {
audio.pause();
audio.currentTime = 0;
playPauseBtn.text("Play");
});
// Skip forward/backward
$("#forwardBtn").click(function() {
audio.currentTime = Math.min(audio.currentTime + 5, audio.duration);
});
$("#rewindBtn").click(function() {
audio.currentTime = Math.max(audio.currentTime - 5, 0);
});
// Volume controls
$("#volumeUpBtn").click(function() {
audio.volume = Math.min(audio.volume + 0.1, 1);
updateVolumeDisplay();
});
$("#volumeDownBtn").click(function() {
audio.volume = Math.max(audio.volume - 0.1, 0);
updateVolumeDisplay();
});
$("#muteBtn").click(function() {
audio.muted = !audio.muted;
$(this).toggleClass("active", audio.muted);
});
// Update progress during playback
$(audio).on('timeupdate', function() {
updateProgressDisplay(audio.currentTime);
});
function updateProgressDisplay(currentTime) {
var duration = audio.duration || 0;
var progressPercent = (currentTime / duration) * 100;
// Update progress bar
progressBar.css("width", progressPercent + "%");
// Update time display
progressTime.text(formatTime(currentTime) + " / " + formatTime(duration));
}
function updateVolumeDisplay() {
var volumePercent = audio.muted ? 0 : audio.volume * 100;
$("#volumeLevel").css("width", volumePercent + "%");
}
function formatTime(seconds) {
var minutes = Math.floor(seconds / 60);
seconds = Math.floor(seconds % 60);
return minutes + ":" + (seconds < 10 ? "0" : "") + seconds;
}
});Code language: JavaScript (javascript) Managing multiple audio players is simple with proper jQuery selectors. For instance, to ensure only one audio plays at a time:
$("audio").on("play", function() {
// Pause all other audio elements when one starts playing
$("audio").not(this).each(function() {
this.pause();
});
});Code language: JavaScript (javascript) Mobile browsers have different rules for audio playback. Most importantly, they require user interaction before audio can play:
// This will likely fail on mobile
$(document).ready(function() {
$(".audioDemo").trigger('play'); <em>// Won't work on most mobile browsers!</em>
});
// This is better
$("#playButton").on("click", function() {
$(".audioDemo").trigger('play'); <em>// Will work after user interaction</em>
});Code language: JavaScript (javascript) HTML5 audio elements emit many useful events we can hook into:
var audio = $(".audioDemo")[0];
$(audio).on("play", function() {
console.log("Audio started playing");
});
$(audio).on("pause", function() {
console.log("Audio paused");
});
$(audio).on("ended", function() {
console.log("Audio playback finished");
// Maybe start the next track here
});
$(audio).on("timeupdate", function() {
// This fires frequently during playback
updateProgressBar(this.currentTime);
});
$(audio).on("volumechange", function() {
console.log("Volume changed to: " + this.volume);
});Code language: JavaScript (javascript) When working with multiple audio files, performance becomes a concern. Here are some tips:
$("#playlist li").click(function() {
var audioSrc = $(this).data("src");
$("#audioPlayer").find("source").attr("src", audioSrc);
$("#audioPlayer")[0].load();
// Reload with new source
});Code language: JavaScript (javascript) preload="none", use preload="metadata" if you need duration information without loading the entire filefunction playSound(startTime, duration) {
var audio = $("#audioSprite")[0];
audio.currentTime = startTime; audio.play();
// Stop after duration
setTimeout(function() { audio.pause(); }, duration * 1000);
}Code language: JavaScript (javascript) If your audio won’t play, check these common issues:
Different browsers implement the HTML5 Audio API slightly differently. For consistent behavior:
Mastering HTML5 audio control with jQuery opens up incredible possibilities for your web applications. From simple audio players to complex media applications, you now have the tools to create exactly what you need!
The code samples in this tutorial provide a solid foundation that you can easily extend and customize for your specific projects. The combination of HTML5’s native capabilities with jQuery’s simplicity makes audio handling a breeze.
Have you created something awesome with HTML5 audio and jQuery? I’d absolutely love to see it! Drop a comment below to share your project or ask any questions.
Happy coding! 🎵
Tired of repetitive tasks eating up your time? Python can help you automate the boring stuff — from organizing files to scraping websites and sending…
Learn python file handling from scratch! This comprehensive guide walks you through reading, writing, and managing files in Python with real-world examples, troubleshooting tips, and…
You've conquered the service worker lifecycle, mastered caching strategies, and explored advanced features. Now it's time to lock down your implementation with battle-tested service worker…
This website uses cookies.
View Comments
I'm using the latest releases of Firefox and Chrome on Ubuntu 12.04. For me, your demo works fine in Firefox but not at all in Chrome. Have you noticed this?
I use mac, not ubuntu. But as being *nix based, should have been behaving in same way. However, thanks for noticing and reporting. I will check. Thanks.
Not sure what the problem was. I downloaded your script, invoked the initialisation differently and all works fine across Chrome, Opera and Firefox. Very useful - thanks.
Hi, I have followed your tutorial and it works perfect. What I don't understand clearly is, here you are using HTML5 audio player. Is it the same as this JavaScript/jQuery: audio = new Audio('test.mp3'); audio.play(); Or is this JavaScript player, and not HTML5 audio player? Thanks in advanced for your answer!
HTML5 consists of all new features of css/javascripts which are supported by browsers. You can't use this javascript code on a old browser version that doesn't have HTML5 support. Hope this helps!
is there any option to only show muted control, please reply
nice one , helped me a lot , thanks :)
I'm using a HTML5 player in joomla that's control by jquery. It keeps looping the song. Is there a way to stop the repeat?
Hi there, is there a way to exclude or deactivate the volume control from the standard html5 audio control.
im using multiple audio tags
i want it to be played one at a time
this is the code
aoa... dear how to play songs using this tag if we store path of song file in database
Looking at the "Control HTML5 Audio With Jquery" and "Javascript Audio Controller Demo" pages and I still have no idea how to make an audio player using jquery. I never saw any download links on the demo page. Is there source code on GITHUB. The demo page also uses bootstrap for the buttons. I real working demo that can be downloaded would make more sense. Thanks.
Hi, good explication. In this moment I have a problem, I not know control the preload for created a progress bar of preload of audio.