У меня есть массив, содержащий сообщения, которые я печатаю на экран случайным образом по одному за раз. Я использую javascript для создания нового элемента DOM ('p'), а затем для создания нового текстового узла, который я прикрепляю к новому элементу p.для цикла, вызывающего множественное создание объекта
Чтобы не отображать дубликат, я создал новый массив, в котором будет отображаться новый текст. Перед печатью на экране, я проверяю, чтобы текст, который будет отображаться, в настоящее время не находится в новом массиве, поэтому я могу проверить наличие дубликатов.
Это никогда не находит дубликат, потому что каждый раз, когда он проходит через цикл for, он создает другой объект (я считаю, что это текстовый узел, потому что каждая итерация через него будет конфликтовать мне содержимое текстовых узлов + = 1 каждый . время, например, в первый раз, может получить:
«это сообщение»
и следующий лог консоли я получаю:
«это сообщение» «это сообщение "
и в следующий раз:
«это сообщение» «это сообщение» «это сообщение»
Вот код, я использую для этой части, как я считаю, что это только соответствующий код:
function randomMessages(){
var displayMessage = document.getElementById('front-message');
var newParagraph = document.createElement('p');
newParagraph.setAttribute('class', 'front-page-messages');
currentMessage = Math.floor(Math.random() * frontPageMessages.length);
var randomText = document.createTextNode(frontPageMessages[currentMessage]);
checkPastMessages(oldMessages, randomText, newParagraph); // check new array containing displayed messages for duplicates
newParagraph.appendChild(randomText);
displayMessage.appendChild(newParagraph);
newParagraph.style.position = "relative";
newParagraph.style.top = Math.floor(Math.random() * (window.innerHeight -430)) + "px";
newParagraph.style.textAlign = "center";
newParagraph.style.fontFamily ="'Montserrat', sans-serif";
newParagraph.style.fontSize = "1.3em";
newParagraph.style.color = "#52A8EC";
oldMessages.push(randomText);
console.log(oldMessages);
window.setTimeout(function(){
displayMessage.removeChild(newParagraph);
newParagraph.removeChild(randomText);
randomMessages();
}, 5000);
}
randomMessages();
function checkPastMessages(oldMessages, randomText, newParagraph){
for(var i = 0; i < oldMessages.length; i++){
if(randomText == oldMessages[i]){
console.log('duplicate');
randomMessages();
}else{
console.log('not a duplicate');
console.log(randomText);
};
};
}
Всякий раз, когда ваш скрипт 'checkPastMessages()' находит дубликат, он запускает новый цикл 'randomMessages()'. Я не понимаю, почему. – Pointy
Намерение состояло в том, чтобы повторно запустить randomMessages(), если массив уже содержал текст, но я вижу, что я создаю больше объектов, потому что я их не удалил. Мне все же нужно выяснить, как это сделать, не удаляя элемент до его использования в случае, если он не является дубликатом. (edit - Я просто добавил элементы удаления в том случае, если найден дубликат, но моя первоначальная проблема все еще существует.) – Mike
Текстовые узлы - это объекты, которые сравниваются по ссылке. Вместо этого вы должны сравнить их 'nodeValue' или сохранить используемые индексы ('currentMessage'). – Oriol