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

时间:2015-07-03 09:20:56

标签: javascript html

我遇到了一个问题,如果我再重复一遍,我只能触发我的代码。请参阅以下示例。如果我将两个脚本中的任何一个用于代码几乎完全相同,那么代码只能用一个代码运行,但是如果我运行两个脚本就可以解决,但只有一个而不是两个。试一试。

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

<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>

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

谢谢,

3 个答案:

答案 0 :(得分:11)

问题是您的脚本标记已损坏。 <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>匹配;中间的一切(不正确)成为此标记的一部分。

<强>解决方案

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

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

答案 1 :(得分:6)

我刚试过这个:

考虑来源

data:application/javascript;base64,Y29uc29sZS5sb2coIlRlc3QiKTs=

这指向以下代码:

console.log("Test");

下面的代码段生成

<script src="data:application/javascript;base64,Y29uc29sZS5sb2coIlRlc3QiKTs="/>

&#13;
&#13;
<div>A</div>
<script>
document.write('<script src="data:application/javascript;base64,Y29uc29sZS5sb2coIlRlc3QiKTs="/>');
</script>
<div>B</div>
&#13;
&#13;
&#13;

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

<script src="data:application/javascript;base64,Y29uc29sZS5sb2coIlRlc3QiKTs="></script>

&#13;
&#13;
<div>A</div>
<script>
document.write('<script src="data:application/javascript;base64,Y29uc29sZS5sb2coIlRlc3QiKTs="></'+'script>');
</script>
<div>B</div>
&#13;
&#13;
&#13;

第一个代码段记录"Test",但在HTML 中不显示“B”。第二个正常工作。在Real-time HTML Editor中,第一个记录不记录"Test"。这意味着<script/>下面的所有HTML(插入为<script>)都会被Salman A’s answer指出。

这是因为<script>代码唯一有效的语法是<script></script> <script/>

答案 2 :(得分: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>标记拆分为两个字符串。