HarmonyOS鸿蒙Next中如何取消uniapp+原生html渲染富文本的系统自带文本菜单

HarmonyOS鸿蒙Next中如何取消uniapp+原生html渲染富文本的系统自带文本菜单 【问题描述】:我是使用uniapp+原生html做的。 渲染的是富文本。操作在原生html里面。怎么取消系统自带文本菜单

【问题现象】:如何取消系统自带的文本菜单如复制,全选,翻译,搜素,如图cke_4864.png

【版本信息】:未涉及

【复现代码】:未涉及

【尝试解决方案】:未涉及


更多关于HarmonyOS鸿蒙Next中如何取消uniapp+原生html渲染富文本的系统自带文本菜单的实战教程也可以访问 https://www.itying.com/category-93-b0.html

6 回复

开发者您好,

请问加载富文本使用的是否是<web-view></web-view>

可以通过CSS禁用所有元素的文本选择和长按呼出菜单,取消系统自带文本菜单,测试代码:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
		<title>富文本区域</title>
		<style type="text/css">
			/* 禁用所有元素的文本选择和长按呼出菜单 */
			* {
				-webkit-touch-callout: none;
				-webkit-user-select: none;
				user-select: none;
			}
		</style>
	</head>
	<body>
		<div id="content">
			<p>长按此文本和图片不会弹出系统菜单。</p>
		</div>
	</body>
</html>
<template>
	<view class="content">
		<view class="text-area">
			<text class="title">{{title}}</text>
		</view>
		<view>
			<web-view src="/static/local.html"></web-view>
		</view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				title: 'Hello',
				htmlContent: `
				        <div>
				          <h1>标题</h1>
				          <p>段落。</p>
				          <img src="https://example.com/image.jpg" alt="示例图片">
				          <ul>
				            <li>列表项1</li>
				            <li>列表项2</li>
				            <li>列表项3</li>
				          </ul>
				          <div>另一个 div 元素。</div>
				        </div>
				      `
			}
		},
		onLoad() {

		},
		methods: {

		}
	}
</script>

<style>
	.content {
		display: flex;
		flex-direction: column;
		align-items: center;
		justify-content: center;
	}
	
	.text-area {
		display: flex;
		justify-content: center;
	}

	.title {
		font-size: 36rpx;
		color: #8f8f94;
	}
</style>

更多关于HarmonyOS鸿蒙Next中如何取消uniapp+原生html渲染富文本的系统自带文本菜单的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


这几个我早先都试过了。-webkit-user-select: none; /* 浏览器兼容 */确实可以禁用,但是我的需求是可以选中,只是不调用系统气泡菜单。所以这几个满足不了。看是否还有其他的方案,

开发者您好,

请问您是在什么样的业务场景中使用该能力,交互流程是怎样的,在哪一个环节遇到了问题?方便说明能力不满足可能带来的影响:什么时间用到?是否高频?有无三方库可以做到?若提供该能力,是否会造成大工作量返工?请您注意提供的内容不要包含您或第三方的非公开信息,如给您带来不便,敬请谅解。

始场景:公司要求开发一款阅读器,需要长按跳出自定义菜单,不显示系统菜单。做一些相应的操作

影响:目前鸿蒙无法隐藏系统菜单。安卓可以。是高频使用能力

目前查阅资料以及插件库,没有第三方适配插件,若提供该能力并不会造成大工作量反工

在HarmonyOS Next中,取消uniapp+原生html渲染富文本的系统自带文本菜单,可通过在Web组件中设置allowCopy属性为false来禁用文本选择与复制菜单。同时,在WebConfig中配置webSetting,将textSelectiontextEditing设为false,以彻底屏蔽系统文本菜单的弹出。

在HarmonyOS Next中,要取消原生HTML渲染富文本时出现的系统自带文本菜单(如复制、全选等),核心思路是阻止文本元素的长按默认行为。

由于你使用的是UniApp+原生HTML方案,可以在Web组件(承载HTML内容)的页面中,通过注入JavaScript代码来实现。具体方法如下:

  1. 在Web组件中注入脚本:在加载HTML内容时,通过runJavaScript方法执行一段JS代码,禁用文本选择菜单。
  2. 关键JavaScript代码:这段代码会阻止文本元素(如divpspan等)的contextmenu事件(长按菜单)和selectstart事件(文本选择开始),并设置CSS属性-webkit-user-select: none来禁止文本选择。

示例代码(HarmonyOS ArkTS)

import webview from '@ohos.web.webview';

// 假设你的Web组件ID为'webView'
let webView: webview.WebviewController = ...; // 获取Web组件控制器

// 在HTML加载完成后执行
webView.on('pageEnd', () => {
  // 注入JavaScript代码
  webView.runJavaScript(`
    // 禁用文本选择
    document.body.style.webkitUserSelect = 'none';
    document.body.style.userSelect = 'none';
    
    // 阻止长按菜单
    document.addEventListener('contextmenu', function(e) {
      e.preventDefault();
    }, false);
    
    // 阻止文本选择开始
    document.addEventListener('selectstart', function(e) {
      e.preventDefault();
    }, false);
    
    // 针对富文本容器内的所有元素(确保覆盖动态内容)
    let richTextContainer = document.querySelector('.your-rich-text-class'); // 替换为你的富文本容器类名
    if (richTextContainer) {
      richTextContainer.style.webkitUserSelect = 'none';
      richTextContainer.style.userSelect = 'none';
      richTextContainer.addEventListener('contextmenu', e => e.preventDefault());
      richTextContainer.addEventListener('selectstart', e => e.preventDefault());
    }
  `);
});

注意事项

  • 将代码中的your-rich-text-class替换为你实际富文本容器的CSS类名,确保精准控制。
  • 如果富文本内容动态加载,可能需要在内容更新后重新执行上述脚本。
  • 这种方式会全局禁用文本选择功能,如果仍需部分文本可选,需调整CSS选择器和事件监听范围。

此方法通过阻止默认事件和CSS控制,能有效隐藏系统文本菜单。

回到顶部