2016-08-09 7 views
0

Я хочу, чтобы функция прослушивания событий, isTwoCards, захватывала информацию от объекта, который ее вызывает. Этот код дает мне element.getAttribute не является функциейjavascript function Слушатель событий DOM с использованием «this»

var gameboard = document.getElementById('game-board'); 
var cards = ['queen', 'queen', 'king', 'king']; 
var cardsInPlay = []; 

var isTwoCards = function(element){ 
    cardsInPlay.push(element.getAttribute('data-card')); 
    if (cardsInPlay.length === 2){ 
     isMatch(cardsInPlay); 
     cardsInPlay = []; 
    } 
} 
var createBoard = function(){ 
    for (var i = 0; i < cards.length; i++){ 
     cardDiv = document.createElement('div'); 
     cardDiv.setAttribute('class', 'card'); 
     cardDiv.setAttribute('data-card', cards[i]); 
     cardDiv.setAttribute('id', i); 
     cardDiv.addEventListener('click', isTwoCards(this)); 
     gameboard.appendChild(cardDiv); 
    } 
} 
createBoard() 
+0

'cardDiv.addEventListener ('click', isTwoCards);' then in 'isTwoCards()' do: 'cardsInPlay.push (this.getAttribute ('data-card'));' –

+0

Вам не нужно передайте это как аргумент (который также не работает). Замените 'isTwoCards (this)' на 'isTwoCards' и' element.getAttribute ('data-card') 'с' this.getAttribute ('data-card') ' – evolutionxbox

+0

' addEventListener ('click', isTwoCards (this)) '<--- Это вызывает функцию' isTwoCards', не добавляя ее в качестве слушателя. – evolutionxbox

ответ

1

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

someDomElement.addEventListener('click', function() { }) 

Давайте сохраним эту функцию в переменной и передадим ее в качестве аргумента.

const myFunction = function() { } 
someDomElement.addEventListener('click', myFunction) 

См., Я просто передал функцию, хранящуюся в переменной, в качестве аргумента. Теперь вы выполняете функцию:

const myFunction = function() { } 
someDomElement.addEventListener('click', myFunction()) 

Вот почему это не работает.

1

Вы на самом деле прикрепление undefined в качестве слушателя, потому что он выполняет функцию и ее возвращаемое значение undefined.

Вы можете исправить это, создавая замыкание/просто возвращает новую функцию:

var isTwoCards = function(element){ 
    return function() { 
    cardsInPlay.push(element.getAttribute('data-card')); 
    if (cardsInPlay.length === 2){ 
     isMatch(cardsInPlay); 
     cardsInPlay = []; 
    } 
    }; 
} 

Вы также можете просто получить доступ к this внутри слушателя, чтобы получить доступ к элементу, который слушатель событий обязан:

var isTwoCards = function(){ 
    var element = this; 
    cardsInPlay.push(element.getAttribute('data-card')); 
    if (cardsInPlay.length === 2){ 
     isMatch(cardsInPlay); 
     cardsInPlay = []; 
    } 
} 
+0

Этот ответ не устанавливает проблемы с вызовом функции, а не добавлением ее в качестве слушателя. 'cardDiv.addEventListener ('click', isTwoCards (this));' – evolutionxbox

+1

Это только проблема, если 'isTwoCards' не возвращает функцию. – circusbred

+0

Это очень верно. – evolutionxbox

2

Вы сразу же запускаете isTwoCards вместо того, чтобы назначать его в качестве обратного вызова. Из того, что я вижу, нужно назначить isTwoCards (а не его результат!) В качестве обратного вызова, то есть cardDiv.addEventListener('click', isTwoCards). Вы также должны использовать this.getAttribute('data-card') вместо element. this назначается элементу, когда функция запускается как обратный вызов, а не когда назначается обратный вызов.