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


122

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

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

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


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, чтобы получить контент в виде строки и либо оценить его, либо вставить в новый элемент скрипта. Ни то, ни другое не является хорошей идеей.


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

13

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


13

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.