javascript - How to stop the infinite loop in the play/pause control function -
in music player have function controls audio object , when play/pause button clicked decides either pause sound or play it. if other audio playing when button clicked, pauses them , play sound corresponding click button.
this function:
function manageaudio() { if (audio.paused) { //play after 150ms settimeout(function() { audio.play(); }, 150); $('.playbutton.playing').click(); $(thisobj).addclass("bekhon"); $(".smusicplyaer").removeclass("nakhon "); } else { audio.pause(); $(thisobj).addclass("nakhon"); $(".smusicplyaer").removeclass("bekhon"); } } here full demo have look:
$.fn.musicplayer = function(options) { var settings = $.extend({ // these defaults title: "", track_url: "", load_playlist: "" }, options); var audio, thisobj, playpausebtn; audio = new audio(); thisobj = this; playpausebtn = $(".playbutton", thisobj); //statuses evnts $(audio).on("playing", function() { toggleplying(playpausebtn, true); $(playpausebtn).addclass("pause"); }); $(audio).on("pause", function() { toggleplying(playpausebtn, false); $(playpausebtn).removeclass("pause"); }); thisobj.each(function() { audio.src = settings.track_url; $(".title", thisobj).text(settings.title); if (settings.load_playlist == "true") { $(thisobj).css("height", "140px"); $(thisobj).append("<div class='playlist'></div>"); $(".playlist", thisobj).append("<div class='row' data-src='https://p.scdn.co/mp3-preview/c92cc644b1eb5094ce65cf561c41b0c6d9f3faaa'>music 1</div>"); $(".playlist", thisobj).append("<div class='row' data-src='https://p.scdn.co/mp3-preview/dc73c2b8aa08c7b5ac2c72813326fbd6aa65787b'>music 2</div>"); $(".playlist", thisobj).append("<div class='row' data-src='https://p.scdn.co/mp3-preview/b2da3e7ee2834c24fbf5a0927e59d34cc618e30e'>music 3</div>"); } }); $(playpausebtn, thisobj).on("click tap", function() { manageaudio(); }); $(".playlist > .row", thisobj).on("click tap", function() { audio.src = $(this).attr("data-src"); manageaudio(); }); function manageaudio() { if (audio.paused) { //play after 150ms settimeout(function() { audio.play(); }, 150); console.log("print"); $('.playbutton.playing').click(); $(thisobj).addclass("bekhon"); $(".smusicplyaer").removeclass("nakhon "); } else { audio.pause(); $(thisobj).addclass("nakhon"); $(".smusicplyaer").removeclass("bekhon"); } } } // utility functions function toggleplying(aclassname, bool) { $(aclassname).toggleclass("playing", bool); } $("#player1").musicplayer({ title: "title 1", track_url: "https://rjmediamusic.com/media/mp3/mp3-256/alireza-jj-sijal-nassim-ki-khoobe-ki-bad-(ft-behzad-leito-sami-low-afx).mp3" }); $("#player2").musicplayer({ title: "title 2", track_url: "http://myst729.qiniudn.com/within-temptation_pale.mp3", load_playlist: "true" }); $("#player3").musicplayer({ title: "title 3", track_url: "https://p.scdn.co/mp3-preview/657f7141682f667253bf9c3afab5feebccf75105" }); body { background: url(http://wallpapercave.com/wp/vkygwei.jpg) no-repeat; background-size: cover; } .smp { background: rgba(255, 255, 255, 0.5); color: #000; width: 400px; height: 50px; margin: 10px; } .playbutton { background: url(https://cdn4.iconfinder.com/data/icons/standard-free-icons/139/play01-64.png); background-size: 30px 30px !important; width: 30px; height: 30px; } .playbutton.pause { background: url(https://cdn4.iconfinder.com/data/icons/ionicons/512/icon-pause-48.png); } .row { border: 1px solid black; margin: 5px 0 5px 0; } <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="smp" id="player1"> <div class="playbutton"></div> <div class="title"></div> </div> <div class="smp" id="player2"> <div class="playbutton"></div> <div class="title"></div> </div> <div class="smp" id="player3"> <div class="playbutton"></div> <div class="title"></div> </div> to see error, click on play button in player 2, change track click on track in same playlist. ends uncaught rangeerror: maximum call stack size exceeded(…) error. related $('.playbutton.playing').click();.
any solution fix it?
you have make sure clicking play button outside current playlist.
so instead of doing $('.playbutton.playing').click(); can do:
var $playing = $('.playbutton.playing'); if ($(thisobj).find($playing).length === 0) { $playing.click(); } this way not clicking again play button in middle box.
Comments
Post a Comment