当添加.done函数时,jQueryAJAX调用在没有命令的情况下启动



我正在重写一系列jQuery AJAX请求,并且在.done代码块方面遇到了问题。我正在尝试发送一个AJAX请求,并在处理数据之前等待响应。作为指南,我一直在使用以下页面:http://michaelsoriano.com/working-with-jquerys-ajax-promises-and-deferred-objects/

我还查看了无数的堆栈问题,试图解决我的问题,但没有发现任何有帮助的问题。作为参考,我看到的一些问题如下:
jQueryAjax调用未处理.done
Jqueryajax完成函数未启动
对jQuery.Ajax.done((函数感到困惑

我注意到,当我创建类似于上面指南的代码块时,函数在页面加载时运行,而不是在代码中触发它们时运行。为了隔离故障,我创建了一个简单的示例,如下所示:

<!DOCTYPE html>
<html lang="en">
<body>
<button type="button" onclick="getData()">Click me</button>
</body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
//Commented out due comment below   
/*function getData() {
console.log('enter getData');
return $.ajax({url:'./testajax.html',type:"POST"});
}

getData().done(function(data){
console.log('enter done');
alert(data);
});*/
function getData() {
console.log('enter getData');
$.ajax({ url: './testajax.html', type: "POST" })
.done(function (data) {
console.log('enter done');
alert(data);
});
alert('after');
}
</script>
</html>

我期望在加载示例页面时,不会发生任何事情,因为除非单击按钮,否则不会有执行getData()函数的触发器。但是,当我加载页面时,我的控制台会记录"输入getData",然后记录"输入done",我会收到一个包含./testajax.html页面内容的警报(只有一个字符串(。此外,当我点击按钮时,它会进入getData(),但不会触发getData().done功能,因此不会收到警报。

有人能在这里引导我走上正轨,帮助我防止getData()函数在页面加载时执行,而是让按钮点击执行AJAX请求,等待结果,然后执行.done块中的代码吗?

您使用的getData()表达式会立即调用pageload上的函数。然后将.done处理程序附加到它上

听起来你想要一个调用$.ajax.done附加到它的函数,比如:

function getData() {
console.log('enter getData');
$.ajax({ url: './testajax.html', type: "POST" })
.done(function (data) {
console.log('enter done');
alert(data);
});
}

然后将getData作为事件处理程序附加到某个位置。

不要使用内联处理程序。请改用.addEventListener或jQuery的.on('click'

最新更新