Моя функция загружается слишком долго

1

У меня есть функция, которая добавляет текст из текстовой области в div, но моя проблема в том, что для добавления более 500 строк требуется много времени. Он должен работать через секунду, когда я добавляю 3000 или 4000 строк, но я не знаю, что я делаю неправильно. Вот моя функция Add():

function add(){
    arraySearchTerms = document.getElementById("searchTerms").value.split('\n');
    for (var i = 0; i < arraySearchTerms.length; i++) {
        document.getElementById("keywords").innerHTML += '<div style="padding: 6px;border-bottom: #b5aeae; border-bottom-style: solid;border-bottom-width: 1px;"><span id="term'+ i +'">' + arraySearchTerms[i] + "</span><span style='float: right;'><img src='Red_Cross.png' height='15' width='11'/></span></div>";
    }   
}

Спасибо за помощь. Изменение: Это изображение? Он только весит 2k.

  • 1
    «Это должно сработать за секунду, когда я добавлю 3000 или 4000 строк» Откуда у вас такое впечатление? Вы выполняете операцию DOM для каждого элемента, и операции DOM являются одной из самых медленных операций, которые вы могли бы выполнить.
Теги:

1 ответ

4
Лучший ответ

Каждый раз, когда вы назначаете innerHTML, браузер должен очистить и повторно проанализировать новую строку HTML. Это относительно дорогостоящая операция по сравнению с большинством, особенно когда в ней много элементов. Попробуйте сначала придумать строку, и только присвойте элементу innerHTML в конце:

function add(){
  arraySearchTerms = document.getElementById("searchTerms").value.split('\n');
  let newKeywordHtmlStr = '';
  for (var i = 0; i < arraySearchTerms.length; i++) {
    newKeywordHtmlStr += '<div style="padding: 6px;border-bottom: #b5aeae; border-bottom-style: solid;border-bottom-width: 1px;"><span id="term'+ i +'">' + arraySearchTerms[i] + "</span><span style='float: right;'><img src='Red_Cross.png' height='15' width='11'/></span></div>";
  }
  document.getElementById("keywords").innerHTML += newKeywordHtmlStr;
}

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

function add(){
  const arraySearchTerms = document.getElementById("searchTerms").value.split('\n');
  let newKeywordHtmlStr = '';
  for (var i = 0; i < arraySearchTerms.length; i++) {
    newKeywordHtmlStr += '<div class="keyword"><span id="term'+ i +'">' + arraySearchTerms[i] + "</span><span><img src='Red_Cross.png' height='15' width='11'/></span></div>";
  }
  document.getElementById("keywords").innerHTML += newKeywordHtmlStr;
}

CSS:

.keyword {
  padding: 6px;
  border-bottom: #b5aeae;
  border-bottom-style: solid;
  border-bottom-width: 1px;
}
.keyword > span:nth-child(2) {
  float: right;
}

В примечаниях к комментариям, если источник arraySearchTerms недостоверен, и вы хотите дополнительно исключить HTML-теги из arraySearchTerms чтобы убедиться, что он не вызывает никаких проблем, вы можете вызвать замену на каждый элемент перед вставкой в строку HTML:

newKeywordHtmlStr += '<div class="keyword"><span id="term'+ i +'">' + arraySearchTerms[i].replace(/<(?:.|\n)*?>/gm, '') + "</span><span><img src='Red_Cross.png' height='15' width='11'/></span></div>";
  • 0
    Спасибо. Это прекрасно работает. Я должен был подумать об этом.
  • 0
    -1 для введения произвольных данных в контекст HTML. Это потенциальная угроза безопасности и может привести к повреждению HTML, а также к тому, что текст не будет экранирован.
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню