Monday, December 4, 2023
 Popular · Latest · Hot · Upcoming
145
rated 0 times [  152] [ 7]  / answers: 1 / hits: 34108  / 15 Years ago, fri, april 24, 2009, 12:00:00

I'm currently trying to use the YouTube API as part of a jQuery plugin and I've run into a bit of a problem.



The way the YT api works is that you load the flash player and, when it's ready it will send a call back to a global function called onYouTubePlayerReady(playerId). You can then use that id combined with getElementById(playerId) to send javascript calls into the flash player (ie, player.playVideo();).



You can attach an event listener to the player with player.addEventListener('onStateChange', 'playerState'); which will send any state changes to another global function (in this case playerState).



The problem is I'm not sure how to associate a state change with a specific player. My jQuery plugin can happily attach more than one video to a selector and attach events to each one, but the moment a state actually changes I lose track of which player it happened in.



I'm hoping some example code may make things a little clearer. The below code should work fine in any html file.



<!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01//EN http://www.w3.org/TR/html4/strict.dtd>
<html>
<head>
<meta http-equiv=Content-Type content=application/text+html;utf-8/>

<title>Sandbox</title>

<link type=text/css href=http://jqueryui.com/latest/themes/base/ui.all.css rel=stylesheet />
<script type=text/javascript src=http://www.google.com/jsapi></script>
<script type=text/javascript>
google.load(jquery, 1.3.2);
google.load(jqueryui, 1.7.0);
</script>
<script type=text/javascript src=http://swfobject.googlecode.com/svn/tags/rc3/swfobject/src/swfobject.js></script>
<script type=text/javascript>
(function($) {
$.fn.simplified = function() {
return this.each(function(i) {
var params = { allowScriptAccess: always };
var atts = { id: ytplayer+i };
$div = $('<div />').attr('id', containerplayer+i);
swfobject.embedSWF(http://www.youtube.com/v/QTQfGd3G6dg&enablejsapi=1&playerapiid=ytplayer+i,
containerplayer+i, 425, 356, 8, null, null, params, atts);
$(this).append($div);
});
}
})(jQuery);
function onYouTubePlayerReady(playerId) {
var player = $('#'+playerId)[0];
player.addEventListener('onStateChange', 'playerState');
}
function playerState(state) {
console.log(state);
}

$(document).ready(function() {
$('.secondary').simplified();
});
</script>
</head>
<body>
<div id=container>
<div class=secondary>

</div>
<div class=secondary>

</div>
<div class=secondary>

</div>
<div class=secondary>

</div>

</div>
</body>

</html>


You'll see the console.log() outputtin information on the state changes, but, like I said, I don't know how to tell which player it's associated with.



Anyone have any thoughts on a way around this?



EDIT:
Sorry, I should also mentioned that I have tried wrapping the event call in a closure.



function onYouTubePlayerReady(playerId) {
var player = $('#'+playerId)[0];
player.addEventListener('onStateChange', function(state) {
return playerState(state, playerId, player); } );
}

function playerState(state, playerId, player) {
console.log(state);
console.log(playerId);
}


In this situation playerState never gets called. Which is extra frustrating.


More From » jquery

 Answers
61

Edit:



Apparently calling addEventListener on the player object causes the script to be used as a string in an XML property that's passed to the flash object - this rules out closures and the like, so it's time for an old-school ugly hack:



function onYouTubePlayerReady(playerId) {
var player = $('#'+playerId)[0];

player.addEventListener('onStateChange', '(function(state) { return playerState(state, ' + playerId + '); })' );
}

function playerState(state, playerId) {
console.log(state);
console.log(playerId);
}


Tested & working!


[#99653] Sunday, April 19, 2009, 15 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
victorw

Total Points: 484
Total Questions: 120
Total Answers: 107

Location: Faroe Islands
Member since Thu, Apr 8, 2021
3 Years ago
victorw questions
Fri, Mar 18, 22, 00:00, 2 Years ago
Sun, Feb 20, 22, 00:00, 2 Years ago
Fri, May 7, 21, 00:00, 3 Years ago
Sat, Mar 13, 21, 00:00, 3 Years ago
;