/* * $(selector).initAudioPlayer(); * 不支持自动播放-想了下,用播放器样式的一般都不自动播放,影响用户体验。一般要自动播放的都不需要进度条之类的,需要一个切换按钮即可。 * 不支持audio的浏览器直接return */ (function($, window, document, undefined) { // 播放器样式 - 替换到css更改样式即可 console.log("tete"); var onMobile = "ontouchstart" in window, eStart = onMobile ? "touchstart" : "mousedown", eMove = onMobile ? "touchmove" : "mousemove", eCancel = onMobile ? "touchcancel" : "mouseup", hackPrefixes = ["webkit", "moz", "ms", "o"], hackHiddenProperty = getHackHidden(); $.fn.initAudioPlayer = function() { // 遍历处理audio console.log(this); this.each(function() { if ( $(this) .prop("tagName") .toLowerCase() !== "audio" ) { return; } var $this = $(this), file = $this.attr("src"), isSupport = false; if (canFilePlay(file)) { isSupport = true; } else { $this.find("source").each(function() { if (canFilePlay($(this).attr("src"))) { isSupport = true; return false; } }); } if (!isSupport) { return; } // 添加播放器盒子 var $player = $( '
' + $("
") .append($this.eq(0).clone()) .html() + '
' ), audioEle = $player.find("audio")[0]; $player.find("audio").addClass("audio-hidden"); $player.append( '
\
\
\
\
\
' ); var $bar = $player.find(".player-bar"), $played = $player.find(".player-bar-played"), $loaded = $player.find(".player-bar-loaded"), $current = $player.find(".player-time-current"), $duration = $player.find(".player-time-duration"); $current.html("00:00"); $duration.html("…"); initAudioEvents(); bindPageEvents(); $this.replaceWith($player); function initAudioEvents() { // 监听loadeddata,渲染进度条和时间 audioEle.addEventListener("loadeddata", function() { var loadTimer = setInterval(function() { if (audioEle.buffered.length < 1) { return true; } $loaded.width( (audioEle.buffered.end(0) / audioEle.duration) * 100 + "%" ); if ( Math.floor(audioEle.buffered.end(0)) >= Math.floor(audioEle.duration) ) { clearInterval(loadTimer); } }, 100); $duration.html( $.isNumeric(audioEle.duration) ? convertTimeStr(audioEle.duration) : "…" ); }); // 监听timeupdate,更新时间和进度条 audioEle.addEventListener("timeupdate", function() { $current.html(convertTimeStr(audioEle.currentTime)); $played.width((audioEle.currentTime / audioEle.duration) * 100 + "%"); }); // 监听ended,播放完恢复暂停状态 audioEle.addEventListener("ended", function() { $player.removeClass("player-playing").addClass("player-paused"); }); } function bindPageEvents() { // 监听进度条touch,更新进度条和播放进度 $bar .on(eStart, function(e) { audioEle.currentTime = getCurrentTime(e); $bar.on(eMove, function(e) { audioEle.currentTime = getCurrentTime(e); }); }) .on(eCancel, function() { $bar.unbind(eMove); }); // 监听播放暂停按钮click $player.find(".play-pause-btn").on("click", function() { if ($player.hasClass("player-playing")) { $player.removeClass("player-playing").addClass("player-paused"); audioEle.pause(); } else { $player.addClass("player-playing").removeClass("player-paused"); audioEle.play(); } return false; }); } function getCurrentTime(e) { var et = onMobile ? e.originalEvent.touches[0] : e; return Math.round( (audioEle.duration * (et.pageX - $bar.offset().left)) / $bar.width() ); } if (hackHiddenProperty) { var evtname = hackHiddenProperty.replace(/[H|h]idden/, "") + "visibilitychange"; document.addEventListener( evtname, function() { if (isHidden() || getHackVisibilityState() === "hidden") { $player.removeClass("player-playing").addClass("player-paused"); audioEle.pause(); } }, false ); } window.addEventListener( "beforeunload", function() { $player.removeClass("player-playing").addClass("player-paused"); audioEle.pause(); }, false ); }); return this; }; // 秒转为时间字符串 function convertTimeStr(secs) { var m = Math.floor(secs / 60), s = Math.floor(secs - m * 60); return (m < 10 ? "0" + m : m) + ":" + (s < 10 ? "0" + s : s); } // 判断文件能不能播放 function canFilePlay(file) { if (!file) { return false; } var media = document.createElement("audio"); if (typeof media.canPlayType !== "function") { return false; } var res = media.canPlayType( "audio/" + file .split(".") .pop() .toLowerCase() ); return res === "probably" || res === "maybe"; } function getHackHidden() { if ("hidden" in document) { return "hidden"; } for (var i = 0; i < hackPrefixes.length; i++) { if (hackPrefixes[i] + "Hidden" in document) { return hackPrefixes[i] + "Hidden"; } } return null; } function getHackVisibilityState() { if ("visibilityState" in document) { return "visibilityState"; } for (var i = 0; i < hackPrefixes.length; i++) { if (hackPrefixes[i] + "VisibilityState" in document) { return hackPrefixes[i] + "VisibilityState"; } } return null; } function isHidden() { var hide = getHackHidden(); if (!hide) { return false; } return document[hide]; } })(jQuery, window, document);