如何在同一个onchange事件期间在两个javascript命令之间暂停

时间:2014-02-03 19:02:19

标签: javascript php jquery ajax

我有一个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);

2 个答案:

答案 0 :(得分:2)

你想要一个嵌套的回调函数,如下所示:

$.ajax({
  url: 'blahblah'
}).done(function() {
    $.ajax({
      url: 'secondlayer'
    }).done(function() {
        innerstuff();
    });
  })
});

解释是,在第一个功能完成后(或成功完成,由您决定),您只执行第二个功能。相反,当第二个函数完全完成时,你只调用你的最终(innerstuff)函数。

来源:http://api.jquery.com/jquery.ajax/

答案 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中的更改现在已完成。