Как в Drupal 7, всем выводимым в шапке скриптам js указать тип скрипта?

Главные вкладки

Аватар пользователя Blest Blest 18 декабря 2016 в 18:37

Здравствуйте! Подскажите пожалуйста, как можно решить проблему. Ситуация такова, я работаю в среде Drupal7, а там все js скрипты выводятся переменной


<?php print $scripts?>

а скрипты подключаются через файл name_themes.info с инструкцией scripts[] = 'myjs.js'.
Так вот, все бы хорошо, но они выводятся без указания типа скрипта type="text/javascript"

Вывод выглядит вот так
<script src="myjs.js"></script>
А надо, чтобы выглядело так
<script type="text/javascript" src="myjs.js"></script>
или
<script type="text/javascript" async src="myjs.js"></script>

Если все скрипты прописать в ручную, в файле html.tpl.php между тэгами , то наверно это будет не кашерно по отношению к API Drupal.

Есть ли решение данной проблемы?

Можно конечно сделать так, прописав в файле template.php

<?php
function имяТемы_preprocess_page(&$vars) {
  if (
$vars['type'] == 'my-node-type') {
    
drupal_add_js(drupal_get_path('theme''имяТемы') . '/myjs.js');
  }
}
?>

Тогда опять же, где прописать async и придется создавать один файл myjs.js и в него импортировать остальные скрипты, а я не знаю как выполняется импорт скриптов, ну и все это придется делать, потому что в template.php не может существовать 2 или более одинаковых функций.
Спасибо!

Лучший ответ

Аватар пользователя Blest Blest 19 декабря 2016 в 19:39

В общем поступил вот так.
Написал не замысловатый скриптик myj.js, его подключил через файл инфо с названием темы.

$import("/js/myjs1.js");
$import("/js/myjs2.js");
$import("/js/myjs3.js");
function $import(path){
    var  scripts = document.write("<" + "script async src=\"" + path + "\"></" + "script>");
}

А через него уже импортом прогнал нужные мне скрипты с нужным мне атрибутом. Работает прекрасно.
Правда не знаю, кашерно ли это. Отпишитесь по возможности, ваше мнение всегда ценю.
Отдельное спасибо за идеи bumble.

Комментарии

Аватар пользователя bumble bumble 18 декабря 2016 в 19:33

У Вас, скорее всего, тема написана с поддержкой HTML5.
Это нормальная практика - не указывать js-скриптам тип.

Так же можно передавать тег в качестве рендер массива:

<?php
function THEME_preprocess_html(&$vars) {
  
$myjs = array(
    
'#type' => 'html_tag',
    
'#tag' => 'script',
    
'#attributes' => array(
      
'src' =>  drupal_get_path('theme''THEME') . '/js/myjs.js',
      
'async' => 'async',
    )
  );

  

drupal_add_html_head($myjs'myjs');
}
?>
Аватар пользователя Blest Blest 18 декабря 2016 в 20:30

Да, вы совершенно правы, тема на базе Bootstrap3 в основном вся на HTML5.
Ваш вариант мне очень понравился. Но тогда осталькые, нужные мне скрипты, придется импортом загонять в myjs.js, не буду же я, для каждого скрипта, писать отдельную повторную функцию, да и если к примеру их 3 или 4, такое не допустимо. Я выше писал, почему.
А импортировать, я просто не знаю как.
К примеру, такой вариант, будет работать для импорта, если я в файле myjs.js пропишу?

$import("/js/myjs1.js");
$import("/js/myjs2.js");
$import("/js/myjs3.js");
Аватар пользователя Blest Blest 18 декабря 2016 в 22:18

bumble wrote:

Так же можно передавать тег в качестве рендер массива:

Попробовал. Он выводит внутри тэга , все тэги из шапки , то есть, все линки, стили, абсолютно всё.

Аватар пользователя gun_dose gun_dose 19 декабря 2016 в 9:37

Вообще-то все нормальные темы по умолчанию выводят скрипты в виде:
<script type="text/javascript" src="myjs.js"></script>
Если у вас по-другому, значит что-то перебито в вашей теме. Смотрите файл template.php в папке темы.
И новые скрипты подключайте в инфо-файле темы.

Аватар пользователя Blest Blest 19 декабря 2016 в 12:47

gun_dose wrote:

И новые скрипты подключайте в инфо-файле темы.

Я так и подключаю. Но даже, допустим, дайте опустим вопрос с выводом атрибута с указанием типа скрипта, а перейдем к вопросу вывода атрибута async. Тогда как? Ну вот понадобилось мне, отложить загрузку пары скриптов, до того пока не загрузится контент. Тогда, как мне для таких скриптов прописать атрибут async?

В теме ничего не перебито. Она построена на базе субтемы от bootstrap3 и как написали выше, она работает на HTML5, все правильно в таком случае типы скрипта не указываются, нет необходимости. Это моя вина, я забыл. Но мне бы хоть дали совет, как вывести нужные скрипты с атрибутом async

Аватар пользователя Blest Blest 19 декабря 2016 в 18:11

Что то, как то не вариант, как я почитал. Там все как то завязано на системных и модульных скриптах.

Аватар пользователя Blest Blest 19 декабря 2016 в 19:39

В общем поступил вот так.
Написал не замысловатый скриптик myj.js, его подключил через файл инфо с названием темы.

$import("/js/myjs1.js");
$import("/js/myjs2.js");
$import("/js/myjs3.js");
function $import(path){
    var  scripts = document.write("<" + "script async src=\"" + path + "\"></" + "script>");
}

А через него уже импортом прогнал нужные мне скрипты с нужным мне атрибутом. Работает прекрасно.
Правда не знаю, кашерно ли это. Отпишитесь по возможности, ваше мнение всегда ценю.
Отдельное спасибо за идеи bumble.

Аватар пользователя Blest Blest 28 декабря 2016 в 17:23

Это упрощает написание, но влияет на валидацию. Я бы вообще не заморачивался, если бы не хотел дружить с Гуглом. А с ним дружить очень нужно.