Що означає скрипт-тег із src AND контентом?


122

Приклад кнопки Googles +1:

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

Тег сценарію має src-Attribute та зміст. Що це означає і як це працює?


Firebug Lite використовує цей метод: getfirebug.com/firebuglite
Бред

Відповіді:


71

Різні браузери трактують це по-різному. Деякі запускають вміст, лише якщо srcвключено без помилки. Деякі запускають його після спроби включити srcсценарій, незалежно від успіху. Оскільки така поведінка ненадійна (і заборонена в HTML5 ), її слід уникати.

Google не покладається на якусь конкретну поведінку. Оскільки вміст є лише об'єктом буквальним (значення), його виконання насправді нічого не зробить, окрім як спричинити мовчазну помилку. Код Google розглядає вміст самого scriptтегу та коригує його поведінку на основі цього.


2
Чи є розумніший спосіб скрипт переглянути вміст власного тегу сценарію (конкретно), ніж пройти DOM?
Карл Кнечтел

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) "працює" лише тому, що вміст елемента скрипту проігнорується через атрибут src .
RobG

23

Якщо елемент сценарію має атрибут src , вміст повинен ігноруватись, будь-яка інша поведінка не відповідає.

Було запропоновано в блогах (як хак) , щоб помістити вміст в елементі , знаючи , що він не буде оцінюватися, а потім використовувати методи DOM , щоб отримати вміст у вигляді рядка і або Eval його або вставити його в новому елементі сценарію. Жодне з них не є хорошою ідеєю.


4
Чому це не гарна ідея? Що робити, якщо він використовується для ініціалізації додатка сторонніх розробників?
thekingoftruth

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.