Giải thích về <script type = văn bản / mẫu văn bản>> </ script>


456

Tôi chỉ vấp phải thứ mà tôi chưa từng thấy trước đây. Trong nguồn của ứng dụng TODO ví dụ của Backbone.js ( Ví dụ về TODO của Backbone ), họ có các mẫu của họ bên trong một <script type = "text/template"></script>, chứa mã trông giống như PHP nhưng có thẻ JavaScript.

Ai đó có thể giải thích điều này với tôi? Thế này có hợp pháp không đấy?


Câu hỏi và câu trả lời tuyệt vời Tôi vừa chạy qua thủ thuật này trong mã Khung ứng dụng YUI mới: new.yuil Library.com/yui/docs/app/app-todo.html
mjhm

4
Những gì type="text/tcl"tôi đã thấy trong tài liệu W3C ? Làm thế nào để sử dụng nó? (Tôi có nên hỏi một câu hỏi khác không?)
L01man

3
@ L01man có, bạn nên hỏi một câu hỏi khác.
Nate Glenn

Liên kết YUI của mjhm bây giờ tại: yuil Library.com/yui/docs/app/app-todo.html
gpvos

Câu trả lời:


413

Các thẻ script này là một cách phổ biến để thực hiện chức năng tạo khuôn mẫu (như trong PHP) nhưng ở phía máy khách.

Bằng cách đặt loại thành "văn bản / mẫu", đó không phải là tập lệnh mà trình duyệt có thể hiểu và do đó trình duyệt sẽ đơn giản bỏ qua nó. Điều này cho phép bạn đặt bất cứ thứ gì vào đó, sau đó có thể được trích xuất sau đó và được sử dụng bởi một thư viện tạo khuôn mẫu để tạo các đoạn mã HTML.

Xương sống không bắt buộc bạn phải sử dụng bất kỳ thư viện tạo khuôn mẫu cụ thể nào - có khá nhiều thư viện: Mustache , Haml , Eco , Google Clos , v.v. (thư viện được sử dụng trong ví dụ bạn liên kết là underscore.js ). Chúng sẽ sử dụng cú pháp riêng của chúng để bạn viết trong các thẻ script đó.


22
@Matt, chính xác đó. Đồng thời, dễ dàng lấy lại toàn bộ văn bản một lần nữa bằng cách sử dụng .innerHTML, do đó giờ đây nó trở thành thông lệ phổ biến giữa các công cụ tạo khuôn.
David Tang

1
Đó không phải là tin tức tuyệt vời! Tôi đã tìm kiếm một giải pháp như thế này .. Cảm ơn phản hồi và theo dõi của bạn!
Matt

7
xin chào, Matt khác nhau ở đây <Script type = "text / template"> sẽ vượt qua kiểm tra xác minh html?
Matt


5
Xin chào từ tương lai. <template>ở đây, nhưng các trang web vẫn đang sử dụng kỹ thuật này, chẳng hạn như reddit.com. : F
Victor Zamanian

114

Nó hợp pháp và rất tiện dụng!

Thử cái này:

<script id="hello" type="text/template">
  Hello world
</script>
<script>
  alert($('#hello').html());
</script>

Một số thư viện tạo khuôn mẫu Javascript sử dụng kỹ thuật này. Handlebars.js là một ví dụ tốt.


5
Làm thế nào bạn sẽ làm cảnh báo này trong javascript thô với jquery?
run rẩy

3
@tremor Bạn có nghĩa là trong javascript thô mà không cần jquery? Một cái gì đó như: var el = document.getEuityById ('xin chào'); var html = el.textContent; cảnh báo (html); (bạn sẽ cần xem xét thêm về xử lý văn bản của thẻ script trong IE)
SgtPooki

@SgtPooki ya tôi có nghĩa là không có, cảm ơn vì câu trả lời. Điều tôi thực sự muốn làm là src tập lệnh đó thành một tập tin bên ngoài và lấy nó, nhưng tôi thấy điều đó không thực sự có thể .. vì vậy bây giờ tôi đang đi sâu vào AJAX và socket.io.
run

@tremor, tôi có thể không hiểu chính xác những gì bạn đang cố gắng thực hiện, nhưng việc lấy các tệp bên ngoài một cách linh hoạt, để chạy hoặc phân tích dưới dạng mẫu, chắc chắn là có thể. Kiểm tra các yêu cầu.
SgtPooki

@tremor Nếu bạn muốn kéo các tệp bên ngoài một cách linh hoạt, tôi muốn sử dụng XHR hơn các thẻ script. XHR cũng hoạt động với các phản hồi HTML đơn giản ... hoặc bất cứ điều gì khác cho vấn đề đó.
Jeroen Landheer

26

Bằng cách đặt thẻ script typekhác text/javascript, trình duyệt sẽ không thực thi mã nội bộ của thẻ script. Đây được gọi là mẫu vi mô. Khái niệm này được sử dụng rộng rãi trong ứng dụng Trang đơn (hay còn gọi là SPA).

<script type="text/template">I am a Micro template. 
  I am going to make your web page faster.</script>

Đối với mẫu micro, loại thẻ script là text/template. Nó được giải thích rất tốt bởi người sáng tạo Jquery John Resig http://ejohn.org/blog/javascript-micro-templating/


Tài nguyên tuyệt vời bạn bao gồm. Liên kết đó đã dạy tôi rất nhiều.
rocktheartsm4l

13

Để thêm vào câu trả lời của Box9:

Backbone.js phụ thuộc vào underscore.js, chính nó thực hiện các mẫu microtem gốc của John Resig.

Nếu bạn quyết định sử dụng Backbone.js với Rails, hãy chắc chắn kiểm tra đá quý Jammit. Nó cung cấp một cách rất sạch để quản lý bao bì tài sản cho các mẫu. http://documentcloud.github.com/jammit/#jst

Theo mặc định, Jammit cũng sử dụng các microtemsheet của JResig, nhưng nó cũng cho phép bạn thay thế công cụ tạo khuôn.


Để thêm, DocumentCloud, công ty cung cấp Jammit, là cùng một công ty đã phát triển Backbone và Underscore.
Ceasar Bautista

12

Đó là một cách để thêm văn bản vào HTML mà không được hiển thị hoặc chuẩn hóa.

Không khác gì thêm nó như:

 <textarea style="display:none"><span>{{name}}</span></textarea>

32
Điều khác biệt là, một textarea vẫn sẽ chèn các phần tử đó vào DOM và tìm nạp bất kỳ tài sản bên ngoài nào (như hình ảnh) được yêu cầu. Một thẻ script sẽ không.
LocalPCGuy

13
@LocalPCGuy điều đó không đúng, kể cả <img src="image.jpg">bên trong textarea sẽ không khiến trình duyệt tìm nạp image.jpg, trình duyệt biết rằng nội dung bên trong textarea không có nghĩa là được hiển thị.
vikki

5
@vikki woops, bạn đã đúng, textarea có thể là một trong số ít các yếu tố sẽ là sự thay thế khả thi cho việc tạo mẫu thẻ script.
LocalPCGuy

4
@LocalPCGuy yeah Tôi nghĩ hai cái đó có thể được sử dụng thay thế cho nhau. Nếu mẫu của bạn có dòng </script>bạn không thể sử dụng nó trong thẻ script, vì vậy bạn có thể sử dụng textarea sau đó và ngược lại.
vikki

2
Yup ... Trước khi thẻ mẫu và trước tập lệnh type = text / template, tất cả chúng ta đã làm điều đó với textarea, tôi tin. Đó là điều tương tự với iframe khi chúng tôi không có ajax.
dkellner

11

<script type = “text/template”> … </script>Là lỗi thời. Sử dụng <template>thẻ thay thế.


9
<template>thẻ vẫn không được Internet Explorer hỗ trợ kể từ IE 11.
ovinophile

87
Trong 5 năm sử dụng thẻ <template>.
siêu sáng

13
<script type = văn bản / mẫu văn bản >> có thể chứa bất cứ thứ gì, chúng không được phân tích cú pháp. Mặt khác, các thẻ <template> được phân tích cú pháp vào DOM, do đó cần phải có HTML hợp lệ. Thông thường, điều này có nghĩa là phần đầu tiên sẽ được giữ nguyên mẫu, trong khi phần thứ hai sẽ loại bỏ các phần không tuân thủ html và phá vỡ mẫu. ... Tất nhiên, đó chỉ là vấn đề nếu bạn sử dụng các công cụ mẫu như ria mép hoặc tương tự.
dagnelies

10
KHÔNG sử dụng thẻ <template> và không đưa ra quyết định của bạn dựa trên thứ khác là "lỗi thời". Đây không phải là Tuần lễ thời trang Milan, nếu một cái gì đó hoạt động và phù hợp về mặt kỹ thuật, nó có thể được sử dụng :) Bây giờ, thực tế: thẻ <template> vẫn không được hỗ trợ trong IE và Opera Mini (theo CanIUse) và thẻ <script> sẽ giữ chính xác những gì bạn cung cấp cho nó, trái ngược với div ẩn hoặc bất kỳ thẻ nào khác có thể làm mất khoảng trắng hoặc nhận xét của bạn.
dkellner

3
2 năm kể từ khi câu trả lời được đăng, bản thân IE11 là một công nghệ lạc hậu và Microsoft đã chuyển sang Edge thay thế, hỗ trợ <template>. Hầu hết các trình duyệt máy tính để bàn lớn đều hỗ trợ <template>thẻ này . Tôi thực sự khuyên bạn nên sử dụng nó như bây giờ. developer.mozilla.org/en/docs/Web/HTML/Euity/ từ
Yeo

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.