2017-02-07 2 views
0

я следующий код, написанный в моем .js файле:Uncaught TypeError: Не удается прочитать свойство «добавить» неопределенной

var tiles = document.querySelectorAll(".tile"); 
var tileNumbers = ["one", "two", "three", "four"]; 

for(var i = 0; i < tiles.length; i++){ 
    var num = Math.floor(Math.random() * tileNumbers.lenth); 
    tiles.classList.add(tileNumbers[num]); 
    tileNumbers.pop(num); 
} 

«s в файл .html, и я пытаюсь добавьте класс каждый из четырех фрагментов отдельно. Занятия проводятся в tileNumbers. Когда я запускаю код в Chrome, я получаю сообщение об ошибке:

"Uncaught TypeError: Cannot read property 'add' of undefined."

Я уверен, что все написано правильно. Пожалуйста помоги!

+2

Изменить 'tiles' =>' tiles [i] 'in' for() '. – Tushar

+0

Кроме того, опечатка: 'tileNumbers.lenth' должна быть' tileNumbers.length' –

+0

Кроме того, 'tileNumbers.pop (num);' не делает то, что вы, вероятно, думаете, так как '.pop()' не принять аргумент. Вы, вероятно, ищете '.splice (num, 1)' –

ответ

1

Вы хотите позвонить add на плитке, но пытаются получить доступ к add функции самого tiles массива. Этого не существует.

Что вам нужно сделать, так это получить доступ к функции add каждой отдельной плитки. Чтобы сделать это, сначала нужно получить его:

var tile = tiles[i]; 

Затем измените вызов

tile.classList.add(…); 

(Вы можете также опустить временную переменную tile и использовать tiles[i].classList.add непосредственно Но ИМХО с помощью специальной переменной делает. код более понятный для чтения.)

Другой вариант, который может быть еще лучше, заключается в использовании forEach. Поскольку вы используете i только для доступа к текущему элементу, и ничего больше, вы в основном хотите выполнить действие для каждого элемента. Вы можете сделать это, как это, а также (и, для бонусных очков, это даже защищает Вас от вне череды ошибок):

tiles.forEach(function (tile) { 
    // ... 
}); 

Затем в теле функции, вы автоматически иметь переменную tile, что вы может получить доступ так, как вы хотите.

Все :-)

+0

Спасибо за ответ, еще один вопрос: я добавил «[i]» сразу после фрагментов и перед «.classList», и я получаю «неопределенный» класс на все списки классов плитки. – sespler

+0

Добро пожаловать :-) –

+0

PS: Если бы это ответили на ваш вопрос, было бы здорово, если бы вы могли отметить этот ответ как принято :-) –

0
tiles[i].classList.add(tileNumbers[num]); 

Не

tiles.classList.add(tileNumbers[num]); 
Смежные вопросы