Чтение и замена текста в HTML приводит к высокой загрузке процессора

#javascript #html #xmlhttprequest #html5-video #innerhtml

#javascript #HTML #xmlhttprequest #html5-видео #innerhtml

Вопрос:

У меня проблема с высокой загрузкой процессора на веб-сайте, где я хочу заменить некоторый текст ссылками.

Скрипт загружается в конце текста.

Это работает нормально, когда на странице нет видео. Но если есть встроенные видео, подобные этому, загрузка процессора превышает 50%. Если я использую это для нескольких файлов, Firefox вылетает.

 <p><video width="320" height="240" class="mediaelement" autoplay="autoplay" src="video.mp4" controls="controls"><a href="video.mp4">resources/video.mp4</a></video></p>
  

Я понял, что проблема в этом, особенно в чтении из csv. Если я просто заменю текст фиксированными данными, это тоже сработает.

     var rawFile = new XMLHttpRequest();
    rawFile.open("GET", "data.csv", false);
    rawFile.overrideMimeType('text/xml; charset=iso-8859-1');
    rawFile.onreadystatechange = function ()
    {
    if(rawFile.readyState === 4)
    {
      if(rawFile.status === 200 || rawFile.status == 0)
      {
          var allText = rawFile.responseText;
          allText = allText.split("n"); 
          var sizedata = Object.size(allText); //Number of  entries
          var sizedata =  sizedata -1; //Excel  1 
          //alert("Debug: "   sizedata);

          var i = 0;
          while (i < sizedata)
              {
                  var word = allText[i].split(";");
                  var wordToDefine = word[0];
                  var wordDefinition = word[1];
                  var wordToReplace = wordToDefine

                  var replaceItem = new RegExp(wordToReplace,"g");

                  document.body.innerHTML = document.body.innerHTML.replace(replaceItem, " <a href='data.html' target='_self'><span style='color:green' title='WORD'>WORD</span></a>");  
                  i = i 1;
              }
      }
    }              
    }
    rawFile.send(null);
  

Есть идеи, что я могу с этим сделать?
Заранее благодарю вас.

Комментарии:

1. Изменение DOM требует много ресурсов процессора, и вы должны ограничить это. Помещение .innerHTML внутри цикла приводит к тому, что DOM вашего веб-сайта обновляется несколько раз. Рассмотрите возможность использования строки и добавления вашего HTML на каждой итерации, затем используйте внешний цикл innerHTML

Ответ №1:

Как уже упоминал @criz, построение DOM в цикле — очень плохая практика. Гораздо лучше создать DocumentFragment и прикрепить его к DOM. Взгляните на https://developer.mozilla.org/en-US/docs/Web/API/Document/createDocumentFragment Вот пример.

Комментарии:

1. Спасибо вам всем. Я здесь немного заблудился. Я понимаю, что изменения должны быть внесены только после загрузки страницы. Но я думал, что только что сделал это. Я просто перебираю строки в своих CSV-файлах.

2. Почему скрипт выполняется даже после загрузки страницы?