【问题标题】:Accessing form via browser back button is not triggering "Confirm form resubmit"通过浏览器后退按钮访问表单不会触发“确认表单重新提交”
【发布时间】:2016-08-18 13:26:20
【问题描述】:

我有一个由 MediaWiki 提供支持的公司 Wiki。我编写了代码来添加页面锁定功能,这样当用户编辑页面时,他们会在页面上获得 15 分钟的锁定时间,他们可以在过期之前随时更新。

如果用户编辑一个页面,然后点击保存,然后点击浏览器的后退按钮返回到编辑表单,一切看起来都很正常,用户认为一切正常,但这里有一个问题:它不会创建页面上的新锁。告诉用户在页面上有锁的消息,但我认为这只是因为它是页面的缓存版本;消息中的过期时间是锁定从他们第一次编辑时开始的过期时间,不是使用后退按钮。

我尝试将 HTML meta 标签添加到 head 标签内的页面,以使缓存无效/不缓存编辑页面,但这不起作用,因为 MediaWiki PHP 页面生成器会覆盖它。

现在我有一个非常草率的修复;我使用 JavaScript 来模拟按下浏览器前进按钮,例如在编辑页面上向前推进历史。如果不存在较新的历史记录项(例如,他们单击了实际的“编辑”按钮而不是使用浏览器的后退按钮)它什么也不做,但如果他们通过后退按钮访问编辑页面,它会简要显示页面大约一秒钟,直到 JavaScript 加载,然后在历史记录中向前重定向(在点击后退按钮之前将它们放回原处)。是的,这可行,但在我看来,这是一个非常糟糕的解决方案,因为它不是非常无缝/用户友好,并且可能会使用户感到困惑或让他们认为他们的浏览器有问题。

更好的解决方案是强制用户重新提交表单,从而打开编辑页面的“新”版本,我实际上不确定为什么它还没有这样做。我的意思是,当用户通过浏览器后退按钮访问编辑页面时,我希望它显示“确认表单重新提交”错误页面。以谷歌浏览器为例:

我认为这将通过强制重新提交表单来解决问题,我相信这会创建一个实际页面锁定。如果我错了,请纠正我。

我不认为很多页面锁定代码非常相关,因为问题的原因只是后退按钮将它们带到页面的缓存版本而不是“新鲜”版本,但如果如果您不这么认为,请随时提出要求。只要让我知道要发布的代码部分,我会添加它们。

【问题讨论】:

  • 发布后,对同一页面使用重定向。
  • 嗯。什么?你能澄清一下你的意思吗?

标签: javascript php html forms mediawiki


【解决方案1】:

找到一些可以为您提供 OuputPage 的钩子(我对它们不太熟悉,但可能是 OutputPageBeforeHTML?)并在编辑页面上调用 OuputPage::enableClientCache(false)

【讨论】:

    【解决方案2】:

    我认为@devpro 评论与您的​​问题有关,但其含义应该颠倒过来。 Mediawiki已经具有防止用户在稍后单击“刷新”或“返回”按钮时看到“重新提交”警告的机制 - 提交表单后,它会将用户(通过 302 重定向)重定向到之前的页面编辑。

    这样,如果用户决定在编辑后立即刷新页面或者如果他发布了表单,然后导航到另一个页面并按下“返回”按钮 - 他将不会再次重新提交表单。

    几乎不可能改变这种行为(它深深地埋藏在 Mediawiki 核心中),但是,如果可能的话 - 你不应该这样做,直到你想让你的编辑完全糊涂。

    后端没有解决方案,因为表单页面是从浏览器缓存中加载的,但是您仍然可以使用 js 来防止这种情况,Mediawiki JS 接口可以帮助解决这个问题:

    创建将 JS 脚本添加到“查看”操作的扩展,使其跟踪变量 wgPostEdit (see more),该变量仅在页面保存后才会填充。设置此变量后 - 使用 this trick 在用户尝试返回时显示警告。

    【讨论】:

      猜你喜欢
      • 2015-07-01
      • 2023-03-07
      • 2016-06-10
      • 2012-11-08
      • 1970-01-01
      • 1970-01-01
      • 2016-12-25
      • 2014-11-09
      • 2013-08-11
      相关资源
      最近更新 更多