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后,提示内容已经复制,并且会回到页面顶部
代码贴一下看看
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 环境中可能会触发页面的重新渲染或焦点变化,导致页面滚动位置丢失。
解决方案
-
保存滚动位置并恢复: 在调用
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; } } }
-
使用
position: fixed
或position: sticky
: 如果你在页面中有固定定位的元素,确保它们不会影响页面的滚动行为。 -
避免使用
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' }); } } }