uni-app 【报Bug】editor只读状态怎么给选中文本加背景色,:read-only="isRead"

发布于 1周前 作者 zlyuanteng 来自 Uni-App

uni-app 【报Bug】editor只读状态怎么给选中文本加背景色,:read-only=“isRead”

类别 信息
产品分类 uniapp/App
PC开发环境 Windows
PC开发环境版本 win10
HBuilderX类型 正式
HBuilderX版本 3.6.4
手机系统 Android
手机系统版本 Android 15
手机厂商 华为
手机机型 nova7
页面类型 vue
vue版本 vue2
打包方式 云端
项目创建方式 HBuilderX

操作步骤:

// 获取选中文字  
getSelectionText(cb) {  
    this.editorCtx.getSelectionText({  
        success: (res) => {  
            console.log('getSelectionText --> res',res);  
            console.log(res.text, '获取到的文字');  
            if (res.text == '') {  
                return uni.$u.toast('请选择高亮文字');  
            }  
            this.flag = false;  
            let timer = setTimeout(() => {  
                this.flag = true;  
                cb && cb(res)  
                clearTimeout(timer)  
                timer = null  

            }, 200);  
        },   
        fail() {  
            console.log('getSelectionText fail');  
        },  
        complete() {  
            // uni.showKeyboard(); //隐藏软键盘    
        }  
    });  
},  
//设置高亮  
handleHightLight() {  
    var that = this  
    console.log('this.isHightLightSelect', this.isHightLightSelect);  
    const ctx = this.editorCtx  
    this.getSelectionText(() => {  
        ctx.format('backgroundColor', '#FFD86A');  
        ctx.format('color', '#282A37');  
    })  
},

预期结果:

选中文本加背景色,软键盘不会闪现

实际结果:

选中文本加背景色,软键盘会闪现

bug描述:

editor只读状态怎么给选中文本加背景色,:read-only=“isRead” ,

this.isRead = false    
editorContext.format('backgroundColor', '#FF0000')  
this.isRead = true

这样先是编辑模式,然后改了颜色再设为只读模式,键盘会闪现


1 回复

uni-app 中,对于 editor 组件来说,实现只读状态下给选中文本加背景色的功能确实是一个挑战,因为 editor 组件在只读状态下通常不支持直接修改文本样式。不过,我们可以借助一些变通的方法来实现类似的效果。

一种可能的解决方案是,不直接使用 editor 组件的只读模式,而是使用 rich-text 组件来显示内容,并结合一个自定义的覆盖层来实现选中文本高亮显示的效果。以下是一个简化的示例代码,展示了如何实现这一思路:

  1. HTML结构 (使用 rich-text 和一个覆盖层):
<template>
  <view class="container">
    <rich-text :nodes="content"></rich-text>
    <view class="highlight-layer" :style="highlightStyle"></view>
  </view>
</template>
  1. JavaScript逻辑 (处理文本选择和高亮显示):
<script>
export default {
  data() {
    return {
      content: [
        {
          name: 'p',
          children: [
            {
              type: 'text',
              text: '这是一段示例文本,用于演示高亮功能。'
            }
          ]
        }
      ],
      highlightStyle: {
        position: 'absolute',
        backgroundColor: 'yellow',
        opacity: 0.5, // 可调整透明度
        left: 0,
        top: 0,
        width: 0,
        height: 0
      },
      selectedText: ''
    };
  },
  methods: {
    // 模拟文本选择事件(实际应用中需要监听用户的选择行为)
    simulateTextSelect(startIndex, endIndex) {
      const text = this.content[0].children[0].text;
      this.selectedText = text.substring(startIndex, endIndex);
      const range = this.getTextRange(text, this.selectedText);
      this.highlightStyle = {
        ...this.highlightStyle,
        left: `${range.left}px`,
        top: `${range.top}px`,
        width: `${range.width}px`,
        height: `${range.height}px`
      };
    },
    getTextRange(text, selectedText) {
      // 这是一个简化的示例,实际中需要根据字体大小、行高等计算精确位置
      const fontSize = 16; // 假设字体大小为16px
      const charWidth = 8; // 假设每个字符平均宽度为8px(实际中可能需要根据字体调整)
      const selectedLength = selectedText.length;
      return {
        left: selectedLength * charWidth, // 简化处理,仅作为示例
        top: 0, // 简化处理,仅作为示例
        width: selectedLength * charWidth,
        height: fontSize
      };
    }
  },
  mounted() {
    // 模拟选择文本"示例文本"
    this.simulateTextSelect(3, 7);
  }
};
</script>
  1. CSS样式
<style>
.container {
  position: relative;
}
.highlight-layer {
  position: absolute;
  pointer-events: none; /* 确保覆盖层不影响用户交互 */
}
</style>

请注意,上述代码仅作为演示用途,实际应用中需要根据具体的文本布局和样式来调整高亮层的位置和大小。此外,由于 uni-app 的跨平台特性,不同平台上文本渲染可能会有所不同,因此可能需要针对不同平台进行微调。

回到顶部