Javascript检测在同一浏览器中打开的两种形式

问题描述

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

  • 假设我打开表单调用“数据表单1”。此页面仍处于打开状态
  • 然后,当我打开另一个标签并再次打开相同的表格“数据表格1”

我是否可以防止第二个标签出现?还是使用JavaScript为关闭标签页操作写弹出警告消息?也许在用户按下关闭选项卡的弹出警告消息上将运行此代码window.close()

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

解决方法

尽管我不明白你为什么需要这个。

但是,如果您要使两个标签都同步,则有两个选择:

1- 不是一个好的选择:在客户端编写一个js脚本,以一定间隔从服务器中提取/获取更新的数据。

2- 更好的选项:使用推送服务,因此,如果有任何数据更改,服务器会将更新后的数据推送到所有打开的频道。这种方式有点棘手且难以实现,因为您必须处理很多事情以确保将更新的数据推送到正确的令牌ID。

如果要防止打开相同的选项卡。您必须编写js脚本,因此在打开选项卡时,它询问服务器是否可以打开,然后每3秒ping服务器一次以锁定页面5秒钟。因此,如果第二个选项卡尝试并询问服务器是否可以,则服务器拒绝该请求,您可以使用javascript关闭该选项卡。如果用户关闭第一个标签,则最多5秒后,用户可以打开另一个标签并从服务器获取数据。

,

我可以理解为什么您需要这样做,因为这是一个很常见的情况,特别是如果记录可以由不同的用户编辑,那么不幸的是,恐怕您无法使用简单的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和名称。

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

用户X从12:14 PM开始编辑此帖子

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

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

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

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...