Как добавить атрибут defer всем скриптам при загрузке страницы

285
01 июля 2017, 12:58

Нужно добавить атрибут defer при загрузке страницы всем <script>-ам. Таким образом хочу ускорить загрузку страницы.

Данный скрипт не срабатывает:

var script = document.createElement('script');
script.setAttribute("defer", "defer");

Как это сделать правильно?

Answer 1
   [].slice.call(document.getElementsByTagName('script')).forEach(function (script) {
      script.setAttribute("defer", "defer");
   })
Answer 2

Никак.

Проблема в том, что и document.scripts, и document.getElementsByTagName('script') вернут только те скрипты, что уже появились в DOM. То есть те, которые уже выполнены, если у них изначально не было async и defer.

Соответственно, если поставить скрипт, добавляющий атрибут, первым в списке скриптов, то он не увидит других скриптов. Если поставить последним - то остальные скрипты к моменту запуска скрипты уже будут выполнены.

Попытка "пуститься во все тяжкие" и поменять document.documentElement.innerHTML ничем хорошим не кончится, хотя бы той же самой причине: остальных скриптов опять-таки ещё не будет в innerHTML.

Можно попытаться провернуть это через плагин к браузеру, но поговаривают, что и это не особо перспективный вариант.

Answer 3
for(let script of document.scripts) script.setAttribute('defer', 'defer')
Answer 4

Я так понял задача выдать всем скриптам на странице defer ? вот пример на jquery

var arr = $("script");
for (var i=0;i < arr.length;i++) {
    $(arr[i]).attr("defer","defer");
}
READ ALSO
Не срабатывает событие click [дубликат]

Не срабатывает событие click [дубликат]

На данный вопрос уже ответили:

202
Как изменить стиль элементу на javascript?

Как изменить стиль элементу на javascript?

Хочу поменять стиль элементу на странице, который соответствует выбранному (у них одинаковый параметр idEv)Пробую так:

249
Цикл внутри jsx

Цикл внутри jsx

Не могу понять как вывести в цикле те компоненты у которых одноименное состояние trueДопустим у меня есть компонент SettingMain и SettingPassword, у первого...

262