【问题标题】:ajax success not working even though string looks fine即使字符串看起来不错,ajax 成功也不起作用
【发布时间】:2016-04-01 16:32:22
【问题描述】:

如果用户滚动到几乎底部,则应在 ajax 请求的帮助下加载更多内容。此 ajax 请求获取一些数据(作为 json 对象形式的字符串 - 所以它不是 json 对象,而只需解析为一个)。此外,我实际上使用了一个插件(JSON2HTML),它在模板迭代一个 json 对象后生成 html。

JSON(在 ajax 之前):

var template = {"tag":"div","class":"parent","children":[
{"tag":"div","class":"tablee","style":"cursor:/*pointer*/;","children":[
    {"tag":"table","class":"post","children":[
        {"tag":"tbody","children":[
            {"tag":"tr","children":[
                {"tag":"td","class":"postby","children":[
                    {"tag":"img","class":"postppic","src":"propic\/${profilepic}","html":""}
                  ]},
                {"tag":"td","class":"postcontent","children":[
                    {"tag":"p","class":"postusername","children":[
                        {"tag":"a","class":"poster","href":"${username}-profile.php","html":"${username}"},
                        {"tag":"br/"},
                        {"tag":"span","class":"caption","html":"${caption}"}
                    ]}
                ]},
                ...

var data = [

    {
        "username":"momo",

        "profilepic": "momo_1.jpg",

        "caption":"", 

        "likes": "0",
    },

    {
        "username":"momo",

        "profilepic": "momo_1.jpg",

        "caption":"", 

        "likes": "0",
    },

    ...

];

var str = json2html.transform(data,template);

$("#rein").append(str);

现在,如果用户向下滚动,将加载更多内容,像 json 对象一样形成的字符串现在由 php 回显,我们在文档中已有的帖子数量被发送到(所以我们不会得到相同的帖子再次...)。

jQuery(接近底部时的ajax请求):

$(document).ready(function () {
    function loadMore()
    {
        var accountpar = $(".parent").length;
        $("h1").text(accountpar);
        $.ajax({
            url: 'homemore.php',
            type: 'post',
            data: {
                'account':accountpar
            },
            success: function(json) {
                var str = json2html.transform(json,template);
                $(str).insertAfter($('[class="parent"]').last());
                $("#rein").append();
                homejs();
            }
        });
        $(window).bind('scroll', bindScroll);
    }

    function bindScroll(){
        if($(window).scrollTop() + $(window).height() > $(document).height() - 75) {
            $(window).unbind('scroll');
            loadMore();
        }
    }

    $(window).scroll(bindScroll);
});

直到成功并且应该接收数据之前,它都可以正常工作。 (homejs() 是在 document.ready 之后加载的 jquery 函数,因此第一个 jquery 写入文档中。)这个数据看起来像这样(根据我的 google chrome 浏览器):

var data = [

{
    "username":"momo",

    "profilepic": "momo_1.jpg",

    "caption":"",

    "likes": "0",
},

{
    "username":"momo",

    "profilepic": "momo_1.jpg",

    "caption":"",

    "likes": "0",
},

...

];

所以收到了一些东西但无法解析?因为这就是控制台日志所说的(它是这样称呼的吗?就像你可以看到所有错误的地方......):

VM5454:2 Uncaught SyntaxError: Unexpected token v

json2html.transform@json2html.js:33

//Normalize strings to JSON objects if necessary
var obj = typeof json === 'string' ? JSON.parse(json) : json; //line 33

$.ajax.success@home.php:423

var str = json2html.transform(datanew,template); //line 423

j@jquery-1.11.3.min.js:2

k.fireWith@jquery-1.11.3.min.js:2

x@jquery-1.11.3.min.js:5

b@jquery-1.11.3.min.js:5

那么你们中的任何人都可以弄清楚为什么它不起作用吗?我希望我提供了足够的信息...请帮助:']

【问题讨论】:

  • 如果有任何错误,请查看开发控制台或添加错误回调以捕获错误。
  • 你能写一个关于如何做到这一点的答案吗?我对 jQuery 很陌生,并试图提供尽可能多的信息.​​.....对不起,如果这是一个愚蠢的问题......@Matt.k
  • 您可以在 Ajax 调用中使用 .fail()。在这个 jQuery 页面上,搜索短语“deprecation notice”,代码示例就在那个黄色框的正下方。确保使用参数,例如:.fail(function(error) { console.log(error); }) 请参阅:api.jquery.com/jQuery.ajax

标签: jquery json ajax


【解决方案1】:

你可以用这个替换你的ajax,看看你得到了什么

var accountpar = $(".parent").length;          
var data = {account:accountpar} ; 
  console.log('data',data);
 $.ajax({ 
        url: 'homemore.php',
        data: data ,
        type: 'post',
        dataType: "json",
        success: function(response) {
                  console.log(response);
         },
        error: function(jqXHR, exception) {
               if (jqXHR.status === 0) {
                   alert('Not connect.\n Verify Network.');
                } else if (jqXHR.status == 404) {
                    alert('Requested page not found. [404]');
                } else if (jqXHR.status == 500) {
                    alert('Internal Server Error [500].');
                } else if (exception === 'parsererror') {
                    alert('Requested JSON parse failed.');
                } else if (exception === 'timeout') {
                    alert('Time out error.');
                } else if (exception === 'abort') {
                    alert('Ajax request aborted.');
                } else {
                   alert('Uncaught Error.\n' + jqXHR.responseText);
                }
         }
  });

【讨论】:

  • 好的,我认为由于这段代码摘录,我们更进一步。它现在说:请求的 JSON 解析失败。
  • 原因是因为你返回的数据是字符串或者其他格式,并不是真正的Json,所以解析器在解析的时候失败了。你可以脱掉dataType: "json属性看看有没有数据
【解决方案2】:

您是否尝试过通过http://www.jslint.com 运行所有 JSON 以查看它是否是有效的 JSON?

json2html.transform @ json2html.js:33 文件中的Unexpected token 错误表明 JSON 对象中存在问题。 (我们没有办法检查它们,因为上面所有 3 个示例都有省略号。)

或者通过 JSON.parse() 方法传递成功函数中的 json 呢?请参阅此页面上的答案: I keep getting "Uncaught SyntaxError: Unexpected token o"

更新:这是一个jsfiddle 供您试用。 (在小提琴中滚动到JS的最底部。)

HTML:

<div id="output1"></div>
<div id="output2"></div>

JavaScript 示例 1 - 使用字符串化 JSON:

如果您的 PHP 文件将其输出为字符串,那么您必须对其运行 JSON.parse。

var json = '[{"username": "momo", "profilepic": "momo_1.jpg", "caption": "", "likes": "0"}]';

var HTML = json2html.transform(JSON.parse(json),template);
$('#output1').html(HTML);

JavaScript 示例 2 - 使用 JSON:

如果你的 PHP 文件输出这种 JSON 格式,那么你不需要 JSON.parse 方法。

var json = [{"username": "momo", "profilepic": "momo_1.jpg", "caption": "", "likes": "0"}];

var HTML = json2html.transform(json,template);
$('#output2').html(HTML);

你必须看看你的网络服务器正在输出什么。

如果您看到这些错误...

Unexpected token ] ... 那么代码使用的是字符串(不是像示例 1 那样的 JSON)& 它在右括号前有一个逗号,应该将其删除。然后在字符串上运行 JSON.parse(),将其转换为对象。

Unexpected token o ...然后代码正在尝试在有效的 JSON 对象上运行 JSON.parse()。要修复它,请删除 JSON.parse() 方法。

【讨论】:

  • 使用马特 k 后。方法我发现“请求的 JSON 解析失败”如果对你有帮助的话。
  • 但是我可以在收到的数据末尾看到一个带有红色背景的 x(谷歌浏览器的错误符号),显示在方括号和分号后面:“]; x"
  • 你能不能做一个jsfiddle.net 的代码示例,让我们看看这3 个完整的JSON 对象是什么样子的?
  • 我们需要检查它是否包含任何经过修改的 JSON 格式。我见过大型复杂的嵌套 JSON 对象,它们来自无 SQL 数据库,并且在插入数据库时​​格式不正确。所以他们不能使用 JSON.parse() 进行 eval();它们是看起来像 JSON 的字符串,但只是格式不正确的字符串。这个问题似乎和那个类似。
  • 我只是用 php 回显了所有内容,因此它看起来像一个 json 字符串。这至少在原始文件中有效,应该显示的帖子是有限的,这就是我现在需要 ajax 的原因。
猜你喜欢
  • 2023-04-06
  • 1970-01-01
  • 2016-05-31
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-10
  • 2014-01-31
相关资源
最近更新 更多