【问题标题】:parseJSON Uncaught SyntaxError: Unexpected token uparseJSON Uncaught SyntaxError: Unexpected token u
【发布时间】:2018-07-17 22:18:18
【问题描述】:

这个问题已经让我有点发疯了几个多小时了。我已经阅读了很多帖子和文章,现在我对这个问题有一个模糊的理解,但不是原因。我意识到问题在于,当我在未定义的对象上提交 JSON.parse 之类的内容时。我不知道为什么会这样。我敢肯定这很简单,而且我敢肯定,一旦有人指出它,我会觉得这是一个工具,但现在我不介意如果它解决了问题,我会觉得有点傻。

问题是当我使用以下方法提交表单时,出现以下错误:

Uncaught SyntaxError: Unexpected token u js:1
i.extend.parseJSON js:1
c js:1
u js:1
n.extend.showLabel js:1
n.extend.defaultShowErrors js:1
n.extend.showErrors js:1
n.extend.form js:1
n.extend.valid js:1
(anonymous function)
i.event.dispatch js:1
y.handle

当我将光标从一个字段移动到另一个字段时,我会收到此错误:

Uncaught SyntaxError: Unexpected token u js:1
i.extend.parseJSON js:1
c js:1
u js:1
n.extend.showLabel js:1
n.extend.defaultShowErrors js:1
n.extend.showErrors js:1
n.extend.element js:1
n.extend.defaults.onfocusout js:1
r js:1
(anonymous function) js:1
i.event.dispatch js:1
y.handle js:1
i.event.trigger js:1
i.event.simulate js:1
f

这显然会阻止我将表单提交给控制器进行处理。 错误似乎来自 jquery 库(第 498 行),当它试图: return n.JSON.parse(t); (t 未定义)。 我正在使用 jquery 1.9.1、bootstrap 2.2.2 和 jqValidate/1.9.0.unobtrusive.js。该表单处于引导模式,如下所示:

@model AModelTestApp.Models.UserModel

<div class="modal-header">
    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
    <h3>User</h3>
</div>

<div class="modal-body">

    @{
        var ajaxOptions = new AjaxOptions
            {
                HttpMethod = "POST",
                OnComplete = "Complete"
            };
    }

    @using (Ajax.BeginForm("EditUser", "Home", ajaxOptions, new { id = "userform" }))
    {
        <div class="row-fluid">
            <div class="span12">
                @Html.ValidationSummary("Ooops..", new { id = "validateuser", @class = "alert alert-error" })
            </div>
        </div>

        <div class="row-fluid">
            <div class="span6">
                @Html.LabelFor(m => m.Id)
                @Html.TextBoxFor(m => m.Id)

                @Html.LabelFor(m => m.Username)
                @Html.TextBoxFor(m => m.Username)

                @Html.LabelFor(m => m.FirstName)
                @Html.TextBoxFor(m => m.FirstName)

                @Html.LabelFor(m => m.LastName)
                @Html.TextBoxFor(m => m.LastName)
            </div>
            <div class="span6">
                @Html.LabelFor(m => m.Email)
                @Html.TextBoxFor(m => m.Email)

                @Html.LabelFor(m => m.UserTypeId)
                @Html.TextBoxFor(m => m.UserTypeId)

                @Html.LabelFor(m => m.Created)
                @Html.TextBoxFor(m => m.Created)

                @Html.LabelFor(m => m.Active)
                @Html.CheckBoxFor(m => m.Active)
            </div>
        </div>
        <div class="row-fluid">
            <div class="span1 offset10">
                <a id="btnclear" class="btn" href="#">Clear</a>
            </div>
        </div>
    }

</div>

<div class="modal-footer">
    <a class="btn" data-dismiss="modal" href="#">Close</a>
    <a id="btnsubmit" class="btn btn-info" href="#">Submit</a>
</div>

<script type="text/javascript">
    $.validator.unobtrusive.parse($('#userform'));

    $('#btnclear').click(function() {
        $('input').val('');
        $(':checkbox').prop('checked', false);
        return false;
    });

    $('#btnsubmit').click(function () {

        $('#userform').validate();
        if ($('#userform').valid()) {
            $('#userform').submit();
        } else {
            alert("Something went wrong with the validation")
        }

    });

    function Complete(result) {
        alert("Woooo - " + result);
    }
</script>

模态加载如下:

<div class="row-fluid">
    <div class="span12">
        <button id="btnclick" class="btn btn-large btn-block btn-primary">Click Me</button>
    </div>
</div>

<div id="mainmodal" class="modal hide fade"></div>

<script type="text/javascript">
    $('#btnclick').click(function () {
        $.ajax({
            url: '@Url.Action("GetUser", "Home")',
            type: 'GET',
            success: function (result) {
                //awss.modal.popup(result);
                $('#mainmodal').html(result);
                $('#mainmodal').modal('show');
            }
        });
        return;
    });
</script>

从此控制器:

    public ActionResult GetUser()
    {
        var user = new UserModel
            {
                Id = 1,
                Username = "sbody",
                FirstName = "Some",
                LastName = "Body",
                Email = "sbody@domain.com",
                UserTypeId = 6,
                Created = new DateTime(2013, 1, 1),
                Active = true
            };
        return PartialView("EditUser", user);
    }

在 web.config 中启用了 ClientValidationEnabled 和 UnobtrusiveJavaScriptEnabled。 我希望这只是我长时间关注同一个问题而看不到明显问题的一个例子。非常感谢任何帮助。 谢谢:)

【问题讨论】:

  • 将 jquery.migrate 添加到您的脚本列表中,认为应该对其进行排序
  • jquery 1.9+ 导致 unobtrusive-ajax 和验证库出现问题。 migrate 包添加回 1.8+ 系列 jquery 中的功能。
  • jQuery.Validation 包更新到 1.13.0 并将 jQuery.Validation.Unobtrusive 包更新到 2.0.20710.0 为我解决了这个问题。
  • 没有人回答问题了吗? ;)
  • @Slicksim 你应该添加它作为答案 - 救了我的命!

标签: jquery json asp.net-mvc-4


【解决方案1】:

你可以试试下面的

'$.parseJSON(result)' 

在你的 ajax 成功函数中使用 parsejson。

【讨论】:

    【解决方案2】:

    不确定这是否适用于这种情况,但我发现这样的零星问题是通过不显眼的验证来实现的。

    那里有一个 ValidationSummary 元素,所以这可能不适用。但我看到它的时候是我没有包含验证消息元素。

    自从我偶然发现这一点已经有一段时间了,但据我回忆,我什至需要为复选框等看似无害的东西添加消息。似乎正在解析的 JSON 可能包含应该包含验证消息的元素,如果它是 undefined,那么一旦到达 'u '。

    所以,对于你的代码,也许可以试试这样:

    <div class="row-fluid">
        <div class="span6">
            @Html.LabelFor(m => m.Id)
            @Html.TextBoxFor(m => m.Id)
            @Html.ValidationMessageFor(m => m.Id)
    
            @Html.LabelFor(m => m.Username)
            @Html.TextBoxFor(m => m.Username)
            @Html.ValidationMessageFor(m => m.Username)
    
            @Html.LabelFor(m => m.FirstName)
            @Html.TextBoxFor(m => m.FirstName)
            @Html.ValidationMessageFor(m => m.FirstName)
    
            @Html.LabelFor(m => m.LastName)
            @Html.TextBoxFor(m => m.LastName)
            @Html.ValidationMessageFor(m => m.LastName)
        </div>
        <div class="span6">
            @Html.LabelFor(m => m.Email)
            @Html.TextBoxFor(m => m.Email)
            @Html.ValidationMessageFor(m => m.Email)
    
            @Html.LabelFor(m => m.UserTypeId)
            @Html.TextBoxFor(m => m.UserTypeId)
            @Html.ValidationMessageFor(m => m.UserTypeId)
    
            @Html.LabelFor(m => m.Created)
            @Html.TextBoxFor(m => m.Created)
            @Html.ValidationMessageFor(m => m.Created)
    
            @Html.LabelFor(m => m.Active)
            @Html.CheckBoxFor(m => m.Active)
            @Html.ValidationMessageFor(m => m.Active)
    
        </div>
    </div>
    

    【讨论】:

      【解决方案3】:

      只需添加以下代码问题是由于无法显示错误消息的跨度而发生的

       $('input[name],select[name]').each(function ()
      {
      
          if ($(this).attr('name') != '')
          {
      
              if ($(this).closest('div').find('span[data-valmsg-for=' + $(this).attr('name') + ']').length == 0)
              {
                  $(this).closest('div').append('<span class="field-validation-valid error_msg" data-valmsg-for="' + $(this).attr('name') + '" data-valmsg-replace="true"></span>');
              }
          }
      })
      

      【讨论】:

      • 这段代码帮助我找到问题所在,在我的例子中,它是一个没有属性名称的输入。
      【解决方案4】:

      如 cmets 中所述,jquery 1.9 存在与 jquery 不显眼验证不兼容的问题。您可以通过将以下代码放入浏览器控制台窗口来快速检查您是否有此问题:

      JSON.parse(undefined)
      

      如果你得到

      Uncaught SyntaxError: 位置 0 处 JSON 中的意外标记 u

      ... 那你就有问题了。要解决此问题,请将迁移库添加到您的页面,在 jquery 下方:

      <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
      <script src="http://code.jquery.com/jquery-migrate-1.4.1.js"></script>
      

      错误应该消失并被控制台警告替换。此版本用于调试,因此如果您希望警告完全消失,请改为指向迁移库 .min 文件:

      <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
      <script src="http://code.jquery.com/jquery-migrate-1.4.1.min.js"></script>
      

      可以通过GitHub 上的 jquery-migrate 了解有关将代码迁移到 jquery 1.9+ 的更多信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-17
        • 2014-04-07
        • 2012-05-17
        • 2019-02-10
        • 2014-07-08
        • 2011-03-09
        • 2014-01-06
        • 2012-04-10
        相关资源
        最近更新 更多