Thẻ script với nội dung src AND có nghĩa là gì?


122

Ví dụ từ nút +1 của Google:

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

Thẻ script có một Thuộc tính src nội dung. Điều này có nghĩa là gì và nó hoạt động như thế nào?


Firebug Lite sử dụng phương pháp này: getfirebug.com/firebuglite
Brad

Câu trả lời:


71

Các trình duyệt khác nhau xử lý điều này khác nhau. Một số chỉ chạy nội dung nếu nội dung srcđược bao gồm mà không có lỗi. Một số chạy nó sau khi cố gắng bao gồm srctập lệnh, bất kể thành công. Vì hành vi này là không đáng tin cậy (và bị cấm trong HTML5 ), nên cần tránh.

Google không dựa vào bất kỳ hành vi cụ thể nào. Vì nội dung chỉ là một đối tượng theo nghĩa đen (một giá trị), việc thực thi nó sẽ không thực sự làm được gì ngoại trừ việc gây ra lỗi im lặng. Mã của Google xem xét nội dung của scriptchính thẻ và điều chỉnh hành vi của thẻ dựa trên đó.


2
Có cách nào rõ ràng hơn để tập lệnh xem xét nội dung của thẻ tập lệnh của chính nó (cụ thể), hơn là xem qua DOM không?
Karl Knechtel

11
Trên tất cả các trình duyệt mà tôi đã làm việc, nội dung tập lệnh sẽ không bao giờ được thực thi nếu srcthuộc tính có mặt và thực sự không phải là một đối tượng theo nghĩa đen, mã đó sẽ tạo ra SyntaxErrornếu được thực thi, nó chỉ đơn giản là "văn bản JSON" mà tập lệnh sẽ sử dụng của chính nó sau này.
CMS

2
@Karl được sử dụng trong tệp .js bên ngoài, điều này sẽ cung cấp cho bạn nội dung của nút <script> hiện đang thực thi: s=document.getElementsByTagName('script'); text = s[s.length-1].innerHTML; Tôi không nghĩ có bất kỳ cách nào để tìm nạp nội dung của nút tập lệnh mà không liên quan đến việc chạm vào DOM .
digitalbath

@CMS hoạt động trên tất cả các trình duyệt ngoại trừ IE. Bạn có thể nhìn thấy nó ở đây
Jose Faeti

1
@jose - ví dụ của bạn không phải là những gì CMS đề cập đến. Nếu mã được chạy dưới dạng một câu lệnh độc lập, thì đó là lỗi cú pháp. Ví dụ của bạn (và của Google) "hoạt động" chỉ vì nội dung của phần tử tập lệnh được nhập vào do thuộc tính src .
RobG

23

Nếu một phần tử script có thuộc tính src , nội dung đó phải được bỏ qua, bất kỳ hành vi nào khác là không tuân thủ.

Nó đã được đề xuất trong blog (như là một hack) để đưa nội dung trên các yếu tố khi biết rằng nó sẽ không được đánh giá, sau đó sử dụng phương pháp DOM để có được những nội dung như là một chuỗi và một trong hai eval nó hoặc chèn nó trong một yếu tố kịch bản mới. Cả hai đều không phải là một ý kiến ​​hay.


4
Tại sao đây không phải là một ý kiến ​​hay? Điều gì sẽ xảy ra nếu nó được sử dụng để khởi tạo plugin của bên thứ ba?
thekingoftruth

13

Theo đặc tả bản nháp HTML5 , <script>các phần tử có srcthuộc tính chỉ nên có mã nhận xét, nhằm cung cấp tài liệu cho tập lệnh. Mặc dù vậy, có vẻ như Google đang tuân thủ đặc điểm kỹ thuật này.


13

Sau khi tập lệnh được tải, nó sẽ nhìn vào bên trong thẻ tập lệnh của chính nó để truy cập nội dung của nó.

Nó sẽ sử dụng một số mã tương tự như sau:

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

Được sự cho phép của John Resig .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.