繁体   English   中英

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

[英]Why does my javascript only fire when the code is repeated?

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

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

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

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

谢谢,

问题是您的脚本标记已损坏。 必须通过</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>

我刚测试过这个:

考虑来源

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> 


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

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

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


第一个片段记录"Test"在HTML中不显示“B” 第二个正常工作。 实时HTML编辑器中,甚至没有"Test"记录第一个。 这意味着,当Salman A的 答案指出时, <script/> (作为<script>插入)下面的所有HTML都会消耗掉。

这是因为<script>标记的唯一有效语法是<script></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 + '"></scr'+'ipt>');
document.close();
</script>

为了防止js崩溃,我将<script>标记拆分为两个字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM