2015-07-03 13 views
10

Tôi đang gặp sự cố khi tôi chỉ có thể kích hoạt mã của mình nếu tôi lặp lại. Xem ví dụ bên dưới. Trong khi mã gần như giống hệt nhau nếu tôi lấy một trong hai tập lệnh này, mã không hoạt động chỉ với một tập lệnh, nhưng nếu tôi chạy cả hai tập lệnh đều hoạt động tốt, nhưng chỉ một mã thay vì hai. thôi buông đi.Tại sao javascript của tôi chỉ kích hoạt khi mã được lặp lại?

này hoạt động (nhưng đám cháy chỉ có một kịch bản):

<script type="text/javascript"> 
var url = window.location.href + ""; 
document.write('<script type="application/javascript" src="https://testdomain.com/mik21?add=2140535&mik21=' + url + '"/>'); 
</script> 

<script type="text/javascript"> 
var url = window.location.href + ""; 
document.write('<script type="application/javascript" src="https://testdomain.com/mik?add=2140535&mik=' + url + '"/>'); 
</script> 

này không hoạt động:

<script type="text/javascript"> 
var url = window.location.href + ""; 
document.write('<script type="application/javascript" src="https://testdomain.com/mik21?add=2140535&mik21=' + url + '"/>'); 
</script> 

Hoặc này:

<script type="text/javascript"> 
var url = window.location.href + ""; 
document.write('<script type="application/javascript" src="https://testdomain.com/mik?add=2140535&mik=' + url + '"/>'); 
</script> 

Có ai có bất kỳ ý tưởng? đây chắc chắn là điều kỳ lạ nhất mà tôi từng thấy trong một thời gian.

Cảm ơn,

+2

không sử dụng document.write là gợi ý đầu tiên của tôi, ai biết tại sao vẫn còn hợp lệ trong trình duyệt kể từ khoảng 2005 –

+0

https://stackoverflow.com/questions/802854/ Tại sao-là-tài liệu-viết-coi-a-xấu-thực hành – birdspider

+0

những gì là trước khi dụ đầu tiên của '

3

này hoạt động:

<script type="text/javascript"> 
var url = window.location.href + ""; 
document.write('<script type="application/javascript" src="https://testdomain.com/mik21?add=2140535&mik21=' + url + '"></scr'+'ipt>'); 
document.close(); 
</script> 

Để ngăn chặn js từ đâm, tôi đã chia thẻ <script> thành hai chuỗi.

11

Vấn đề là thẻ tập lệnh của bạn bị hỏng.Thẻ <script> phải được đóng bởi </script>.
Bây giờ đây là những gì sẽ xảy ra:

Ví dụ 1

<script> 
    document.write('<script src="test.js"/>'); 
</script> 

Tạo HTML đánh dấu sau:

<script> 
    document.write('<script src="test.js"/>'); 
</script> 
<script src="test.js"> 
    </body> 
    </html> 

Nhìn chung, trình duyệt không thực hiện một khối <script> cho đến khi họ tìm ra tương ứng </script>. Không có thẻ đóng rõ ràng trong ví dụ trên để trình duyệt bỏ qua thẻ.

Ví dụ 2

<script> 
    document.write('<script src="test.js"/>'); 
</script> 
This HTML will be consumed 
<script> 
    document.write('<script src="test.js"/>'); 
</script> 

Tạo đầu ra sau đây:

<script> 
    document.write('<script src="test.js"/>'); 
</script> 
<script src="test.js"> 
    This HTML will be consumed 
    <script> 
    document.write('<script src="test.js"/>'); 
</script> 

Chú ý rằng các thẻ script tự động bằng văn bản không được đóng lại. Trình duyệt sẽ khớp với thẻ này với số thứ hai </script> trong đánh dấu; mọi thứ ở giữa (không đúng) sẽ trở thành một phần của thẻ này.

Giải pháp

Khi sử dụng document.write, hãy chắc chắn rằng bạn đóng <script> thẻ đúng cách. Nhưng lưu ý rằng bạn không thể sử dụng </script> như bên trong mã JavaScript vì nó báo hiệu kết thúc khối tập lệnh. Bạn có thể sử dụng thủ thuật sau đây:

<script> 
    document.write('<script src="test.js"><\/script>'); 
</script> 
+2

Lưu ý: Nếu ai đó tự hỏi tại sao trình duyệt không tăng lỗi cú pháp, câu trả lời là: trình duyệt sẽ bỏ qua nội dung của thẻ script khi thuộc tính 'src' hiện diện. –

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