Drupal 7: как добавить атрибут async во внешний JS-скрипт при использовании drupal_add_js? - PullRequest
0 голосов
/ 12 ноября 2018

Я пробовал:

  drupal_add_js('http://somesite.com/pages/scripts/0080/8579.js', [
    'type' => 'external',
    'async' => TRUE
  ]);

и

  drupal_add_js('http://somesite.com/pages/scripts/0080/8579.js', [
    'type' => 'external',
    'async' => 'async'
  ]);

Без результатов.

Кто-нибудь знает, как мне этого добиться?

1 Ответ

0 голосов
/ 13 ноября 2018

Этого нельзя добиться, просто указав параметр, поскольку drupal_add_js() не поддерживает атрибут async.

Рекомендуется использовать defer, что (imho) лучше, поскольку не блокирует разбор HTML .

  • async: скрипт извлекается асинхронно, затем синтаксический анализ HTML приостанавливается для выполнения сценария, затем анализ продолжается.

  • defer:Сценарий извлекается асинхронно и выполняется только после выполнения анализа HTML.

Однако, если вам действительно нужен атрибут async, вы можете реализовать hook_preprocess_html_tag для изменения переменных темы, напримеритак:

function moduleortheme_preprocess_html_tag(&$variables) {
  $el = &$variables['element'];
  if ($el['#tag'] !== 'script' || empty($el['#attributes']['src'])) {
    return;
  }   

  # External scripts to load asynchronously
  $async = [
    'http://somesite.com/pages/scripts/0080/8579.js',
    #...
  ];

  if (in_array($el['#attributes']['src'], $async)) {
    $el['#attributes']['async'] = 'async';
  }
}
...