2014-02-03 7 views
0

Я хотел бы динамически создавать прослушиватели событий для нескольких кнопок, а затем показывать конкретную метку кадра в зависимости от щелчка кнопки, но я не уверен, что пройти (FYI, this будет использоваться для холста HTML5 во Flash CC, но в основном то же самое должно относиться к веб-странице для отображения div и т. д.). Сейчас у меня это:передать текущее имя цели функции

var butTotal = 4; 
var selfHome = this; 

function createListeners() { 
    for (var i=0; i<butTotal; i++) { 
     selfHome["btn" + i].addEventListener('click', openPop); 
    } 
} 

function openPop() { 
    alert("test"); 
    selfHome.gotoAndPlay("pop"+event.currentTarget.name.substr(3)); 
} 

createListeners(); 

Это создает слушатель хорошо, но я не знаю, с чего начать прохождение через имя текущего экземпляра кнопки, чтобы сказать ему, какой кадр этикетка для gotoAndPlay.

+2

Возможно, это «событие» будет автоматически в Chrome, однако, в Firefox (другие?), вы должны добавить это в openPop, как этот 'openPop (event)', см. здесь: http://jsfiddle.net/te54E/2/ – smerny

ответ

0

На основании кода, который у вас есть, я бы просто изменил .addEventListener(), чтобы вызвать общую функцию (а не openPop, напрямую) и передать ей ссылку на кнопку. Таким образом, это:

selfHome["btn" + i].addEventListener('click', openPop); 

. , , стал бы это:

selfHome["btn" + i].addEventListener('click', function() { 
    openPop(this); 
}); 

В этот момент, вы бы тогда обновить openPop принять параметр для ссылки на элемент, который вызвал его. , , что-то вроде:

function openPop (currentButton) { 

В этот момент, вы можете ссылаться на щелкнул кнопку, с помощью currentButton в openPop логике.

+0

событие будет передано автоматически, currentTarget можно получить из события. это должна быть еще одна проблема, см. мой комментарий. – smerny

+0

Я действительно собирался ответить, в значительной степени, на ваш второй комментарий, который вы только что разместили в OP. , , ваш подход будет работать, но только если вы указали событие как параметр в 'openPop'. В любом случае все должно быть хорошо. – talemyn

+0

Я вижу, ну, анонимная функция не нужна ... но она тоже будет работать, я полагаю. Вот вам скрипка: (http://jsfiddle.net/te54E/3/). Мое первое предположение (по-прежнему любопытно) заключается в том, что 'selfHome' не содержит всего, что полагает OP. – smerny

0

Я не уверен, что полностью понимаю ваш вопрос. Однако, если вам просто нужно передать экземпляр кнопки (в вашем случае «selfHome [" btn "+ i]"), вы можете вызвать анонимную функцию в обработчике событий, которая вызывает openPop() с экземпляром кнопки в качестве средства. Будет ли это работать для вас?

var butTotal = 4; 
var selfHome = this; 

function createListeners() { 
    for (var i=0; i<butTotal; i++) { 
     var currentBtn = selfHome["btn" + i]; 
     currentBtn.addEventListener('click', function(){openPop(currentBtn);}); 

    } 
} 

function openPop (btn) { 
    alert("test"); 
    selfHome.gotoAndPlay(/*use button instance 'btn' to find frame*/);  
} 
createListeners(); 
+0

Это фактически означает, что каждая кнопка является последней кнопкой. Потому что 'currentBtn' будет обновляться до последней кнопки в цикле. Затем, когда он фактически вызван (независимо от того, какая кнопка нажата), он будет передавать значение последнего. http://jsfiddle.net/te54E/6/. прохождение 'this' вместо этого исправит это: http://jsfiddle.net/te54E/7/ – smerny

0

Когда событие срабатывает this ключевое слово внутри функции обработчика устанавливается на элемент стреляет событие EventTarget.addEventListener on MDN. Если кнопка есть данные, необходимые для его загрузки просто получить его от this ключевого слова:

function openPop (btn) { 
    alert(this.name); 
    /* ... */ 
} 
+1

Любопытно, зачем добавить' btn' в подпись метода? http://jsfiddle.net/te54E/5/ – smerny

+0

Просто скопировал код из OP. – Prusse

0

Похоже, что вы ожидаете, что он содержит функцию gotoAndPlay(), а также элементы БТН (которые содержат как идентификатор (из btn [число]) и имя с чем-то особенным в substr(3) (я предполагаю то же самое, что и id). Если все было правдой, оно должно работать в chrome ... в других браузерах вам нужно будет добавить event к openPop() подписи метода.

function openPop (event) { 
    alert("test"); 
    selfHome.gotoAndPlay("pop"+event.currentTarget.name.substr(3)); 
} 

Я считаю, что это то, что вы ищете и dding, что одно слово должно решить вашу проблему (предполагая, что некоторые вещи о вашем йот и что selfHome содержит):

JSFiddle

Вы также можете оставить из event от openPop() и заменить event.currentTarget с this:

function openPop() { 
    alert("test"); 
    selfHome.gotoAndPlay("pop"+this.name.substr(3)); 
} 

JSFiddle

Смежные вопросы