Đây là một chút của một trường hợp sử dụng kỳ quặc, nhưng tôi có lý do của tôi:Sử dụng JavaScript để ngăn không cho thẻ `<script>` sau bị đánh giá?
Tôi muốn để có thể viết
<script type="text/javascript" src="first.js"></script>
<script type="text/javascript" src="second.js"></script>
trong đánh dấu của tôi và, bằng cách sử dụng mã trong first.js
, ngăn chặn hoặc trì hoãn việc thực hiện second.js
. Điều này có thể, trong bất kỳ trình duyệt nào không? Điều gì xảy ra nếu nội dung của first.js
được nội tuyến? (. Nếu nó giúp, giả sử rằng thẻ kịch bản thứ hai có một thuộc tính id
)
Kể từ khi tôi đã nhận được một vài câu trả lời mà bỏ lỡ những gì tôi nhận được lúc, tôi nên làm rõ:
- Các giải pháp phải hoàn toàn trong phạm vi
first.js
. Bất kỳ điều gì yêu cầu thay đổi đối với HTML gốc của trang hoặc đếnsecond.js
, đều không được chấp nhận. - Nó là chấp nhận được để tải
second.js
qua Ajax và thực hiện nó bằng cách sử dụngeval
. Đó là phần dễ dàng. Phần khó khăn là ngăn chặn việc thực hiện ngay lập tứcsecond.js
. - Giả sử rằng bạn không biết những gì có trong
second.js
. Vì vậy, bạn không thể chỉ thay thế từng chức năng toàn cầu được gọi làsecond.js
với chức năng no-op. (Ngoài ra, điều này gần như chắc chắn sẽ dẫn đến lỗi.)
Nếu bạn biết một giải pháp hoạt động trong một số trình duyệt nhưng không phải ở các trình duyệt khác, tôi rất muốn nghe nó.
Ví dụ: Để thực hiện cụ thể hơn này một chút, chúng ta hãy nói rằng mã
<script type="text/javascript">
function func() {
window.meaningOfLife = 42;
window.loadSecond();
};
setTimeout(func, 10);
</script>
trước hai script
bao gồm, và rằng second.js
chứa dòng
if (window.meaningOfLife !== 42) {throw new Error();}
first.js
nên có thể ngăn chặn lỗi này bằng cách trì hoãn second.js
thực hiện cho đến khi window.loadSecond
được chạy. (Giả sử việc thực hiện window.loadSecond
cũng có trong first.js
.) Đây là không được phép chạm vào window.meaningOfLife
.
Cập nhật: Câu trả lời của Alohci đáp ứng các yêu cầu này, nhưng chỉ với điều kiện là các thẻ script thứ hai đến ngay sau khi người đầu tiên, không có gì nhưng khoảng trắng ở giữa. Nếu ai đó có thể mở rộng hack của mình để tránh yêu cầu đó, mà không đưa ra những hậu quả không mong muốn khác, điều đó thật tuyệt vời ...
@ Ms2ger, điều đó hoàn toàn không liên quan đến câu hỏi ... Alohci, câu trả lời hay! –
Đây là một hack tẻ nhạt, nhưng nó có vẻ là cảnh quay tốt nhất vì thiếu một cơ chế thực sự để làm điều này. Bất cứ ai làm việc sử dụng điều này nên nhận thức được rằng nó là một hack dễ vỡ và xấu xí mà các trình duyệt có thể chọn để đè bẹp bất cứ lúc nào. Nếu điều này không thực thi của một kịch bản thực sự là nhiệm vụ quan trọng, tôi đề nghị làm việc với các tác giả ban đầu của html và các tệp js khác. – Caleb
Họ nói rằng nó không thể được thực hiện, nhưng bạn đã thực hiện nó! Trong khi tôi đồng ý rằng điều này có lẽ không nên được sử dụng trong sản xuất, nó hoạt động mà không có một hitch trong mọi trình duyệt tôi đã thử nó. Congrats, Alohci, tiền thưởng là của bạn. :) –