Что означает тег сценария с src AND content?

122

Пример кнопки +1 в Google:

<script type="text/javascript" src="https://apis.google.com/js/plusone.js">
      {"parsetags": "explicit"}
</script>

Тег сценария имеет атрибут src и содержимое. Что это значит и как это работает?

USR
источник
Firebug Lite использует этот метод: getfirebug.com/firebuglite
Брэд,

Ответы:

71

Разные браузеры относятся к этому по-разному. Некоторые запускают контент только в том случае, если srcон включен без ошибок. Некоторые запускают его после попытки включить srcскрипт, несмотря на успех. Поскольку такое поведение ненадежно (и запрещено в HTML5 ), его следует избегать.

Google не полагается на какое-то конкретное поведение. Поскольку содержимое представляет собой просто литерал объекта (значение), его выполнение на самом деле не приведет ни к чему, кроме как вызвать тихую ошибку. Код Google просматривает содержимое самого scriptтега и на его основе корректирует свое поведение.

Джереми Бэнкс
источник
2
Есть ли более умный способ для сценария просматривать содержимое своего собственного тега сценария (в частности), чем просмотр DOM?
Karl Knechtel
11
Во всех браузерах, с которыми я работал, содержимое скрипта никогда не будет выполнено, если srcатрибут присутствует, и на самом деле это не литерал объекта, этот код будет создавать, SyntaxErrorесли выполняется, это просто «текст JSON», который скрипт будет использовать само собой позже.
CMS
2
@Karl, используемый во внешнем файле .js, даст вам содержимое текущего исполняемого узла <script>: s=document.getElementsByTagName('script'); text = s[s.length-1].innerHTML; я не думаю, что есть какой-либо способ получить содержимое узла сценария, не затрагивающего DOM ,
digitalbath
@CMS работает во всех браузерах, кроме IE. Вы можете увидеть это здесь
Хосе Фаэти
1
@jose - ваш пример - это не то, на что ссылалась CMS. Если код выполняется как отдельный оператор, это синтаксическая ошибка. Ваш пример (и Google) «работает» только потому, что содержимое элемента script игнорируется из-за атрибута src .
RobG
23

Если элемент сценария имеет атрибут src , содержимое следует игнорировать, любое другое поведение не соответствует требованиям.

В блогах предлагалось (в качестве взлома) помещать контент в элемент, зная, что он не будет оцениваться, затем использовать методы DOM, чтобы получить контент в виде строки и либо оценить его, либо вставить в новый элемент скрипта. Ни то, ни другое не является хорошей идеей.

RobG
источник
4
Почему это плохая идея? Что, если он используется для инициализации стороннего плагина?
thekingoftruth 05
13

Согласно черновику спецификации HTML5 , <script>элементы с srcатрибутами должны иметь только закомментированный код, который предназначен для документации для сценария. Однако не похоже, что Google соответствует этой спецификации.

Джим
источник
13

После загрузки скрипта он заглядывает внутрь своего собственного тега скрипта, чтобы получить доступ к своему содержимому.

Он будет использовать примерно такой код:

var scripts = document.getElementsByTagName("script");
var data = eval(scripts[scripts.length - 1].innerHTML);

Предоставлено Джоном Ресигом .

Джеймс Биллингем
источник