The problem is your function call (handling the click event) going recursive.
jQuery's .on(...) is capturing the click event for the specified selector (tr in your case) and everything beneath it. So the click event of the button inside the tr also fires the anonymous function you've defined.
In your scenario this is not desirable because the user's click triggers another click event, triggering another click event, and so on.
Every call to a function from inside a function generates a new entry on the call stack, which eventually grows too big and falls over. (That's the symptom you're seeing.) The stack shrinks back down only when a function actually returns... (which is never happening for you).
There are various ways you could avoid this problem. Possibly simplest: just forget having a click handler on the button itself (as the button's click triggers the containing tr click event anyway).
Alternatively you could tell jQuery to stop applying the click event up the DOM tree...
Quoting the jQuery documentation on this subject:
By default, most events bubble up from the original event target to
the document element.
At each element along the way, jQuery calls any
matching event handlers that have been attached. A handler can prevent
the event from bubbling further up the document tree (and thus prevent
handlers on those elements from running) by calling
event.stopPropagation().
Any other handlers attached on the current
element will run however.
To prevent that, call
event.stopImmediatePropagation(). (Event handlers bound to an element
are called in the same order that they were bound.)
Cite: http://api.jquery.com/on/
On a semi-related note, I'd strongly recommend structuring your jQuery code in a way which makes separation of event handlers vs private methods vs public methods as clear as possible. There's a variety of "recommendations" (I certainly can't say standards!) on how to do it - my personal favourite is here: https://stackoverflow.com/a/5947280/817132
Using this method, I create a "namespace" for all the UI code (assuming it's only a small codebase) and have one "setup" function (invoked by onReady) which connects all the event handlers to their relevant selectors. Those event handlers are as minimal as possible, mostly invoking private functions containing the real logic.
As a matter of personal preference, I avoid anonymous functions as much as possible. I attach references to functions instead.
On a semi-semi related note ... if you've not already, I would strongly recommend getting to grips with your browser's developer tools. (My personal favourite is that which ships with Chrome.)
Specifically look into breakpoints and learn how to step line by line (and in and out of functions) while using watches.
For example: https://developers.google.com/web/tools/chrome-devtools/javascript/add-breakpoints
$('td div#play'+tridx).click();???$('#play'+tridx).click();but it's not working$('td div#play'+tridx).click();event is propagating totr, seems you are stuck in continuous loop$(this).data('track-id')