运行AJAX异步但不同步时,doctype标记的“意外的输入结束”

时间:2014-11-25 12:03:15

标签: javascript html ajax asynchronous

我有这个项目,我在HTML代码的第1行收到错误Uncaught SyntaxError: Unexpected end of input,这是DOCTYPE标记。我不知道如何解决这个问题,因为标签没有结束标签。我只是在运行AJAX异步时遇到这个错误,我必须这样做,否则AJAX会陷入无限循环方式..我用这个来与一个能够抓住一个日历年的所有红日的API进行交互。关于如何解决这个问题的任何想法?我一直在寻找答案,但我找不到任何符合我问题的答案。

这是我的AJAX代码:

    var xhr = new XMLHttpRequest();
        xhr.open('GET', 'http://api.dryg.net/dagar/v2/' + year, true);
        xhr.send();
    var json = JSON.parse(xhr.responseText);

    for (item in json.dagar) {

        var propertyObject = json.dagar[item];

        for (subitem in propertyObject) {

            if (subitem === 'röd dag') {

                var redDay = propertyObject[subitem];

                if (redDay === 'Ja') {

                    calendar.markRedDays(propertyObject.datum);
                    break;
                }
            }
        }
    }

这是HTML:

<!DOCTYPE html> <--- This is where the error points to
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Online Calender</title>
    <script src='https://cdn.firebase.com/js/client/1.1.1/firebase.js'></script>
    <link href='http://fonts.googleapis.com/css?family=Port+Lligat+Sans' rel='stylesheet' type='text/css'>
    <link rel='stylesheet' type='text/css' href='style.css'>
</head>
<body>
    <script src='https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js'></script>
    <script src="firebase1.js"></script>
</body>
</html>

2 个答案:

答案 0 :(得分:0)

似乎响应(xhr.responseText)为空,因为请求是ascynchronous(尚未收到)。

抛出该异常的方法是JSON.parse。

应该注册回调(如您问题的第一条评论中所述)以处理回复。

请注意,当reposone不是JSON时,您应该处理这种情况。例如,它可能是一个html页面,说明发生了错误。

祝你好运

答案 1 :(得分:0)

好的,事实是你需要了解AJAX的工作原理,并在评论中阅读我linked的文档。

var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://api.dryg.net/dagar/v2/' + year, true);
xhr.httpRequest.onreadystatechange = callbackFunction;
xhr.send();
alert("this alert is triggered after the request was sent but before it returned")

现在请求已发送,并且最终将返回,但您的代码将继续在正常流程中运行。一旦请求返回,它将触发“onreadystatechange”事件。感谢上面添加的行,这将调用你的callbackFunction。这应该如下所示:

var callbackFunction = function(){

// This is the state when the xhr request has returned, see the docs
if (xhr.readyState === 4) {
  // This means there was no error.
  if (xhr.status === 200) {

    //Here you can access the response of the xhr
    var json = JSON.parse(xhr.responseText);

    for (item in json.dagar) {

        var propertyObject = json.dagar[item];

        for (subitem in propertyObject) {

            if (subitem === 'röd dag') {

                var redDay = propertyObject[subitem];

                if (redDay === 'Ja') {

                    calendar.markRedDays(propertyObject.datum);
                    break;
                }
            }
        }
    }

  } else {
    alert('There was a problem with the request.');
  }
}

如果仍然不清楚,请查看MDN文档页面上的示例