2015-09-19 2 views
2

У меня есть массив, содержащий сообщения, которые я печатаю на экран случайным образом по одному за раз. Я использую 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); 
     }; 

    }; 

} 
+0

Всякий раз, когда ваш скрипт 'checkPastMessages()' находит дубликат, он запускает новый цикл 'randomMessages()'. Я не понимаю, почему. – Pointy

+0

Намерение состояло в том, чтобы повторно запустить randomMessages(), если массив уже содержал текст, но я вижу, что я создаю больше объектов, потому что я их не удалил. Мне все же нужно выяснить, как это сделать, не удаляя элемент до его использования в случае, если он не является дубликатом. (edit - Я просто добавил элементы удаления в том случае, если найден дубликат, но моя первоначальная проблема все еще существует.) – Mike

+1

Текстовые узлы - это объекты, которые сравниваются по ссылке. Вместо этого вы должны сравнить их 'nodeValue' или сохранить используемые индексы ('currentMessage'). – Oriol

ответ

2
change line: checkPastMessages(oldMessages, randomText, newParagraph) 
to: checkPastMessages(oldMessages, randomText.textContent, newParagraph) 

и

change line: oldMessages.push(randomText) 
to: oldMessages.push(randomText.textContent) 

таким образом, следующая строка будет сравнение строковых литералов в отличии от объектов:

if(randomText == oldMessages[i]) { 

вы не получите равенство между сравнением двух объектов. Попробуйте следующие примеры в консоли:

var o=document.createTextNode("abc"); 
var b=document.createTextNode("abc"); 

console.log(o==b); //should yield false; 
console.log(o.textContent==b.textContent); //should yield true 

var c = o; 
console.log(c == o); //should yield true since they both point to the same object address (reference). 
1

решение добавить строку frontPageMessages[currentMessage] или индекс currentMessage к списку oldMessages.

В настоящее время это не работает, потому что сравнение объектов в checkPastMessages не показывает идентичные узлы как идентичные. Что добавляет к путанице, так это то, что console.log обрабатывает текстовые узлы, как если бы они были строками.

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