Javascript функция сработала на событие - получить цель?

1

Я использую 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;
}
  • 0
    Обвините Google (или кто-либо другой авторы) в использовании eval , вот как это работает
Теги:
javascript-events
function
events
dom-events

2 ответа

2
Лучший ответ

Кажется, что единственный доступный параметр представляет статус.

Так как кажется, что вы передаете строку, которая оценивается, вам может понадобиться создать отдельную функцию для каждого:

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 );
}
  • 0
    благодарю вас! Однако я не могу иметь отдельную функцию для каждого игрока. Потому что все игроки генерируются динамически (я не знаю ytplayerNUMBER раньше). Ваша вторая строка анонимной функции звучит очень хорошо, однако, если я попробую, чтобы моя функция foo даже не запустилась?
  • 0
    извини, это уволят. Однако, если я консольный журнал внутри foo (), как это ... console.log (status); console.log (игрок); вывод "5" и весь swfobject "<идентификатор объекта =" ytplayer "..> Что означает 5?
Показать ещё 26 комментариев
1

этот должен содержать требуемый объект.

  • 0
    спасибо, но это не так! alert( this ); выдает [объект DOMWindow], а не ytplayer!
  • 0
    Это, наверное, то, что следует потушить. Попробуйте вызвать какой-нибудь метод или получить свойство ytplayer, используя это . [MethodNameHere]
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню