我可以在javascript上启动一系列事件吗?单击函数?
你好 在JavaScript的onclick函数中,我有一系列我希望按顺序发生的事件。但是,当我添加几个更新db的.post函数时,它不起作用。在onclick函数中不能有超过1.post函数吗?这是我的代码,在这里添加更多的文本,因为网站不允许我发布说我需要添加更多的细节,因为我发布了大部分代码。请帮忙,期待您的帮助我可以在javascript上启动一系列事件吗?单击函数?,javascript,onclick,Javascript,Onclick,你好 在JavaScript的onclick函数中,我有一系列我希望按顺序发生的事件。但是,当我添加几个更新db的.post函数时,它不起作用。在onclick函数中不能有超过1.post函数吗?这是我的代码,在这里添加更多的文本,因为网站不允许我发布说我需要添加更多的细节,因为我发布了大部分代码。请帮忙,期待您的帮助 $('#vesmos').click(function(){ var dt = new Date(); var dformat = dt.getFullYear(
$('#vesmos').click(function(){
var dt = new Date();
var dformat = dt.getFullYear() + "/"
+ (dt.getMonth()+1) + "/"
+ dt.getDate() + " "
+ dt.getHours() + ":"
+ dt.getMinutes() + ":"
+ dt.getSeconds();
//set start and end date on form fields
if($.trim($('#stdt').val()) == ''){
$('#stdt').val(dformat);
}
$('#enddt').val(dformat);
//update rt table close rt log (code does not when I add this function)
$.post("closert-docadminus.php",
{
empname: $("#empname").val(),
});
//calculate start and end date
var strt = $('#stdt').val();
var end = $('#enddt').val();
var d2 = new Date(strt);
var d1 = new Date(end);
$('#insec').val(parseFloat(((d1-d2)/1000).toFixed(2)));
$('#inmin').val(parseFloat(((d1-d2)/60000).toFixed(2)));
$('#inhrs').val(parseFloat(((d1-d2)/3600000).toFixed(2)));
//save to ams table logs
$.post("savesettings.php",
{
empname: $("#empname").val(),
task: $("#task").val(),
dttoday: $("#dttoday").val(),
stdt: $("#stdt").val(),
enddt: $("#enddt").val(),
insec: $("#insec").val(),
inmin: $("#inmin").val(),
inhrs: $("#inhrs").val(),
pltform: $("#pltform").val(),
});
//clear textboxes
$('#stdt').val("");
$('#enddt').val("");
$('#task').val("");
$('#pltform').val("");
//fill textboxes
$('#task').val("Mail Open/Sort");
$('#pltform').val("VES");
$('#stdt').val(dformat);
$('#statype').val("Occupancy");
$('#statprio').val("Primary");
// save log to rt table (code does not when I add this function)
save to realtime
$.post("savert-docadminus.php",
{
empname: $("#empname").val(),
task: $("#task").val(),
stdt: $("#stdt").val(),
});
});
你要做的是一组并发的 根据浏览器的不同,您将有一组最大并发XHR,其中有一个列表。但即使它们太多,它们也会排队,因此浏览器会在将来发送它们 您试图在单击事件处理程序中创建3个并发XHR,我不认为这是一个问题。仅仅说“它不起作用”并不能提供足够的问题信息,您需要进行挖掘和调试 以下是我建议您做的: 1,打开开发工具中的“控制台”选项卡,检查控制台中是否存在任何阻止调度XHR的JavaScript错误 2、打开开发者工具中的“网络”选项卡,检查XHR是否有效调度;如果是,请检查服务器响应是什么 3,在.post调用append.done和.fail回调中,确认服务器正在响应什么,例如:
$.post("some.php", data: { name: "John", location: "Boston" })
.done(function (response) {
console.log(response);
})
.fail(function (jqXHR, textStatus, errorThrown) {
console.log(textStatus);
console.log(errorThrown);
});
这将引导您找到问题的根本原因您可能会遇到重大事件。这不起作用,因为Javascript是异步的。 所有的I/O调用都是异步的,所以第三个调用可以第一个完成,但第二个调用可以最后完成。
您应该了解有关Javascript事件循环的更多信息。鉴于OP在评论部分澄清了“问题”是:一个接一个地调度XHR,我将添加关于如何实现它的第二个答案,但首先,我将尝试简要解释为什么在一个接一个地添加$.post调用不起作用 默认情况下,XMLHTTPRequests是异步的。这迫使您在异步域中思考,并假设调用:
asyncFunction1() ($.post)
asyncFunction2() ($.post)
并不意味着asyncFunction1结束执行时将执行asyncFunction2
$.post('url', data).done(function (response1) {
// Next code here
})
这将导致您:
$.post('url1', data1).done(function (response1) {
// The first XHR finished successfully, we send the second
$.post('url2', data2).done(function (response2) {
$.post('url2', data2).done(function (response2) {
// The second XHR finished successfully, we send the third and so on
$.post('url3', data3).done(function (response3) {...})
})
})
})
这最终会让你说
“代码嵌套看起来不好,也不容易维护,我如何才能使它更干净?”
祝贺您,您已进入域。您可以拥有多个post事件。我的猜测是,当它是异步的时,您希望它同步运行。在用新值填充文本框之前,您不需要清除文本框,但这不会导致问题。您也不需要将值放入文本框中,只需将它们与
$一起发送。post()
$。post()
(通常是ajax)是异步的;您的代码不会等待每个请求完成后再继续。@ChrisG但他不使用结果,因此不清楚它是否重要。每个脚本是否要求前一个脚本已经完成,或者它们是独立的?