5

嗨,我对下面的脚本有疑问。我认为问题在于需要通过 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';

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

4

5 回答 5

3

改变这个

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

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

也在on这里使用,live已弃用

$('.send').on("click", function(){
于 2013-05-02T12:26:22.670 回答
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正确填充的数组。

于 2013-05-02T14:17:51.393 回答
0

您可以使用 ,

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

安装在

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

显示有错误

TypeError: Object [object Object] has no method 'live' (live is deprecated)

于 2013-05-02T12:32:54.320 回答
0

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

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

于 2013-05-02T12:24:00.023 回答
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);

        }
    })
});
于 2013-05-02T14:15:30.480 回答