图片能双指缩放,却不能左右翻页,不一定是“两个插件天生不能共存”。应先确认引入的是哪一套实现,再看它们如何分配单指拖动、双指缩放和事件取消。

2019 年项目里,两种手势只剩一种可用

当时 H5 已用 Swipe 做轮播,增加 PinchZoom 后,缩放正常,左右滑动失效。第一组接入方式是加载 pinch-zoom.umd.js,再用这个入口初始化:

Array.from(document.querySelectorAll(".pinch-zoom"))
  .forEach(function (element) {
    new PinchZoom.default(element, {});
  });

window.mySwipe = new Swipe(
  document.querySelector("#slider"),
  { speed: 400 }
);

后来找到一个两种手势都可用的页面,对比后发现它加载的是另一份 pinchzoom.js,使用的入口也不同:

$(function () {
  $("div.pinch-zoom").each(function () {
    new RTP.PinchZoom($(this), {});
  });

  window.mySwipe = new Swipe(
    document.getElementById("slider"),
    { speed: 400 }
  );
});

以上仅保留历史接口对照,依赖和 DOM 由各自页面提供,不是可直接运行的完整页面。第二份脚本使用 jQuery 风格入口,不能据此说所有同名 PinchZoom 实现都依赖 jQuery;default 导出与 RTP.PinchZoom 也不是只换文件名就能互换。

当时替换后获得了预期交互,但没有固定到依赖提交及完整事件证据,因此不能进一步认定某个官方 demo 有缺陷,或把某一行代码断言为唯一根因。

先把冲突缩小到可观察的手势

固定依赖仓库、版本、打包方式和许可,再做三种页面对照:只有轮播、只有缩放、两者组合。检查元素结构、加载顺序及是否重复初始化。

组合页面应分别观察:

  • 图片未放大时,单指是否应交给轮播。
  • 图片放大后,单指是否应移动图片而不是换页。
  • 双指缩放期间,轮播是否暂停响应。
  • 手指离开、缩回原比例后,交互是否恢复。
  • 子节点替换或页面销毁后,监听器是否被清理。

这里是在定义排查条件,不保证历史脚本天然支持全部行为。

事件取消要与监听配置一起看

某个监听器调用 preventDefault、阻止传播或提前认领触摸,都可能影响外层轮播;具体应记录事件目标、触点数量和监听器所在节点,不能靠全局禁用默认行为试错。

DOM 标准 说明 preventDefault 与事件可取消性、passive 监听条件有关;它与停止冒泡不是同一动作。相关区别也见 移动端默认行为与事件传播。

不要继续从未知预览页复制脚本充当依赖来源。先解决可追溯性,再在目标浏览器真机核对缩放、拖动与翻页,而不是把“替换后能动了”当成兼容性保证。