错误:未捕获的语法错误:意外的令牌 <

49

由于某些原因,我得到了这个错误信息:

Uncaught SyntaxError: Unexpected token <

对于这行代码:

title: '<img src="/images/text/text_mario_planet_jukebox.png" id="text_mario_planet_jukebox"/>',
在这个上下文中:
$(document).ready(function() {
    $('#infobutton').click(function() {
        $('#music_descrip').dialog('open');
    });
        $('#music_descrip').dialog({
            title: '<img src="/images/text/text_mario_planet_jukebox.png" id="text_mario_planet_jukebox"/>',
            autoOpen: false,
            height: 375,
            width: 500,
            modal: true,
            resizable: false,
            buttons: {
                'Without Music': function() {
                    $(this).dialog('close');
                    $.cookie('autoPlay', 'no', { expires: 365 * 10 });
                },
                'With Music': function() {
                    $(this).dialog('close');
                    $.cookie('autoPlay', 'yes', { expires: 365 * 10 });
                }
            }
        });
    });

我认为一切都应该没问题,但我不明白为什么<会导致这种情况...

哎呀,忘记说这是发生在哪里了!我的错,

http://www.marioplanet.com/index.asp

有什么想法吗?


3
我也听不懂。也许你想分享一些代码并解释你尝试做什么等等?展示错误是一回事,但如果你想理解错误的原因,我们需要看看是什么导致了它(毫无疑问是你的代码)。此外,在你的问题中标记error标签并没有带来太多有价值的信息。 - Darin Dimitrov
2
这并不是一行真正的代码。我的意思是,你无法执行它。至少给我们足够的上下文来看到完整的语句。 - recursive
抱歉,我的错。我试图给它更多的上下文,但忘记了提供一个链接,这本来是我的意图... - Qcom
1
对我来说,这个错误是由于错误的文件请求路径引起的,并且返回的404页面正在尝试被解析,导致了错误。希望这可以帮助某人 :D - DrCord
11个回答

44

这是一个浏览器问题,而不是 JavaScript 或 JQuery 的问题;它试图将尖括号解释为 HTML 标签。

在设置您的 JavaScript 时,请尝试进行以下操作:

<script>
//<![CDATA[

    // insert teh codez

//]]>
</script>

另外一种方法是将你的javascript代码移至一个单独的文件中。

编辑:啊..通过那个链接,我找到了原因。我之前说的问题根本不是问题,this才是问题,从网站中剥离出来的。

<script type="text/javascript"
    $(document).ready(function() {
    $('#infobutton').click(function() {
        $('#music_descrip').dialog('open');
    });
        $('#music_descrip').dialog({
            title: '<img src="/images/text/text_mario_planet_jukebox.png" id="text_mario_planet_jukebox"/>',
            autoOpen: false,
            height: 375,
            width: 500,
            modal: true,
            resizable: false,
            buttons: {
                'Without Music': function() {
                    $(this).dialog('close');
                    $.cookie('autoPlay', 'no', { expires: 365 * 10 });
                },
                'With Music': function() {
                    $(this).dialog('close');
                    $.cookie('autoPlay', 'yes', { expires: 365 * 10 });
                }
            }
        });
    });

你能发现错误吗?它出现在第一行: <script标签没有关闭。应该是<script type="text/javascript">

然而,我的先前建议仍然适用:你应该将标签内的脚本置于CDATA块中,或将它们移动到单独的文件中。

虽然这不是此处的问题,但这样做能更快地显示真正的问题。


哇塞……谢谢你的提醒,但那样做太糟糕了。不管怎样,我已经将JS移动到一个单独的文件中,以便更清晰地编写代码和维护。谢谢! - Qcom
你能在jQuery中捕获这样的异常吗?也就是说,如果我的成功方法遇到了未捕获的异常,我想要捕获它并向用户显示一些错误信息。 - codingbbq
如果你的标记语言结构不正确,JavaScript 解析引擎将会非常失败,或者根本无法启动。标记语言错误的处理方式因浏览器而异,我不确定是否有任何提供机制以便你可以挂钩来给用户一个通用的“我在浏览你尝试查看的网站时出了问题”的错误信息。@noobcode - Randolpho
1
除了这个非常好的答案之外,我建议您还要检查是否调用了不存在的JS文件。 - SequenceDigitale.com

16
在使用 HTML5 push state 时,我在开发 Backbone 应用程序时遇到了这个错误,与将未知文件重定向到 index.html 的 .htaccess 结合使用时产生了此错误。
原来当访问诸如 `/something/5` 这样的URL时,我的 `/index.html` 实际上被服务于 `/something/index.html`(感谢我的 .htaccess)。这导致了所有相对于我的 JavaScript 文件的 URL 都出了问题(从 index.html 内部),这意味着它们应该已经 404 了。
然而,由于我的 htaccess,试图检索 JS 文件时并没有出现 404 错误,反而返回了我的 index.html。因此,浏览器为每个尝试获取的 JavaScript 文件都提供了 index.html,当它评估 HTML 时,就像它是 JavaScript 一样,它会由于 index.html 中的标签中引导的 <(来自我的

2
这解决了我的问题 - 在我的情况下,我使用了<base href="/"> - 从未想过这是htaccess的问题! - Jason Butler
1
当我在使用类似"user/:userid"这样的路径时,我遇到了类似的问题。将基础标签添加到资源URL前面解决了这个问题。谢谢@jeff-h! - Tim
这是正确的,但是更一般性的问题是由david.barkhuizen的回答所描述的结果。 - Bernardo Dal Corno
我们通过在index.html文件头部设置<base href="/">来修复了重定向URL中的Uncaught SyntaxError: Unexpected token '<' in html问题。同时,由于HTML规范对模块脚本实施了严格的MIME类型检查,因此无法加载模块脚本:预期的JavaScript模块脚本,但服务器响应的是"text/html" MIME类型。这个问题也已经得到解决。 - pa1 Raju

10
通常出现这种情况是因为你试图加载一个非html资源(例如作为 text/javascript 类型的jquery库脚本文件),而服务器没有返回预期的JS资源,而是返回了HTML - 通常是404页面。
浏览器试图将该资源解析为JS,但由于实际返回的是HTML页面,因此解析失败并引发语法错误。由于HTML页面通常以字符“<”开头,因此该字符会在语法错误异常中被强调显示。

有没有办法禁用这个行为?不明白为什么 jQuery 会干扰资源标签。 - Bernardo Dal Corno
在我的情况下,这是由于服务器仅设置为从“libs”文件夹加载库,而我将jquery放置在不同的目录中所致。 - DarkTrick

9

我有同样的症状,而这是我的问题,非常难以追踪,所以我希望能帮到某些人。

我正在使用 JQuery parseJSON(),而我尝试解析的内容实际上不是 JSON ,而是返回的错误页面。


3

在尝试了几个解决方案后,这个方法对我有效:

  1. 打开IIS管理器
  2. 打开站点
  3. 点击身份验证
  4. 编辑匿名身份验证
  5. 选择“应用程序池标识”

enter image description here


1
请在此处编写解决方案,而不是包含可能在未来失效的链接或图像。谢谢! - Ignacio Ara
1
浪费了很多时间后,发现这是解决方案。 - Asiri Dissanayaka
1
这就是我需要的修复!谢谢! - Taylor Liss

1

我不知道这是否会是一个晚回答,或者它将以某种方式帮助某人。

如果您下载JS文件并将它们粘贴到项目目录中,您必须按照某些特定服务器的要求将它们放置在相应的目录中。例如,一些服务器会剥离文件并将它们放置在单个BUILDDIST文件夹中。您也可以将文件直接放置在父文件夹中,其中包含您的index文件,问题将消失。


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

0
我在使用 Firebase 网络应用程序时遇到了这个错误。原因是 index.html 文件中没有包含所需的库。
为了在开发环境中解决这个问题,我在 index.html 中添加了以下代码行:
<script src="https://www.gstatic.com/firebasejs/8.1.1/firebase.js"></script>

在计划部署生产时,请使用必要的库而不是导入所有js sdk。


0
如果您只在Chrome和IE中遇到此问题,而其他浏览器却没有问题,那么只需在开发者工具(F12 ->“网络”选项卡)中启用“禁用缓存”复选框,并清除最近一小时的历史记录即可。
我曾经遇到过这个问题,上述解决方案对我有效。

1
请不要在多个问题中发布相同的答案。发布一个好的答案,然后投票/标记关闭其他问题作为重复。如果问题不是重复的,请根据问题量身定制您的答案 - Paul Roub
这个答案救了我的一天!非常感谢你! - Yoni Rabinovitch

-1

当你更改文件所在的目录名称时,它通常可以正常工作。 当我将它从"js/"移动到"../js"时,它对我起作用了。


-1

尝试将text/javascript替换为text/html,然后保存笔记并重新加载浏览器,然后将其改回text/javascript。我不知道,但由于未知原因,这个方法对我有效。我一直在搜索和复制粘贴,然后无意中撤销了我正在输入的内容,然后它就奇迹般地起作用了0.O 顺便说一句,我只是一个新手..抱歉,我只是想帮忙..


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接