Я использую Javascript API YouTube, но это может даже не быть вопросом, напрямую связанным с этим API.
ytplayer.addEventListener("onStateChange", "foo");
Если состояние "ytplayer" меняется, то foo будет запущен!
function foo() {
//how to get "ytplayer" in here?
}
Можно ли узнать, что foo()
функцию foo()
внутри функции foo()
? Звучит странно, и это трудно объяснить. Представьте, что у меня есть несколько ytplayer, таких как ytplayer1, ytplayer2 и т.д., И каждое видео запускает одну и ту же функцию foo()
после изменения состояния.
Можно ли узнать, какая функция foo() запущена ytplayer внутри функции foo()? Извините, я не могу объяснить это лучше! :)
редактировать:
Просто чтобы вы поняли, что я делаю!
/*Control Youtube videos with swfobject*/
function onYouTubePlayerReady() {
var $ytid = '',
ytid = '';
$('object[id^="ytplayer_"]').each(function() {
$ytid = $(this).attr('id');
ytid = document.getElementById($ytid);
ytid.addEventListener("onStateChange", "(function(status){foo(status,"+$ytid+");})");
ytid.unMute();
ytid.setVolume(100);
});
};
function foo( status, player ) {
console.log(status);
console.log(player);
//var pl = player;
}
Кажется, что единственный доступный параметр представляет статус.
Так как кажется, что вы передаете строку, которая оценивается, вам может понадобиться создать отдельную функцию для каждого:
function foo( status, player ) {
// do something with status and player
}
ytplayer1.addEventListener("onStateChange", "foo1");
function foo1( status ) {
foo( status, ytplayer1 );
}
ytplayer2.addEventListener("onStateChange", "foo2");
function foo2( status ) {
foo( status, ytplayer2 );
}
ytplayer3.addEventListener("onStateChange", "foo3");
function foo3( status ) {
foo( status, ytplayer3 );
}
или вы можете попробовать передать всю анонимную строку функции:
function foo( status, player ) {
// do something with status and player
}
ytplayer1.addEventListener("onStateChange", "(function(status){foo(status,ytplayer1);})");
ytplayer2.addEventListener("onStateChange", "(function(status){foo(status,ytplayer2);})");
ytplayer3.addEventListener("onStateChange", "(function(status){foo(status,ytplayer3);})");
EDIT: * Общий пример создания уникальных функций в пространстве имен.
// gets called by the namespaced functions
function foo( status, player ) {
// do something with status and player
}
// create some namespace
window.myNamespace = {};
// this gets called to create a new function in the namespace,
// and call addEventListener, which references the proper function
function funcFactory( player, i ) {
// create a new function in myNamespace
window.myNamespace[ "foo" + i ] = function( status ) {
foo( status, player );
};
// Add event listener that calls that function
player.addEventListener( "onStateChange", "window.myNamespace.foo" + i );
}
// your loop
for( var i = 1; i < 10; i++ ) {
var playa = someGeneratedPlayer();
funcFactory( playa, i );
}
этот должен содержать требуемый объект.
alert( this );
выдает [объект DOMWindow], а не ytplayer!
eval
, вот как это работает