Co oznacza tag skryptu z zawartością src ORAZ?

122

Przykład z przycisku +1 Google:

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

Tag skryptu ma atrybut src i zawartość. Co to oznacza i jak to działa?

usr
źródło
Firebug Lite używa tej metody: getfirebug.com/firebuglite
Brad

Odpowiedzi:

71

Różne przeglądarki traktują to inaczej. Niektórzy uruchamiają zawartość tylko wtedy, gdy srcjest dołączona bez błędów. Niektórzy uruchamiają go po próbie dołączenia srcskryptu, niezależnie od sukcesu. Ponieważ takie zachowanie jest zawodne (i zabronione w HTML5 ), należy go unikać.

Google nie polega na żadnym konkretnym zachowaniu. Ponieważ treść jest po prostu literałem obiektu (wartością), wykonanie jej w rzeczywistości nie spowodowałoby niczego poza spowodowaniem cichego błędu. Kod Google sprawdza zawartość samego scripttagu i na tej podstawie dostosowuje swoje zachowanie.

Jeremy
źródło
2
Czy istnieje sprytniejszy sposób, aby skrypt spojrzał na zawartość swojego własnego tagu skryptu (a konkretnie), niż przechodzenie przez DOM?
Karl Knechtel
11
We wszystkich przeglądarkach, z którymi pracowałem, zawartość skryptu nigdy nie zostanie wykonana, jeśli srcatrybut jest obecny, a tak naprawdę nie jest literałem obiektu, ten kod wygenerowałby, SyntaxErrorjeśli zostanie wykonany, to po prostu „tekst JSON”, którego użyje skrypt sam później.
CMS
2
@Karl używany w zewnętrznym pliku .js, to da ci zawartość aktualnie wykonywanego węzła <script>: s=document.getElementsByTagName('script'); text = s[s.length-1].innerHTML; Nie sądzę, aby istnieje sposób na pobranie zawartości węzła skryptu, który nie wymaga dotykania DOM .
kąpiel cyfrowa
@CMS działa na wszystkich przeglądarkach oprócz IE. Możesz to zobaczyć tutaj
Jose Faeti,
1
@jose - Twój przykład nie jest tym, do czego odnosił się CMS. Jeśli kod jest uruchamiany jako samodzielna instrukcja, jest to błąd składniowy. Twój przykład (i Google) „działa” tylko dlatego, że zawartość elementu script jest ignorowana ze względu na atrybut src .
RobG,
23

Jeśli element skryptu ma atrybut src , treść musi zostać zignorowana, każde inne zachowanie jest niezgodne.

Sugerowano w blogach (jak hack), aby umieścić zawartość w elemencie wiedząc, że nie będą oceniane, a następnie użyć metody DOM, aby uzyskać zawartość jako ciąg i albo eval go lub włóż go w nowym elemencie skryptu. Żaden z nich nie jest dobrym pomysłem.

RobG
źródło
4
Dlaczego to nie jest dobry pomysł? Co się stanie, jeśli zostanie użyty do zainicjowania wtyczki innej firmy?
thekingoftruth
13

Zgodnie z projektem specyfikacji HTML5 , <script>elementy z srcatrybutami powinien zakomentowanych tylko kod, który ma dać dokumentacji skryptu. Wygląda jednak na to, że Google nie spełnia tej specyfikacji.

Jim
źródło
13

Po załadowaniu skrypt zagląda do własnego tagu script, aby uzyskać dostęp do jego zawartości.

Wykorzysta kod podobny do tego:

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

Dzięki uprzejmości Johna Resig .

James Billingham
źródło