见下面的代码。
在ajaxSend
我可以编辑或添加s.data
,但如果我不在$ .post()中提供任何其他数据,jQuery会发送没有其他数据的请求。
有什么建议吗?
<?php if ($_SERVER['REQUEST_METHOD'] == 'POST') {
print_r($_POST);
} else { ?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Test</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script>
$(document).ajaxSend(function (e, xhr, s) {
s.data = s.data ? s.data+'&' : '';
s.data += 'my_value=1';
})
$.post('/test.php'); // empty $_POST
$.post('/test.php', {value: 0}); // $_POST with value and my_value
</script>
</head>
<body>
</body>
</html>
<?php } ?>
答案 0 :(得分:0)
我现在还没有使用过jQuery,因此也没有使用过它的ajax,但是在查看了它的来源之后,所选择的事件看起来对你想做的事情来说是不合适的。
ajaxSend
事件的日志记录请求的示例。 src/ajax.js
中的代码在创建(并且最明显地启动)请求之后触发ajaxSend
。显然,事件是同步发送的。因此,您的事件处理程序碰巧处理已经启动的请求,但是会延迟到当前执行环境(启动请求并调用事件处理程序)的请求在实际处理后台请求之前已经结束。这就是为什么由于通过引用访问对象而可以修改附加到正在运行的请求的任何数据的原因,但是由于jQuery之前没有将它附加到请求,因此无法添加数据。并且在调度事件后它没有使用s.data
。当时只做了一些事情,这主要与处理超时等有关。因此,两种文档都没有建议使用ajaxSend
进行此类请求过滤,代码也没有显示任何支持。但在检查代码时,我偶然发现了对所谓的 prefilters 的一些支持。也许你应该坚持使用它,并查看$.ajaxPrefilter上的文档。