Отложить выполнение встроенного javascript?

На моем веб-сайте у меня есть множество встроенных фрагментов javascript. Большинство из них требуют jquery и подобных материалов.

Но я бы хотел отложить загрузку jquery до того, как страница была отображена. И это означает, что мой встроенный javascript будет выполнен, прежде чем jquery будет загружен. Могу ли я что-нибудь сделать? Я ищу простой в реализации решений (я также не могу переместить мой встроенный javascript, поскольку он автоматически создается, пока страница готовится для пользователя).

Ответы

Ответ 1

Было бы намного лучше, если бы вы могли разместить свой javascript в конце документа. Посыпка вашего источника небольшими встроенными фрагментами javascript является убийцей на странице производительности.

Тем не менее, вы можете создать массив и нажать функции в этом массиве. Затем, в конце вашей страницы, сразу после загрузки jquery, проведите цикл над массивом и выполните каждую функцию.

например:.

<html>
  ...
  <script>window.loadEvents = [];</script>
  ...
  <script>loadEvents.push(function() { alert("inline code here"); });</script>
  ...
  <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
  <script>$.each(loadEvents, function(_,f) { f(); });</script>
</html>

Однако, как я уже сказал, было бы лучше просто вставить все элементы script в нижнюю часть страницы, вместо переключения между html и javascript. Если вы это сделаете, производительность рендеринга будет сильно снижена.

Ответ 2

Вы можете моделировать отсрочку, установив type встроенных скриптов в тот, который не будет обрабатываться браузером, например text/example, и клонирование этих сценариев в конце документа, заменяя type на text/javascript.

Код, обрабатывающий все text/examples, действительно прост:

window.addEventListener("load", function() {

    var arr = document.querySelectorAll("script[type='text/example']");
    for (var x = 0; x < arr.length; x++) {
        var cln = arr[x].cloneNode(true);
        cln.type = "text/javascript";
        document.querySelectorAll("body")[0].appendChild(cln);
    }

});

Или, если вы предпочитаете использовать jQuery (вам придется добавить этот script после, включая файл jQuery):

$(function() {
    $("script[type='text/example']").each(function() {
        $(this).clone().attr("type","text/javascript").appendTo("body"); 
    });
});

Этот код ждет, пока страница не загрузится, затем выберите все сценарии с типом text/example и скопирует их в конце body с типом text/javascript, чтобы они выполнялись нормально.

Например:

...
<script type="text/example">
    console.log("I am before the h1");
</script>

<h1>Page Title</h1>

<script type="text/javascript">
    console.log("I am after the h1");
</script>
...

В результате появятся следующие сообщения в консоли:

Я после h1

Я до h1

Вы можете увидеть запущенную демонстрацию на этом JSFiddle: http://jsfiddle.net/rqckwc79/


Плюсы этого решения:

  • Это кросс-браузерное решение.
  • Код действителен HTML/JavaScript.
  • Он работает в строгом режиме.

Недостатки этого решения:

  • Вам нужно иметь контроль над встроенными скриптами, чтобы изменить type.
  • Как сказал troelskn, производительность будет хуже, чем перемещение всего кода на дно (но я понимаю, что есть ситуации, когда это невозможно).
  • Он не работает в старых версиях IE (хотя код может быть изменен для их поддержки).