Не ждите DOMContentLoaded
и не вкладывайте функциональность в setTimeout
. Вместо этого поместите <script>
сразу после последнего элемента, от которого зависит скрипт - последний .thumbnails .title span
:
<div class="thumbnails">
<div class="title">
<span>
...
</span>
</div>
</div>
<script>
// Put the code here
</script>
Таким образом, изменение должно произойти немедленно, еще до того, как страница будет отображена для пользователь, так что он будет выглядеть так, как нужно, когда они увидят его в первый раз.
Что касается кода, let tArray = [titlesArray.length];
не имеет особого смысла - вы создаете массив с одним элементом, число, которое вы перебираете во вложенном l oop. Если вы просто хотите заменить ---
на пустую строку, а интервалы содержат только простой текст, используйте:
for (const span of document.querySelectorAll(".thumbnails .title span")) {
span.innerHTML = span.innerHTML.split('---').join('<br><br>');
}
<div class="thumbnails">
<div class="title">
<span>
foobar
---
barbaz
</span>
</div>
</div>
<script>
for (const span of document.querySelectorAll(".thumbnails .title span")) {
span.innerHTML = span.innerHTML.split('---').join('<br><br>');
}
</script>
(вам нужно два <br>
с, чтобы между двумя словами было два символа новой строки, чтобы в отображаемом выводе появилась одна пустая строка)
Если вы не можете изменить положение тега <script>
, и есть много контента между сценарием и концом HTML, и сценарий запускается до того, как необходимые элементы существуют, тогда вы не сможете сразу же выбрать элементы при запуске сценария и не сможете дождаться, пока DOMContentLoaded не создаст их, поскольку это может занять заметное время между требуемые элементы появляются и когда DOM полностью проанализирован. Единственная альтернатива - присоединить MutationObserver к документу, который может запускать обратный вызов всякий раз, когда вставляется новый узел. Если новый узел является одним из тех, которые вы хотите изменить, измените его. Это гарантирует, что изменение произойдет как можно скорее, перед рендерингом:
<script>
new MutationObserver((mutations) => {
for (const mutation of mutations) {
for (const node of mutation.addedNodes) {
if (node.nodeType === 1 && node.matches('.thumbnails .title span')) {
node.innerHTML = node.innerHTML.split('---').join('<br><br>');
}
}
}
})
.observe(document.body, { childList: true, subtree: true });
</script>
<div class="thumbnails">
<div class="title">
<span>
foobar
---
barbaz
</span>
</div>
<div class="title">
<span>
foobar
---
barbaz
</span>
</div>
</div>
Это может быть сделано дешевле - например, прикрепить глубокого наблюдателя только после того, как контейнер для всех thumbnails
существует, и отсоединить его, когда контейнер закончится - но для этого потребуется дополнительная информация о структуре DOM.