Нужно добавить атрибут defer при загрузке страницы всем <script>-ам. Таким образом хочу ускорить загрузку страницы.
Данный скрипт не срабатывает:
var script = document.createElement('script');
script.setAttribute("defer", "defer");
Как это сделать правильно?
[].slice.call(document.getElementsByTagName('script')).forEach(function (script) {
script.setAttribute("defer", "defer");
})
Никак.
Проблема в том, что и document.scripts, и document.getElementsByTagName('script') вернут только те скрипты, что уже появились в DOM. То есть те, которые уже выполнены, если у них изначально не было async и defer.
Соответственно, если поставить скрипт, добавляющий атрибут, первым в списке скриптов, то он не увидит других скриптов. Если поставить последним - то остальные скрипты к моменту запуска скрипты уже будут выполнены.
Попытка "пуститься во все тяжкие" и поменять document.documentElement.innerHTML ничем хорошим не кончится, хотя бы той же самой причине: остальных скриптов опять-таки ещё не будет в innerHTML.
Можно попытаться провернуть это через плагин к браузеру, но поговаривают, что и это не особо перспективный вариант.
for(let script of document.scripts) script.setAttribute('defer', 'defer')
Я так понял задача выдать всем скриптам на странице defer ? вот пример на jquery
var arr = $("script");
for (var i=0;i < arr.length;i++) {
$(arr[i]).attr("defer","defer");
}
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости