Здравствуйте! Подскажите пожалуйста, как можно решить проблему. Ситуация такова, я работаю в среде 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 или более одинаковых функций.
Спасибо!
Комментарии
У Вас, скорее всего, тема написана с поддержкой HTML5.
Это нормальная практика - не указывать js-скриптам тип.
Так же можно передавать тег в качестве рендер массива:
<?php
drupal_add_html_head($myjs, 'myjs');
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',
)
);
}
?>
Да, вы совершенно правы, тема на базе Bootstrap3 в основном вся на HTML5.
Ваш вариант мне очень понравился. Но тогда осталькые, нужные мне скрипты, придется импортом загонять в myjs.js, не буду же я, для каждого скрипта, писать отдельную повторную функцию, да и если к примеру их 3 или 4, такое не допустимо. Я выше писал, почему.
А импортировать, я просто не знаю как.
К примеру, такой вариант, будет работать для импорта, если я в файле myjs.js пропишу?
$import("/js/myjs2.js");
$import("/js/myjs3.js");
Попробовал. Он выводит внутри тэга , все тэги из шапки , то есть, все линки, стили, абсолютно всё.
Больше нет вариантов?
Вообще-то все нормальные темы по умолчанию выводят скрипты в виде:
<script type="text/javascript" src="myjs.js"></script>
Если у вас по-другому, значит что-то перебито в вашей теме. Смотрите файл template.php в папке темы.
И новые скрипты подключайте в инфо-файле темы.
Я так и подключаю. Но даже, допустим, дайте опустим вопрос с выводом атрибута с указанием типа скрипта, а перейдем к вопросу вывода атрибута async. Тогда как? Ну вот понадобилось мне, отложить загрузку пары скриптов, до того пока не загрузится контент. Тогда, как мне для таких скриптов прописать атрибут async?
В теме ничего не перебито. Она построена на базе субтемы от bootstrap3 и как написали выше, она работает на HTML5, все правильно в таком случае типы скрипта не указываются, нет необходимости. Это моя вина, я забыл. Но мне бы хоть дали совет, как вывести нужные скрипты с атрибутом async
Нужно смотреть в сторону альтера скриптов (hook_js_alter).
Что то, как то не вариант, как я почитал. Там все как то завязано на системных и модульных скриптах.
В общем поступил вот так.
Написал не замысловатый скриптик myj.js, его подключил через файл инфо с названием темы.
$import("/js/myjs2.js");
$import("/js/myjs3.js");
function $import(path){
var scripts = document.write("<" + "script async src=\"" + path + "\"></" + "script>");
}
А через него уже импортом прогнал нужные мне скрипты с нужным мне атрибутом. Работает прекрасно.
Правда не знаю, кашерно ли это. Отпишитесь по возможности, ваше мнение всегда ценю.
Отдельное спасибо за идеи bumble.
а что будет, если не указывать тип скрипта?
ошибка валидации
значит с приходом HTML5 возможность использовать теги без указания типа является не рекомендованной?
Это упрощает написание, но влияет на валидацию. Я бы вообще не заморачивался, если бы не хотел дружить с Гуглом. А с ним дружить очень нужно.