使用ajax beforeSend修改数据

20

假设我有一个来自jQuery的Ajax调用,例如:

$.ajax({
   url: myUrl,
   data: myData,
   type:'post'
});
我希望能够使用代码向myData添加数据。
$.ajaxSetup({
   beforeSend: function(call){...}
});

结果应该是所有的ajax调用(包括post和get)都被修改,所以如果我得到了额外的参数IsAjax=true


在将变量放入Ajax调用之前,您不能编辑它吗? - Naftali
你可以这样做,但这并不是很符合DRY原则。 - Mario
3个回答

30
$.ajaxSetup({
  beforeSend: function(jqXHR, settings) {
    settings.data = $.extend(settings.data, {isAjax: true});
    return true;
  }
});

==== 更新 ====

data 是一个对象时,除非将 processData 选项设置为 false,否则 jQuery 将从对象的键/值对生成数据字符串。例如,{ a: "bc", d: "e,f" } 被转换为字符串 "a=bc&d=e%2Cf"。如果值是一个数组,jQuery 根据 traditional 设置的值(下面有描述)序列化具有相同键的多个值。例如,{ a: [1,2] } 在默认的 traditional: false 设置下变成字符串 "a%5B%5D=1&a%5B%5D=2"

https://api.jquery.com/jquery.ajax/

正如你所看到的,processData 设置应该设为 false。所以可以在 $.ajax() 请求中或全局地在 $.ajaxSetup() 中进行设置。


  1. 你不需要返回true(只需不返回false)
  2. 我认为此时数据已经成为参数化字符串,因此您需要将“&isAjax=true”附加到它上面(因为它不再是可以扩展的对象)。
- Dtipson
  1. 在影响功能的情况下加上返回值是一个好习惯。
  2. 我认为这取决于您在 ajax 函数中传递的数据格式。
- verybadbug
  1. 好的,但在这个特定函数的情况下,它不影响功能,所以仍然不是必要的。并非所有函数都需要返回任何内容(这就是为什么更严格的语言将某些函数定义为“void”的原因)。
  2. 我认为它不重要它是什么格式(get还是post,数据对象/字符串)。作为本机对象传递的数据仍然在此函数中记录为参数化字符串。
- Dtipson
1
只是确认 settings.data 在这个时候已经被序列化了。我刚刚测试过了。 - mpen
我该怎么做在序列化之前添加数据? - Kid
@mpen,@Shad 使用 processData: false 将在 beforeSend 函数中保留数据对象。因此,您可以使用 $.extend(settings.data, {isAjax: true}) 或类似的方法。 - verybadbug

18

这篇博客文章解释了如何使用$.ajaxSetup添加数据。它的累加方式类似于$.extend。 只需要这样做:

$.ajaxSetup({
  data:{
    isAjax:true
  }
});

如果你使用函数而不是“true”,这将无法工作。例如:isAjax:getValue()。 - yuceel

9
您可以在$.ajax()中使用beforeSend。
$.ajax({
  beforeSend: function(xhr){
    this.data += '&' + $.param({
      param: 'test'
    });
  }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接