Apa arti tag-skrip dengan konten src AND?

122

Contoh dari tombol +1 Google:

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

Tag script memiliki src-Atribut dan konten. Apa artinya ini dan bagaimana cara kerjanya?

usr
sumber
Firebug Lite menggunakan metode ini: getfirebug.com/firebuglite
Brad

Jawaban:

71

Browser yang berbeda memperlakukan ini secara berbeda. Beberapa menjalankan konten hanya jika srcdisertakan tanpa kesalahan. Beberapa menjalankannya setelah mencoba memasukkan srcskrip, terlepas dari keberhasilannya. Karena perilaku ini tidak dapat diandalkan (dan dilarang di HTML5 ), ini harus dihindari.

Google tidak mengandalkan perilaku tertentu. Karena konten hanyalah sebuah objek literal (nilai), mengeksekusinya tidak akan benar-benar melakukan apa pun kecuali menyebabkan kesalahan diam. Kode Google melihat konten scripttag itu sendiri, dan menyesuaikan perilakunya berdasarkan itu.

Jeremy Banks
sumber
2
Adakah cara yang lebih cerdas bagi skrip untuk melihat konten tag skripnya sendiri (secara khusus), daripada melalui DOM?
Karl Knechtel
11
Pada semua browser yang saya gunakan, konten skrip tidak akan pernah dijalankan jika srcatributnya ada, dan sebenarnya bukan literal objek, kode itu akan menghasilkan SyntaxErrorjika dijalankan, hanya "teks JSON" yang akan digunakan skrip dengan sendirinya nanti.
CMS
2
@Karl digunakan dalam file .js eksternal, ini akan memberi Anda konten dari simpul <script> yang sedang dieksekusi: s=document.getElementsByTagName('script'); text = s[s.length-1].innerHTML; Saya rasa tidak ada cara untuk mengambil konten dari simpul skrip yang tidak melibatkan menyentuh DOM .
digitalbath
@CMS bekerja di semua browser kecuali IE. Anda dapat melihatnya di sini
Jose Faeti
1
@ Jose - contoh Anda bukanlah yang dirujuk CMS. Jika kode dijalankan sebagai pernyataan yang berdiri sendiri, itu adalah kesalahan sintaks. Contoh Anda (dan Google) "berfungsi" hanya karena konten elemen skrip dicerna karena atribut src .
RobG
23

Jika elemen skrip memiliki atribut src , konten harus diabaikan, perilaku lainnya tidak sesuai.

Ia telah mengemukakan di blog (sebagai hack) untuk menempatkan konten dalam elemen mengetahui bahwa itu tidak akan dievaluasi, kemudian menggunakan metode DOM untuk mendapatkan konten sebagai string dan baik eval atau masukkan dalam elemen script baru. Tak satu pun dari ini adalah ide yang bagus.

RobG
sumber
4
Mengapa ini bukan ide yang bagus? Bagaimana jika digunakan untuk menginisialisasi plugin pihak ketiga?
thekingoftruth
13

Menurut spesifikasi draf HTML5 , <script>elemen dengan srcatribut hanya boleh memiliki kode komentar, yang dimaksudkan untuk memberikan dokumentasi untuk skrip. Tampaknya Google tidak memenuhi spesifikasi ini.

Jim
sumber
13

Setelah skrip dimuat, ia melihat ke dalam tag skripnya sendiri untuk mengakses kontennya.

Ini akan menggunakan beberapa kode yang mirip dengan ini:

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

Atas kebaikan John Resig .

James Billingham
sumber