Почему мой javascript срабатывает только при повторении кода?
У меня проблема, когда я могу получить код только в том случае, если я его повторю. См. Приведенный ниже пример. Хотя код почти идентичен, если я беру любой из двух сценариев, код не работает только с одним, но если я запускаю оба script, то срабатывает штраф, а только один вместо двух. дайте ему идти.
Это работает (но срабатывает только один script):
<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>
Это не работает:
<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>
Есть ли у кого-нибудь идеи? это определенно самая странная вещь, которую я видел в то время.
Спасибо,
Ответы
Ответ 1
Я только что протестировал это:
Рассмотрим источник
data:application/javascript;base64,Y29uc29sZS5sb2coIlRlc3QiKTs=
Это указывает на следующий код:
console.log("Test");
Этот фрагмент ниже генерирует
<script src="data:application/javascript;base64,Y29uc29sZS5sb2coIlRlc3QiKTs="/>
<div>A</div>
<script>
document.write('<script src="data:application/javascript;base64,Y29uc29sZS5sb2coIlRlc3QiKTs="/>');
</script>
<div>B</div>
Ответ 2
Проблема в том, что тэг script сломан. Тег <script>
должен быть закрыт </script>
.
Теперь вот что происходит:
Пример 1
<script>
document.write('<script src="test.js"/>');
</script>
Производит следующую разметку HTML:
<script>
document.write('<script src="test.js"/>');
</script>
<script src="test.js">
</body>
</html>
В общем случае браузеры не выполняют блок <script>
, пока не найдут соответствующий </script>
. В приведенном выше примере явного закрывающего тега нет, поэтому браузер игнорирует тег.
Пример 2
<script>
document.write('<script src="test.js"/>');
</script>
This HTML will be consumed
<script>
document.write('<script src="test.js"/>');
</script>
Производит следующий вывод:
<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>
Обратите внимание, что динамически записанный тег script не закрыт. Браузер будет соответствовать этому тегу со вторым </script>
в разметке; все промежуточные (неправильно) становятся частью этого тега.
Решение
При использовании document.write убедитесь, что вы закрыли теги <script>
. Но обратите внимание, что вы не можете использовать </script>
как-внутри кода JavaScript, так как он сигнализирует о завершении блока script. Вы можете использовать следующий трюк:
<script>
document.write('<script src="test.js"><\/script>');
</script>
Ответ 3
Это работает:
<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>
Чтобы предотвратить сбой js, я разделил тэг <script>
на две строки.