Почему мой 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> на две строки.