Я создал сценарий, который по умолчанию подключает прослушиватель событий к коллекции изображений. Когда элементы кликаются, слушатель свопит к другому событию, которое изменяет источник изображения и подталкивает идентификатор элемента к массиву, и это изменяется, если вы нажмете на обмениваемое изображение (исходный текст возвращается назад и последний элемент в массив удаляется). Существует кнопка «очистить» все изображения, установив источник по умолчанию и сбросив прослушиватель событий, но он не срабатывает надежно и иногда срабатывает с задержкой, в результате чего собирается только последний элемент в серии.Слушатель событий не может подключиться или удалить в некоторых контекстах
TL; DR: Событие срабатывает очень неудовлетворительно без видимых причин, и я хотел бы знать, почему это происходит и как я должен это исправить. JSFiddle и опубликованная версия доступны ниже.
Я загрузил текущую версию here, и вы можете отключить ошибку, выбрав несколько таблиц, нажав «Отмена» и снова выбрав эти кнопки. Обычно ошибка начинается со второго или третьего прохода.
У меня также есть fiddle.
Макет будет немного сумасшедшим на настольных компьютерах и ноутбуках, поскольку он был разработан для экранов телефонов, но вы сможете увидеть проблему и проверить код, чтобы это не было проблемой.
Блоки кода:
UNSET все выбранные таблицы:
function tableClear() {
//alert(document.getElementsByClassName('eatPlace')[tableResEnum].src);
//numResTables = document.getElementsByClassName('eatPlace').src.length;
tableArrayLength = tableArray.length - 1;
for (tableResEnum = 0; tableResEnum <= tableArrayLength; tableResEnum += 1) {
tableSrces = tableArray[tableResEnum].src;
//alert(tableSrcTapped);
if (tableSrces === tableSrcTapped) {
tableArray[tableResEnum].removeEventListener('click', tableUntap);
tableArray[tableResEnum].addEventListener('click', tableTap);
tableArray[tableResEnum].src = window.location + 'resources/tableBase.svg';
} /*else if() {
}*/
}
resTableArray.splice(0, resTableArray.length);
}
Set/отключенное конкретной таблицы:
tableUntap = function() {
$(this).unbind('click', tableUntap);
$(this).bind('click', tableTap);
this.setAttribute('src', 'resources/tableBase.svg');
resTableArray.shift(this);
};
tableTap = function() {
$(this).unbind('click', tableTap);
$(this).bind('click', tableUntap);
this.setAttribute('src', 'resources/tableTapped.svg');
resTableArray.push($(this).attr('id'));
};
Преобразование элементов в классе 'eatPlace' в массив:
$('.eatPlace').bind('click', tableTap);
tableList = document.getElementsByClassName('eatPlace');
tableArray = Array.prototype.slice.call(tableList);
Таблица конкретизации:
for (tableEnum = 1; tableEnum <= tableNum; tableEnum += 1) {
tableImg = document.createElement('IMG');
tableImg.setAttribute('src', 'resources/tableBase.svg');
tableImg.setAttribute('id', 'table' + tableEnum);
tableImg.setAttribute('class', 'eatPlace');
tableImg.setAttribute('width', '15%');
tableImg.setAttribute('height', '15%');
$('#tableBox').append(tableImg, tableEnum);
if (tableEnum % 4 === 0) {
$('#tableBox').append("\n");
}
if (tableEnum === tableNum) {
$('#tableBox').append("<div id='subbles' class='ajaxButton'>Next</div>");
$('#tableBox').append("<div id='cazzles' class='ajaxButton'>Cancel</div>");
}
}
СПАСИБО! : D Кажется настолько очевидным, чтобы выбирать элементы из массива, я не могу поверить, что не думал об этом. Извините, если мой вопрос был немного кратким и авторитарным, я не думаю, что был в наилучшем состоянии, когда писал. –
Все ваши предложения выглядят хорошо, я проверю их и приму, если они будут работать. Еще раз спасибо :) –
Лично я хотел бы инкапсулировать всю логику прослушивания таблиц в один объект JavaScript, где я бы сохранил ссылки на html DOM, чтобы иметь возможность быстро обновлять представление таблиц, сохраняя при этом все остальные необходимые данные в объекте. После этого, вся логика будет содержать кучу мелких объектов. –