清泛IT社区

标题: 近期 Chrome 下 Discuz 兼容问题修复记录:AJAX 提交失效与移动链接误跳转 [打印本页]

作者: App Inventor 2     时间: 3 小时前
标题: 近期 Chrome 下 Discuz 兼容问题修复记录:AJAX 提交失效与移动链接误跳转
最近排查并修复了 2 个和新版 Chrome 兼容性相关的问题,记录如下。

  一、AJAX 操作失效,表现为“加载中”一闪而过,没有后续动作
  现象:
  1. 登录、帖子分类、部分弹层提交等 AJAX 操作失效
  2. 浏览器控制台最初还伴随扩展注入报错,但关闭扩展后问题依旧存在
  3. 页面没有明确报错,但提交后没有结果

  原因:
  Discuz 旧版很多“ajaxpost”实际上是通过隐藏 iframe 提交表单,再从 iframe 返回文档中读取结果。
  这套老机制在新版 Chrome 下兼容性较差,主要包括:
  1. 旧代码依赖过时的返回读取方式,拿不到正确内容
  2. 隐藏 iframe 的空白 load 容易被误判为提交完成
  3. 原逻辑使用了 iframe.loading 作为自定义状态,和现代浏览器原生属性产生冲突
  4. inajax=1 的返回很多是 XML/CDATA 包裹内容,不能简单按 responseText 直接处理

  修复方式:
  1. 在现代浏览器下,_ajaxpost 优先改为 XMLHttpRequest + FormData 提交
  2. 保留旧 iframe 逻辑作为回退
  3. 对返回内容增加 XML/CDATA 解包处理
  4. 修正旧 iframe 空白 load 误判
  5. 去掉对 iframe.loading 的依赖,改用内部自定义状态

  结果:
  登录、帖子分类等 AJAX 表单提交已恢复正常。

  例如访问:
  forum.php?mod=viewthread&tid=2865&fromguid=hot&extra=&mobile=2

  不会正常回到对应的电脑版帖子地址,而是错误跳转到:
  misc.php?mod=mobile

  原因:
  Discuz 全局移动识别逻辑里,当请求带 mobile 参数但当前环境未识别为移动端时,旧代码直接统一跳转到 misc.php?mod=mobile。
  这个兜底对帖子页、版块页都不合理,因为它丢失了原始访问路径和参数。

  修复方式:
  调整全局移动识别入口逻辑:
  1. 当桌面环境访问 mobile=2/mobile=yes 等移动链接时
  2. 自动移除 mobile、simpletype、forcemobile 参数
  3. 回退到当前页面对应的普通版 URL
  4. 不再统一跳到 misc.php?mod=mobile

  结果:
  电脑端访问移动帖子链接时,会正确回到对应的电脑版帖子页,不再误跳转。






欢迎光临 清泛IT社区 (https://bbs.tsingfun.com/) Powered by Discuz! X3.3