语法错误:意外的<符号

94

我尝试过很多方法,但总是出现这个错误。我试着只使用一个选项来看是否可以通过,改变了jquery的调用方式,但没有成功。

我在互联网上各种地方查找了关于这个错误的资料,但是无法解决或理解为什么会发生这种情况。在我的电脑上使用EasyPHP完美运行,但放到网上就无法工作。

语法错误:意外的标记<

这是我的代码:

$(function(){
$('#salvar').click(function(){
    var key = 'salvar';
    var title = $('#title').val();
    var opcao1 = $('#opcao1').val();
    var opcao2 = $('#opcao2').val();
    var opcao3 = $('#opcao3').val();
    var opcao4 = $('#opcao4').val();
    var opcao5 = $('#opcao5').val();
    var opcao6 = $('#opcao6').val();

    if(title.length > 0){
        if(opcao2.length > 0){
            $('#resposta').removeClass().html('Salvando a enquete...<br clear="all"><br><img src="images/switch-loading.gif" />');
            $.ajax({
            type : 'POST',
            url : 'funcoes/enquete_adm.php',
            dataType : 'json',
            data: {key:key,title:title,opcao1:opcao1,opcao2:opcao2,opcao3:opcao3,opcao4:opcao4,opcao5:opcao5,opcao6:opcao6},
            success : function(data){
                if(data.sql == 'ok'){
                        $('#resposta').addClass('success-box').html('Enquete Salva!').fadeIn(1000);
                        $('#control').fadeOut();
                    }else if(data.sql == 'error'){
                        $('#resposta').addClass('info-box').html('Ops, aconteceu um erro. Por favor, tente novamente').fadeIn(1000);
                    }
                },
            error: function (XMLHttpRequest, textStatus, errorThrown) {    
                alert("XMLHttpRequest " + XMLHttpRequest[0]);alert(" errorThrown: " + errorThrown);alert( " textstatus : " + textStatus);    
            }
            });
        }else{
            $('#resposta').addClass('warning-box').html('É necessário no mínimo duas opções');
        };
    }else{
        $('#resposta').addClass('warning-box').html('Coloque a pergunta da enquete');
    };
    return false;

});
}); // End

控制台上有显示是哪个文件吗? - Sergio
1
错误应该给出文件和行号,发布它指向的特定行。 - Patrick Evans
我不记得在哪里发现了错误。但是它出现在 PHP 代码中。 - Geovane Krüger
16个回答

126

当您包含或发布不存在的文件时,通常会发生这种情况。服务器将返回一个常规的HTML格式的“404 Not Found”,并用

括起来。

'<html></html>' 

标签。第一个尖括号 < 不是有效的 JS 或有效的 JSON,因此会触发意外的标记。

如果您尝试将'funcoes / enquete_adm.php'更改为绝对 URL,以确保呢?

编辑(几年后)

根本原因可能并不总是来自404错误。有时您可以向API发出请求并接收HTML格式的错误。我曾经遇到过几种情况,其中API端点应该返回

{
   error: "you must be authenticated to make this request"
}

收到401头信息,但实际得到的是

<html>You must be authenticated to make this request</html>

带有200响应头。

如果响应头是200,您无法事先确定请求是否失败,并且必须尝试JSON.parse响应以检查其是否有效。


很奇怪,因为我有几个使用JS URL的其他命令,它们以同样的方式工作得很好,我只是给了你这个问题。而且在我的电脑上完美运行,但放到服务器上就不起作用。 - Geovane Krüger
1
谢谢。这对我有用。我拼错了我的JS文件名。 - lwdthe1

14
你有不必要的分号:; 示例:
 }else{
        $('#resposta').addClass('warning-box').html('É necessário no mínimo duas opções');
    };
闭合}后面不应有分号

这里另一个例子:

}else{
    $('#resposta').addClass('warning-box').html('Coloque a pergunta da enquete');
};

8

我怀疑你在请求响应中得到了文本/HTML编码,所以我认为问题出在这里:

dataType : 'json',

尝试将其更改为

dataType : 'html',

来自http://api.jquery.com/jQuery.get/:

数据类型 类型:字符串 期望从服务器返回的数据类型。默认值:智能猜测(xml、json、script或html)。


6

错误信息 SyntaxError: Unexpected token < 通常意味着 API 端点在其文档正文中未返回 JSON,比如由于 404 错误。

在这种情况下,代码期望找到一个 JSON 的起始标记 { ,但实际上它找到了一个标题元素的起始标记 <

成功响应:

<html>
  <head></head>
  <body>
    {"foo": "bar", "baz": "qux"}
  </body>
</html>

未找到响应:
<html>
  <head></head>
  <body>
    <h1>Not Found</h1>
    <p>The requested URL was not found on the server.  If you entered the URL manually please check your spelling and try again.</p>
  </body>
</html>

尝试在您的浏览器中访问数据端点的URL以查看返回的信息。


3
我遇到了类似的问题,我的问题在于我发送javascript来显示控制台消息。
即使我在浏览器中查看文件(而不是通过应用程序),它也正如我所期望的那样显示(例如,额外的标签没有显示出来),但它们在html /文本输出中显示,并且尝试进行解析。
希望这能帮助某些人!

2
我怀疑你的其中一个脚本包含了源映射URL。(例如,压缩后的jQuery包含对源映射的引用。)
当你打开Chrome开发者工具时,Chrome会尝试从该URL获取源映射以帮助调试。但是,源映射实际上并不存在于你的服务器上,而是发送给你一个包含HTML的常规404页面。

1

从我的代码中删除这行解决了我的问题。

header("Content-Type: application/json; charset=UTF-8"); 

1
当通过ajax发布内容时,首先进行正常提交以确保被调用的文件始终返回有效数据(JSON)并且没有带有HTML标签或其他错误。
<form action="path/to/file.php" id="ajaxformx">

通过将x添加到id值中,jquery将不会处理它。
一旦您确定一切都正常,然后从id =“ajaxform”中删除x并清空action属性值。
这就是我几分钟前为自己解决相同错误的方法 :)

1

我在通过ajax提交表单时遇到了语法错误:意外令牌<。然后我使用curl查看它返回了什么:

curl -X POST --data "firstName=a&lastName=a&email=array@f.com&pass=aaaa&mobile=12345678901&nID=123456789123456789&age=22&prof=xfd" http://handymama.co/CustomerRegistration.php

我得到了这样的回复:
<br />
<b>Warning</b>:  Cannot modify header information - headers already sent by (output started at /home/handymama/public_html/CustomerRegistration.php:1) in <b>/home/handymama/public_html/CustomerRegistration.php</b> on line <b>3</b><br />
<br />
<b>Warning</b>:  Cannot modify header information - headers already sent by (output started at /home/handymama/public_html/CustomerRegistration.php:1) in <b>/home/handymama/public_html/CustomerRegistration.php</b> on line <b>4</b><br />
<br />
<b>Warning</b>:  Cannot modify header information - headers already sent by (output started at /home/handymama/public_html/CustomerRegistration.php:1) in <b>/home/handymama/public_html/CustomerRegistration.php</b> on line <b>7</b><br />
<br />
<b>Warning</b>:  Cannot modify header information - headers already sent by (output started at /home/handymama/public_html/CustomerRegistration.php:1) in <b>/home/handymama/public_html/CustomerRegistration.php</b> on line <b>8</b><br />

所以我只需要将日志级别从警告改为仅错误即可。
error_reporting(E_ERROR);

1
我会尽力帮助您翻译。以下是您需要翻译的内容:

我检查了所有包含的JS路径

示例 将其更改为

<script src="js/bootstrap.min.js" type="text/javascript"></script>

TO

<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" type="text/javascript"></script>

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