我的页面上有几个开关,都使用了类psettings,它允许触发一个脚本,该脚本执行 AJAX 调用来更新MySQL数据库表中的标志。如果我点击得慢,这个功能就可以正常工作。我可以以正常速度点击所有按钮,数据库会按预期进行更新,但是取消选中,有时候不会清除DB中的标志。如果我点击得慢,在点击之间暂停一下,它工作正常。我不能阻止用户点击切换的速度有多快,但需要一种方法来确保更新的一致性,可能是延迟或刷新等。
第一个
public function maintain_privacy_settings()
{
helper(['form','url']);
if ($this->request->isAJAX())
{
$UserModel = new \App\Models\User_model();
//Determine update column name
$element_name = $this->request->getPost('element_name');
$col_name;
switch ($element_name)
{
case 'flag_display_fullname':
$col_name = 'show_fullname';
break;
case 'flag_display_smaccounts':
$col_name = 'display_sm_accounts';
break;
case 'flag_receive_fy_emails':
$col_name = 'fy_notification_emails';
break;
}
if($UserModel->set_privacy_flag($this->data['userid'],$col_name,$this->request->getPost('checked')))
{
return json_encode(['success'=> 'success', 'csrf' => csrf_hash()]);
}
else
{
return json_encode(['error' => 'error', 'csrf' => csrf_hash(), 'col_name' => $this->request->getPost('element_name') ]);
}
}
}
1条答案
按热度按时间epggiuax1#
当多个请求被发送到服务器,但它们的响应没有按顺序返回时,就会出现问题。因此,存储在服务器上的响应与存储在UI上的响应不同。
要解决这个问题,你可以使用很多技术,但最简单的是,阻止特定的UI元素,直到从服务器收到响应。为此,你可以 AJAX 调用之前禁用该元素,然后在函数成功或失败时启用它。
您还可以为每个请求分配一个序号,然后应用最高的序号并忽略其余的序号。
您还可以为请求实现一个队列,并按顺序处理它们。
编辑:
另外,你的jquery代码也有问题。你没有得到特定输入的选中状态。请尝试以下操作: