AJAX值发送错误

时间:2013-05-02 12:18:22

标签: php jquery ajax json

您好我的下面的脚本有问题。我认为问题在于需要通过AJAX发送到php的数据。

的jQuery

$('.send').live("click", function(){

    $.ajax({

        url:'foobar.php',
        type:'post',
        data: 'id=' + $(this).attr('id'),
        dataType:'json',
        contentType: 'application/json; charset=utf-8',
        success: function(data) {

            switch (data.status)
            {
                case "a":

                    alert(data.text);

                    break;

                case "b":

                    alert(data.text);

                    break;

                }
            },
        error: function(XMLHttpRequest, textStatus, errorThrown) {

            alert ("error: "+textStatus);

            }
        })
    }

和PHP

$id = $_REQUEST['id'];

switch ($id) {

    case "foo":

        $data["status"] = "a";
        $data["text"] = "foo-foo";
        echo json_encode($data);

        break;

    case "bar":

        $data["status"] = "b";
        $data["text"] = "bar-bar";
        echo json_encode($data);

        break;

    }

但是,如果我这样做

//data: 'id=' + $(this).attr('id'),

并更改此

$id = 'foo';

脚本工作得很好。我需要做些什么来使上面的两个脚本都可以工作?提前谢谢。

5 个答案:

答案 0 :(得分:3)

更改此

data: 'id=' + $(this).attr('id'),

data: {id :  $(this).attr('id')},

此处也使用on,不推荐使用live

$('.send').on("click", function(){

答案 1 :(得分:2)

我会将我的评论作为答案。

除了使用已弃用的jQuery API之外,其他人没有指出的内容如下:

您在下面的行中做了什么:

contentType: 'application/json; charset=utf-8',

是你承诺服务器,HTTP实体将是一个JSON字符串,但事实并非如此。它实际上是通常的百分位编码字符串。 (a=b&c=d&e=f)。

如果删除该行,浏览器会将默认值Content-Type发送为application/x-www-url-form-encoded。这将触发PHP解析HTTP实体,并为您提供正确填充的$_REQUEST数组。

答案 2 :(得分:0)

您需要对正在发送的数据进行JSON编码。

它应该类似于:'{“id”:“'+ $(this).attr('id')+'”}}

答案 3 :(得分:0)

你可以使用,

     $('.send').click(function(){

而不是

  $('.send').live("click", function(){

显示错误

TypeError:Object [object Object]没有方法'live'(不推荐使用)

答案 4 :(得分:0)

问题中的代码中存在一些问题。

请勿使用.live()。它在jQuery 1.7中被弃用,并在jQuery 1.9(最新发布版本)中完全删除。相反,请使用.on()

$('.send').on('click', function() {
    ...
});

或者,如果您确实需要事件委托:

$(document).on('click', '.send', function() {
    ...
});

在对象文字中设置data属性作为$.ajax()的参数传递时,您有两个选项:字符串或对象文字。所以:

data: {id: this.id},

data: 'id=' + this.id,

请注意,我使用的是this.id,而不是$(this).attr('id');。为什么?因为它避免了不必要的jQuery使用,并且因为.attr()不是正确的函数 - 你需要id属性,所以你应该使用.prop()(但是,再次,不要使用jQuery,除非你需要)。

最后,您尚未关闭对.click()的通话,因此您需要在发布的代码末尾添加);

整个事情应该是这样的:

$('.send').on("click", function () {

    $.ajax({

        url: 'foobar.php',
        type: 'post',
        data: 'id=' + this.id,
        dataType: 'json',
        contentType: 'application/json; charset=utf-8',
        success: function (data) {

            switch (data.status) {
            case "a":

                alert(data.text);

                break;

            case "b":

                alert(data.text);

                break;

            }
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {

            alert("error: " + textStatus);

        }
    })
});