jQuery在ajax全局事件中注入数据



我试图在ajax请求中注入数据,但失败了,我不知道为什么。我试着查看jQuery的源代码,但仍然找不到为什么它不起作用,任何帮助都很感激。这是代码:

$('#someElement').ajaxSend(function(e, req, options) {
    options.data += (options.data.length > 0 ? '&' : '') + '__token=' + $('input#requestToken').val();
}).ajaxSuccess(function(e, req, options, data) {
    if (data.nextToken) {
        $('input#requestToken').val(data.nextToken);
        delete data.nextToken;
    }
});

回复如下:

{
   "response":
   {
      "code":0,
      // ...
   },
   "nextToken":"4ded26352b3d44"
}

一个典型的请求是,例如:

$.getJSON(url, {something:'value'}, function(data) {
   if (data.response.code != 0) {
      // handle code
   }
});

问题是,发送的数据是"something=value";则不发送修改后的CCD_ 2。

**编辑**

当前请求数据为

something: value

并且应该是

something: value
__token: 4ded288eec1f56

ajaxSend事件回调中,如果修改后打印options.data的值,则该值为"something=value&__token=4ded288eec1f56",但"__token=4ded288eec1f56"未发送。为什么没有在请求中发送?

但更具体地说,如果可能的话,如何"修复"这个问题?

我认为问题是,当jQuery决定调用"ajaxSend"回调时,参数已经用于准备请求。因此,在该处理程序中更改它们没有任何效果。

编辑—根据@mikermcneil的回答,我不确定这是对的。jQuery"ajax"方法至少可以说是复杂的。他的示例页面看起来确实有效,这让我很困惑,但可能只会帮助我意识到我对jQuery内部的了解是多么的少:-)

-编辑

更新——问题在于getJSON。

看起来,虽然jQuery在这两种情况下都会触发ajaxSend事件,但它实际上并不像在post中那样在getJSON中使用更改后的数据变量。

将getJSON替换为$.post以解决您的问题(这就是我在下面链接的示例中所做的)。

-编辑-好吧,我在这里设置了一个版本:

http://abolition.me/toys/View/attachAjax.html(参见控制台)

我让服务器发回它得到的一切,它说:__token:"toketoketoke"键:"val1"键2:"val2"

所以看起来修改请求数据是可行的——您的处理程序在服务器端是什么样子的?

我正在调查它——不过,首先也是最重要的一点(我在试图复制问题时犯了错误),你是否检查过在文档准备好后分配活动?($(function(){});)

我不确定您的JSON响应是否正确:

{
  "response":
  {
  "code":0,  <-- this is not valid
  },
  "nextToken":"4ded26352b3d44"
}

有效应为:

{
  "response":
  {
  "code":0
  },
  "nextToken":"4ded26352b3d44"
}

要验证JSON响应,您可以使用:

JSON验证器

您只在getJSON调用中的第二个参数中传递数据{something:'value'}。任何要发送到服务器的数据都必须包含在其中。因此,__token必须包含在该参数中。

getJSON调用中的第三个参数是回调函数。传递给该函数的参数是来自服务器的响应。

$.getJSON(
    url,
    {
        something:'value',
        __token: 'token value'
    ,
    function(response) {
        if (response.response.code != 0) {
        // handle code
        }
    }
);

最新更新