Document.write(<script>)抛出意外的标记“ILLEGAL”</script>

时间:2013-12-23 05:26:04

标签: javascript html-entities html-escape-characters

在你提问之前,我已经在Stack Overflow中搜索了很多内容并且我谷歌了几千次。我见过的任何其他案例都帮助了我。

让我们回答我的问题:

我正在尝试在我的代码中使用以下脚本:

<script type='text/javaScript'>
    document.write("<script src='/feeds/posts/default/-/"+hom_cat1+"?max-results=1&orderby=published&alt=json-in-script&callback=showhomeposts1'></script>");
</script>

但是我正在使用Blogger并且它没有正确检测到我的代码(请注意红色脚本结束标记):

note the red script closing tag

有了这个,我无法保存模板。所以我正在尝试使用此website将我的代码转换为HTML实体。当我编码时,将其放入我的模板并保存,我得到:

Uncaught SyntaxError: Unexpected token ILLEGAL 

这是我正在尝试使用的编码字符串:

&lt;script type='text/javaScript'&gt;document.write(&quot;&lt;script src='/feeds/posts/default/-/&quot;+hom_cat1+&quot;?max-results=1&amp;orderby=published&amp;alt=json-in-script&amp;callback=showhomeposts1'&gt;&lt;/script&gt;&quot;);&lt;/script&gt;

我该怎么做才能解决我的问题?

4 个答案:

答案 0 :(得分:22)

问题是传递给document.write的字符串包含字符</script>,最终会过早地终止调用document.write的脚本元素。

字符</script>不能出现在脚本中的任何位置,因为HTML解析器无法将其与实际的</script>标记区分开来。

你可以尝试这样的事情:

document.write("<script src='...'></scr" + "ipt>");

或者,如评论中所述:

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

另一种选择是使用DOM API创建script元素并将其插入到文档中。这里的其他答案给出了一些建议,但是实现存在潜在的问题(例如,如果您尝试从document.body.appendChild内调用它,head将抛出TypeError)。这样的事情会更强大:

(function() {
    var s = document.getElementsByTagName('script')[0];
    var script = document.createElement('script');
    script.src = 'http://something.com';
    s.parentNode.insertBefore(script, s);
}());

此外,type='text/javaScript'不正确;使用text/javascript或省略type属性。

答案 1 :(得分:4)

你正在写

<script type='text/javaScript'>
    document.write("<script src='/feeds/posts/default/-/"+hom_cat1+"?max-results=1&orderby=published&alt=json-in-script&callback=showhomeposts1'></script>");
</script>

因此输出将是脚本标记内的脚本标记,这就是输出

的原因
&lt;script type='text/javaScript'&gt;document.write(&quot;&lt;script src='/feeds/posts/default/-/&quot;+hom_cat1+&quot;?max-results=1&amp;orderby=published&amp;alt=json-in-script&amp;callback=showhomeposts1'&gt;&lt;/script&gt;&quot;);&lt;/script&gt;

而是只使用document.write(“”);

var script = document.createElement( 'script' );
script.type = 'text/javascript';
script.src = url;
$("#someElement").append( script );

答案 2 :(得分:2)

加载js异步的更好方法就是这样

function loadScript () {

    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = 'feeds/posts/default/your.js' 
    document.body.appendChild(script);

}

window.onload = loadScript;

或者如果您不想要任何功能,可以使用直接调用

var script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'feeds/posts/default/your.js' 
document.body.appendChild(script);

正如google所建议的那样https://developers.google.com/maps/documentation/javascript/tutorial?hl=en#asynch

答案 3 :(得分:0)

如果你在Django上,并遇到类似的问题:试试这个:

<script src="{% static 'my/path/to/script.js' %}" ></script>