一切正常,但我所做的事情有时候“重新载入”已删除的行(不是总是)。它太快还是以某种方式缓存?当我刷新页面时,我可以看到该行被删除,但是如何在列表更新之前阻止列表显示?
如果我使用load或post并将已发布的变量包含在已加载的文件中或单独的文件中,然后加载文件,仍然是同样的问题。如果我在函数中添加一个警报,那么它总是正常工作,所以这就是为什么我认为它太快了。
我还试图“取消设置”到partlist.php的链接,然后从函数中的数据库中获取它,但它仍然不会始终显示更新的版本,直到我刷新页面,这就是为什么我怀疑缓存版本
脚本:
$(".taBort").click(function(){
var r = confirm("Do you want to delete the row?");
if (r == true) {
var taBortid= $(this).val();
$.post("delete.php", {
taBortRad: "Ta bort",
taBortid: taBortid
success: function (data) {
lista();
}
});
}
});
我处理此页面所有更新的php文件:
if(isset($_POST['taBortRad'])){
$taBortid=$_POST['taBortid'];
$sql = "DELETE FROM parts WHERE id='$taBortid'";
mysqli_query($conn,$sql);
}
加载部分列表在“lista”div中的php文件的函数
function lista(edit){
$("#lista").load(partlist.php,{
edit: edit //Just a variable I use, not active here
});
}
答案 0 :(得分:0)
我不明白,delete.php正在删除行和partList.php正在做什么? 我认为你必须以这种方式使用一个promise,一个延迟对象,并且在php中你必须使用一个有区别的OK KO,如果删除正常或KO ... javascript但我没有测试下的代码但是如果我明白这个问题的方法,测试行是否被删除你也可以使用mysqli_affected_rows()如果1,否则KO:
$(".taBort").click(function(){
var r = confirm("Do you want to delete the row?");
if (r == true) {
var taBortid= $(this).val();
$.when(deleteRow(taBortid)).then(function(controllo){
if (controllo == 'OK'){
lista();
}
if(controllo == 'KO'){
alert('Error in delete row');
}
});
}
});
function deleteRow(taBortid){
return $.ajax({
type:'POST',
url : 'delete.php',
data : { taBortRad: "Ta bort",
taBortid: taBortid}
dataType : 'html',
}).then(function(answer){
if (answer == 'OK'){
controllo = 'OK';
}else{
controllo = 'KO';
}
return controllo;
}).fail(function(){
alert('Error of comunication');
});
}
PHP delete.php
if(isset($_POST['taBortRad'])){
$taBortid=$_POST['taBortid'];
$conn = new mysqli('YOUR CONNECTION PARAMS');
$sql = $conn->prepare("DELETE FROM parts WHERE id= ?");
$sql->bind_param('i', $taBortid);
if ($sql->execute()){
print 'OK';
}
else{
print 'KO';
}
}
更新,抱歉我的英文: Hy Fredrik,我认为你的问题只是延迟,同步或异步,我试着从你的问题开始解释你:"但是如何在列表更新之前阻止列表显示?" 你的代码有一个正确的想法,但错误的语法我解释了为什么,你要删除一行,然后删除行重新加载表,我想因为我没有看到partList.php,一个新的选择和模板按钮,这个选择和模板在文件partList.php是不是? 因此,在第一次执行delete.php中的所有代码时,只有在完成解析才能执行delete.php文件后,执行partList.php ...是不是?但是你的代码没有这样做。 好吧,你没有考虑的是第一点解析javascript的执行时间和php解析的执行时间,当你写$ .post ...成功..你正在做一个ajax调用但是当javascript解析输入时在电话会议的成功??? 不是当所有的PHP代码都执行但只是在php delete.php的第一行...所以当php的解析运行文件delete.php的第一行同时javascript解析调用lista ()函数,为了理解我们,javascript解析是在调用lista()函数之前,php解析正在执行连接并执行delete.php中的所有代码。因为在你的代码中没有任何内容对javascript解析WAIT,直到我说你执行partList.php,你需要deferred,或async:false,但是因为我们必须使用延迟对象,所以不推荐使用async false。 我的代码说的是(但我的代码也存在不完善之处)
$.when(deleteRow(taBortid)).then(function(controllo){...
构造when->然后说什么时候执行promise deletedRow并且函数回调是在做了什么之后返回CONTROLLO,在这种情况下,promise是OK KO(或者更好的是promise是deleteRow而函数controllo是回调,但尝试用这种方式用简单的单词理解...嘿javascript我保证你好或KO;)),但是当javascript代码收到OK或KO?之后解析php已执行所有代码才能打印OK或者打印KO ......实际上在我的代码中存在一个不完美的原因,因为
if($sql->execute) print OK
如果删除查询不顺利,也会一直执行,例如没有删除行,这样会更好
if($sql->execute){
$numbersRowDeleted = $sql->affected_rows;
if($numbersRowDeleted >0){
print 'OK';//ROW IS DELETED
}
else{
print 'NODELETED';//BUT THIS NODELETD MUST BE MANAGED ALSO IN THE JAVASCRIPT FUNCTION AND AFTER IN THE THEN if (answer == 'NODELETED'){controllo no deleted etc...}
}
}
你也可以写
$.when(call1(),call2()...).then(function(controllo1,controllo2...){})
构造when->然后已经过时的同步和异步调用,写两个调用1和2所有两个调用将在异步执行但是将被管理答案/承诺因此不再需要同步,因为javascript解析将等待答案,例如调用1回答DOTHIS并在执行javascript脚本后调用2个答案DOTHIS2,或者调用1回答DOANOTHERTHING并调用2个答案DOANOTHERTHING2然后javascript执行您想要的另一个代码但是调用1中的所有两个php文件和2是异步的。 延期对象非常重要.... 试试我的代码....再见 我希望这可以解释一些问题,但我试图快速解释,而不是以精确的方式解释,例如使用.resolve()方法或promise()方法......也可以在这里看一下,也许他比我更好解释......: )
http://michaelsoriano.com/working-with-jquerys-ajax-promises-and-deferred-objects/