我正在创建一个类似队列的页面,其中只有一个人应该能够一次编辑有关特定数据库条目的信息。
让我们说用户在页面profile.php?id=1
上 - 只有加载此页面的第一个人才能对其进行更改。
我已尝试使用JavaScript / jQuery执行此操作,但遇到了问题。
在页面加载时,我向一个PHP文件发送一个AJAX请求,该文件实际上为特定ID设置了一个表格单元格为true。然后,我使用beforeunload
事件在卸载页面时将此单元格设置为false。通过这种具体实现,存在一个问题。关闭选项卡时不会触发beforeunload
事件,或者触发该事件并且AJAX请求没有时间完成。这是一个很大的问题,因为用户可能会加载页面,看到没有任何可编辑的内容,然后关闭选项卡而不考虑它,从而无限期地锁定页面,直到我手动反转数据库中的锁定 - 我会不想强迫人们不按照他们想要的方式使用他们的浏览器。
这是我的代码:
$( document ).ready(function() {
var locked = <?=json_encode($data['in-review']);?>;
if(locked) {
$('input').attr('disabled', true);
$('#delete-model-button').attr('disabled', true);
$('#uidfield').attr('disabled', true);
$('#submitbutton').attr('disabled', true).text("This model is in review by another reviewer.");
} else {
$.ajax({
url: 'process/in-review.php',
type: 'POST',
data: {uid: $("#uidfield").val(), value: 1},
success: function (result) {
console.log("Model Locked in Review");
}
});
$(window).on('beforeunload', function() {
$.ajax({
url: 'process/in-review.php',
type: 'POST',
data: {uid: $("#uidfield").val(), value: 0},
success: function (result) {
console.log("Model Unlocked");
}
});
});
}
});
正如您所看到的,如果用户加载到已经被审查锁定的页面,则根本不会调用beforeunload进程,因为这将允许用户解锁另一个用户可能正在处理的表单。
如果用户关闭其标签页或浏览器,我该如何有效地解锁这些页面?
如果重要,请点击此处in-review.php
页面
<?php
include('db.php');
$uid = $_POST['uid'];
$value = $_POST['value'];
$db->run("UPDATE `devices` SET `in-review`=? WHERE `uid`=?", [$value, $uid]);
- 编辑:
This被评为重复问题,但我不同意这一点。那个问题特别要求&#34; 可以使用卸载事件来可靠地激活ajax请求吗?&#34; - 我已经知道答案是&#34; 是&#34;,因为那是我正在使用的方法,我也知道它确实是不完全用于关闭标签/浏览器,因此我的问题不是这是否是我想要做的可靠方法(我已经知道它不是),我要求一个不同的我可以用来做这个的方法。
答案 0 :(得分:1)
您是否尝试在synchronous
事件中调用Ajax beforeunload
?
即
$(window).on('beforeunload', function() {
$.ajax({
url: 'process/in-review.php',
type: 'POST',
async: false,
data: {uid: $("#uidfield").val(), value: 0},
success: function (result) {
console.log("Model Unlocked");
}
});
});
这里的问题是浏览器需要保持与服务器的连接,直到请求完成。 当用户单击应用程序中的其他页面时,表示与服务器的连接处于活动状态且操作可以完成,并且在浏览器/选项卡关闭时,与服务器的关闭将丢失。
这可能适用于某些情况,即您的服务器足够快以在完成浏览器关闭之前响应,即在窗口对象中销毁