首页 > 解决方案 > Javascript 检测在同一个浏览器中打开的两个表单

问题描述

现在我正在做一些 Laravel 项目。我们可以防止在浏览器中多次打开相同的表单吗?情况是这样的:

我能阻止第二个标签吗?或者使用 javascript 为关闭选项卡操作编写弹出警告消息?当用户按下关闭选项卡时,可能会在弹出警告消息上运行此代码window.close()

请帮忙。我对此一无所知。

标签: javascriptphplaravel

解决方案


我能理解你为什么需要这个,因为这是一个很常见的情况,特别是如果记录可以由不同的用户编辑,不幸的是,我担心你不能用简单的 JS 来做到这一点。相反,您应该创建一个用于存储状态的数据库表,即locked_records

重要的是要理解一个记录可能由多个用户和/或一个用户编辑,但同时使用完全不同的设备。

SQL

CREATE TABLE `locked_records` (
 `uid` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `tstamp` int(10) unsigned NOT NULL DEFAULT '0',
 `userid` int(10) unsigned NOT NULL DEFAULT '0',
 `username` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
 `record_table` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
 `record_uid` int(11) NOT NULL DEFAULT '0',
 PRIMARY KEY (`uid`),
 KEY `event` (`userid`,`tstamp`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

因此,当用户开始编辑记录时,您可以locked_records使用当前时间戳、表名、记录 uid 以及用户的 id 和名称插入一行。

接下来,当有人尝试再次对其进行编辑时,您需要检查记录是否已锁定在数据库中并显示一些警告,例如:

用户 X 于下午 12:14 开始编辑此帖

当用户 X 最终保存表单时,您只需删除锁定记录。

请注意,禁用对锁定记录的编辑可能会很棘手,即当有人打开记录并去吃晚饭时。在这种情况下,您应该通过向用户提供手动解锁记录的链接来处理它(单击它后,您只需删除锁定记录),或者只显示信息:

联系管理员并要求他解锁记录 Y

当然,您可以使用一些 AJAX 在后台检查以检查记录是否仍被锁定一段时间(类似于 StackOverflow 检查帖子和评论更新)


推荐阅读