为什么我的javascript只在代码重复时触发?

Mic*_* Wa 10 html javascript

我有一个问题,如果我重复它,我只能触发我的代码.请参阅以下示例.如果我把两个脚本中的任何一个带出代码几乎相同,那么代码只能用一个代码运行,但是如果我运行这两个脚本就可以解决,但只有一个而不是两个.搏一搏.

这有效(但只有一个脚本触发):

<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>
Run Code Online (Sandbox Code Playgroud)

这不起作用:

<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>
Run Code Online (Sandbox Code Playgroud)

或这个:

<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>
Run Code Online (Sandbox Code Playgroud)

有没有人有任何想法?这绝对是我一段时间以来见过的最奇怪的事情.

谢谢,

Sal*_*n A 11

问题是您的脚本标记已损坏.一个<script>标签必须关闭</script>.
现在这是发生的事情:

例1

<script>
  document.write('<script src="test.js"/>');
</script>
Run Code Online (Sandbox Code Playgroud)

生成以下标记HTML:

<script>
  document.write('<script src="test.js"/>');
</script>
<script src="test.js">
  </body>
  </html>
Run Code Online (Sandbox Code Playgroud)

通常,浏览器在<script>找到相应的块之前不会执行块</script>.上面的示例中没有明确的结束标记,因此浏览器会忽略标记.

例2

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

产生以下输出:

<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>
Run Code Online (Sandbox Code Playgroud)

请注意,动态编写的脚本标记未关闭.浏览器将此标记与标记中的第二个匹配</script>; 中间的所有内容(不正确)都会成为此标记的一部分.

使用document.write时,请确保<script>正确关闭标记.但请注意,您不能</script>在JavaScript代码中使用as-is,因为它标志着脚本块的结束.您可以使用以下技巧:

<script>
  document.write('<script src="test.js"><\/script>');
</script>
Run Code Online (Sandbox Code Playgroud)

  • 注意:如果有人想知道为什么浏览器不会引发语法错误,答案是:当存在`src`属性时,浏览器将忽略脚本标记的内容. (2认同)

Seb*_*mon 6

我刚测试过这个:

考虑来源

data:application/javascript;base64,Y29uc29sZS5sb2coIlRlc3QiKTs=
Run Code Online (Sandbox Code Playgroud)

这指向以下代码:

console.log("Test");
Run Code Online (Sandbox Code Playgroud)

下面的代码片段生成

<script src="data:application/javascript;base64,Y29uc29sZS5sb2coIlRlc3QiKTs="/>
Run Code Online (Sandbox Code Playgroud)

<div>A</div>
<script>
document.write('<script src="data:application/javascript;base64,Y29uc29sZS5sb2coIlRlc3QiKTs="/>');
</script>
<div>B</div>
Run Code Online (Sandbox Code Playgroud)


但是,下面的代码片段会生成

<script src="data:application/javascript;base64,Y29uc29sZS5sb2coIlRlc3QiKTs="></script>
Run Code Online (Sandbox Code Playgroud)

<div>A</div>
<script>
document.write('<script src="data:application/javascript;base64,Y29uc29sZS5sb2coIlRlc3QiKTs="></'+'script>');
</script>
<div>B</div>
Run Code Online (Sandbox Code Playgroud)


第一个片段记录"Test"在HTML中不显示"B".第二个正常工作.在实时HTML编辑器中甚至没有"Test"记录第一个.其含义是,Salman A的答案指出,所有下面的HTML <script/>(插入的<script>)都会消耗掉.

这是因为<script>标签唯一有效的语法是<script></script>不是 <script/>.