我有一个问题,如果我重复它,我只能触发我的代码.请参阅以下示例.如果我把两个脚本中的任何一个带出代码几乎相同,那么代码只能用一个代码运行,但是如果我运行这两个脚本就可以解决,但只有一个而不是两个.搏一搏.
这有效(但只有一个脚本触发):
<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)
我刚测试过这个:
考虑来源
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/>.