2016-04-13 14 views
12

Tôi đang sử dụng các mẫu văn bản ES6 để xây dựng một số HTML theo chuỗi và cho đến nay nó đã hoạt động tốt. Tuy nhiên, ngay sau khi tôi cố gắng để đưa các văn bản đen </script> trong chuỗi của tôi trình duyệt ném lên và ném các lỗi cú pháp:Lỗi cú pháp "Không có mẫu chuẩn" khi chữ chứa thẻ tập lệnh

SyntaxError: Unterminated template literal 

Đây là một mẫu JavaScript đơn giản mà ném lỗi:

var str=` 
<script> 
</script> 
` 
var pre = document.createElement('pre') 
pre.textContent = str 
document.body.appendChild(pre) 

Xem mã ở trên trong JS Fiddle. Có vẻ như những gì đang xảy ra là nó từ bỏ tìm kiếm trích dẫn cuối cùng và thay vào đó bắt đầu xử lý mọi thứ tại điểm dưới dạng HTML theo nghĩa đen, do đó, tất cả các mã JavaScript sau thời điểm đó được xử lý không chính xác dưới dạng HTML, không phải vậy!

Nếu tôi thay script bởi bất kỳ khác tag HTML pháp lý (và thậm chí thẻ không hợp lệ như scripty) sau đó nó hoạt động tốt, vì vậy tôi không thể nhìn thấy thế nào điều này có thể có thể là một lỗi cú pháp hoặc một trường hợp kỳ lạ nơi tôi nghĩ rằng tôi đã gõ một ký tự (ví dụ như backtick) nhưng thay vào đó đã gõ một cái khác trông giống như nó.

Tôi thực sự đang tạo chuỗi (theo hiểu của tôi, tại thời gian biên dịch), trình duyệt nên không phải đang cố coi nó là HTML hoặc theo bất kỳ cách nào phân tích cú pháp. Vì vậy, những gì cho?

+2

Một số trình duyệt ngừng phiên dịch Javascript trên ''. Hãy loại bỏ hoặc thay thế bằng '<\/SCRIPT>'. –

+0

(Lưu ý rằng điều này bị lừa đảo trên SO.) –

+1

@Gothdo \t Không biết cái nào là "tốt nhất", ví dụ: http://stackoverflow.com/questions/30231151/syntaxerror-unterminated-string-literal- script-script-tag-not-working-wi, http://stackoverflow.com/q/26691529/438992, http://stackoverflow.com/q/31153809/438992, http://stackoverflow.com/q/ 17344196/438992, http://stackoverflow.com/q/2170609/438992, http://stackoverflow.com/q/11945771/438992, http://stackoverflow.com/q/10154514/438992, v.v. –

Trả lời

14

Nếu bạn chèn </script> bên trong thẻ tập lệnh, cho dù đó là một chuỗi trong dấu ngoặc kép, dấu nháy đơn hay thậm chí là mẫu, nó sẽ luôn đóng đóng thẻ tập lệnh. Bạn phải thoát khỏi nó, ví dụ như thế:

var str=` 
<script> 
<\/script> 
` 
var pre = document.createElement('pre') 
pre.textContent = str 
document.body.appendChild(pre) 

Tuy nhiên, nếu bạn sử dụng tập lệnh bên ngoài <script src="url"></script>, nó sẽ hoạt động tốt mà không cần thoát.

+1

Ah .... vì một lý do nào đó (chẳng hạn như tôi có thể tự do đặt các loại trích dẫn khác trong các trích dẫn mẫu) Tôi đã nghĩ rằng bất cứ điều gì bên trong các trích dẫn mẫu được phân lập từ phần còn lại của tài liệu. Điều đó thực sự sửa chữa nó! – Michael

Các vấn đề liên quan