我有一个onchange
事件的输入:
<input type="text" value="2014-01-01" class="datepicker dateDashboard" onchange="repartiteur('DatesDashboard',$(this));document.location.href='index.php?menu=17|30&options=opt';" name="DateDebutDashboard">
function appelAjax(data)
{$.ajax(
{type: "post",
data: data,
url: 'index_ajax.php'
});
}
function repartiteur(action,this)
{switch (action)
{case 'DatesDashboard':
data = (
{'action' : action,
'champ' : this.attr('name'),
'date' : this.val()
});
break;}
appelAjax(data);}
期望目标是当我更改输入中的日期时,通过AJAX发送日期以更改数据库中的值,然后根据数据库中的新值重新加载页面。
问题有时候,repartite的ajax调用需要更长的时间来响应,当页面重新加载时(使用第二个内联javascript调用),数据库中还没有发生更改。
问题:如果可能的话,我怎么能延迟第二个javascript部分(重新加载文档)以确保在页面重新加载之前ajax调用已完成更新数据库?
检查这个答案How to implement a lock in JavaScript我觉得有一些方法可以做到这一点,但是这个答案适用于不同的事件,而我希望延迟发生在同一个事件中,但是在不同的javascript行之间。
我知道event.stopPropagation但我不希望事件停止,它必须在ajax调用后继续。
编辑 - 这里接收电话的PHP代码:
$action = $_POST['action'];
switch ($action)
{case 'DatesDashboard':
$codeUSR = $_SESSION['usr'];
$champ = $_POST['champ'];
$date = $_POST['date'];
$env = unserialize(getValue('Preferences','ps_personnes',"codeUSR='$codeUSR'"));
$env['nav']['Contrat']['dates'][$champ] = $date;
sauverEnvironnement($env,$oDB,'Preferences');
break;}
数据库定义:
$oDB = new PDO("mysql:host=$gSERV;dbname=$gBASE;charset=utf8",$gUSER,$gPASS);
$oDB->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$oDB->setAttribute(PDO::ATTR_EMULATE_PREPARES,FALSE);
答案 0 :(得分:2)
你想要一个嵌套的回调函数,如下所示:
$.ajax({
url: 'blahblah'
}).done(function() {
$.ajax({
url: 'secondlayer'
}).done(function() {
innerstuff();
});
})
});
解释是,在第一个功能完成后(或成功完成,由您决定),您只执行第二个功能。相反,当第二个函数完全完成时,你只调用你的最终(innerstuff)函数。
答案 1 :(得分:0)
所以使用timeout()
我将javascript设置为重新加载页面,以便它等待&#34;等等。在采取行动之前:
<input type="text" value="2014-01-01" class="datepicker dateDashboard" onchange="repartiteur('DatesDashboard',$(this));setTimeout(document.location.href='index.php?menu=17|30&options=opt',500);" name="DateDebutDashboard">
因此,当页面重新加载时,db中的更改现在已完成。