uni-app h5页面浏览器运行问题:当一个页面滚动后点击事件调用uni.setclipboarddata,提示内容已复制但会回到页面顶部

uni-app h5页面浏览器运行问题:当一个页面滚动后点击事件调用uni.setclipboarddata,提示内容已复制但会回到页面顶部

信息类别 详细信息
产品分类 uniapp/H5
PC开发环境 Mac
操作系统版本 macOS 12.3.1
HBuilderX类型 正式
HBuilderX版本 3.4.8
浏览器平台 手机系统浏览器
浏览器版本 Safari
项目创建方式 HBuilderX

操作步骤:

  • 当一个页面滚动后,点击事件调用uni.setclipboarddata后,提示内容已经复制,并且会回到页面顶部

预期结果:

  • 当一个页面滚动后,点击事件调用uni.setclipboarddata后,提示内容已经复制,不会回到页面顶部

实际结果:

  • 当一个页面滚动后,点击事件调用uni.setclipboarddata后,提示内容已经复制,并且会回到页面顶部

bug描述:

  • uniapp h5页面在浏览器中运行,当一个页面滚动后,点击事件调用uni.setclipboarddata后,提示内容已经复制,并且会回到页面顶部
11 回复

代码贴一下看看


copy(orderNumber) { uni.setClipboardData({ data: orderNumber, success: () => { Toast.show(‘已复制到剪切板’); } }); },

你的 页面滚动是 scroll 还是页面 滚动

同样的问题,页面滚动,不是scroll组件。

遇到了同样的问题,请问解决了吗

我也遇到了这个问题,有什么办法能在调用uni.setclipboarddata后,留在当前位置,不回到页面顶部吗?

回复楼上的,没有解决,去掉该功能了

解决方案:在H5中使用其他包,以vue-clipboard2为例,vue2项目
main.js 中引入:
// #ifdef H5 import VueClipboard from ‘vue-clipboard2’ Vue.use(VueClipboard) // #endif
使用:
// #ifdef H5 this.$copyText(data).then(()=>{ console.log(‘复制成功’) },()=>{ console.log(‘复制失败’) }) // #endif

在 uni-app 的 H5 页面中,当你滚动页面后调用 uni.setClipboardData 方法时,页面可能会回到顶部。这是因为 uni.setClipboardData 方法在 H5 环境中可能会触发页面的重新渲染或焦点变化,导致页面滚动位置丢失。

解决方案

  1. 保存滚动位置并恢复: 在调用 uni.setClipboardData 之前,保存当前的滚动位置,然后在复制操作完成后恢复滚动位置。

    export default {
      methods: {
        async copyText(text) {
          // 保存当前滚动位置
          const scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
    
          // 调用复制方法
          await uni.setClipboardData({
            data: text,
            success: () => {
              uni.showToast({
                title: '内容已复制',
                icon: 'none'
              });
            }
          });
    
          // 恢复滚动位置
          document.documentElement.scrollTop = document.body.scrollTop = scrollTop;
        }
      }
    }
  2. 使用 position: fixedposition: sticky: 如果你在页面中有固定定位的元素,确保它们不会影响页面的滚动行为。

  3. 避免使用 uni.setClipboardData: 如果可能,考虑使用原生的 JavaScript 方法来实现复制功能,这样可以避免 uni.setClipboardData 带来的问题。

    export default {
      methods: {
        copyText(text) {
          const textarea = document.createElement('textarea');
          textarea.value = text;
          document.body.appendChild(textarea);
          textarea.select();
          document.execCommand('copy');
          document.body.removeChild(textarea);
          uni.showToast({
            title: '内容已复制',
            icon: 'none'
          });
        }
      }
    }
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!