当前位置:首页 > VUE

vue实现文本选取

2026-01-16 18:42:23VUE

文本选取的基本实现

使用Vue实现文本选取功能可以通过结合原生JavaScript的Selection API完成。以下是一个基础示例,通过指令或方法监听文本选择事件:

<template>
  <div @mouseup="handleTextSelection" ref="selectableText">
    {{ content }}
  </div>
  <p>已选文本: {{ selectedText }}</p>
</template>

<script>
export default {
  data() {
    return {
      content: '这是一段可供选择的示例文本...',
      selectedText: ''
    }
  },
  methods: {
    handleTextSelection() {
      const selection = window.getSelection();
      this.selectedText = selection.toString().trim();
    }
  }
}
</script>

自定义指令实现

创建自定义指令v-select可以复用文本选择逻辑:

Vue.directive('select', {
  bind(el, binding) {
    el.addEventListener('mouseup', () => {
      const selection = window.getSelection();
      const selectedText = selection.toString().trim();
      if (selectedText) {
        binding.value(selectedText);
      }
    });
  }
});

使用方式:

<div v-select="handleSelectedText">{{ content }}</div>

高亮选中文本

通过Range API实现选中文本的高亮显示:

vue实现文本选取

methods: {
  highlightSelection() {
    const selection = window.getSelection();
    if (!selection.rangeCount) return;

    const range = selection.getRangeAt(0);
    const span = document.createElement('span');
    span.className = 'highlight';
    range.surroundContents(span);
    selection.removeAllRanges();
  }
}

CSS样式:

.highlight {
  background-color: yellow;
  color: black;
}

跨浏览器兼容处理

不同浏览器对Selection API的实现存在差异,需要做兼容处理:

vue实现文本选取

getSelectedText() {
  if (window.getSelection) {
    return window.getSelection().toString();
  } else if (document.selection) {
    return document.selection.createRange().text;
  }
  return '';
}

文本选择事件扩展

添加防抖和选择边界检测:

handleTextSelection: _.debounce(function() {
  const selection = window.getSelection();
  if (!selection.isCollapsed) {
    const range = selection.getRangeAt(0);
    if (this.$refs.selectableText.contains(range.commonAncestorContainer)) {
      this.selectedText = selection.toString();
    }
  }
}, 300)

服务端交互示例

将选中文本发送至后端:

methods: {
  async sendSelectionToServer() {
    const text = this.getSelectedText();
    if (!text) return;

    try {
      await axios.post('/api/selected-text', { text });
      this.$toast.success('文本已保存');
    } catch (error) {
      console.error(error);
    }
  }
}

移动端触摸支持

针对移动设备添加touch事件支持:

mounted() {
  this.$refs.selectableText.addEventListener('touchend', this.handleTouchSelection);
},
methods: {
  handleTouchSelection() {
    setTimeout(() => {
      const selection = window.getSelection();
      this.selectedText = selection.toString();
    }, 100);
  }
}

标签: 文本vue
分享给朋友:

相关文章

vue实现全局遮罩层

vue实现全局遮罩层

实现全局遮罩层的方法 在Vue中实现全局遮罩层可以通过多种方式完成,以下是几种常见的实现方法: 使用Vue组件创建遮罩层 创建一个遮罩层组件,通过全局注册或动态挂载的方式实现全局调用。以下是一个简单…

vue实现标题

vue实现标题

Vue 实现标题的方法 在Vue中实现标题可以通过多种方式,以下是几种常见的方法: 方法一:使用模板语法 在Vue组件的模板中直接使用HTML的<h1>到<h6>标签来定义…

vue 实现脚本

vue 实现脚本

Vue 实现脚本的方法 Vue.js 提供了多种方式来实现脚本功能,包括组件内脚本、混入(Mixins)、插件(Plugins)以及自定义指令等。以下是常见的实现方式: 组件内脚本 在 Vue 单文…

vue mvvm实现

vue mvvm实现

Vue MVVM 实现原理 Vue.js 是一个基于 MVVM(Model-View-ViewModel)模式的框架,其核心是通过数据绑定和响应式系统实现视图与数据的自动同步。以下是 Vue 实现 M…

vue实现Pop

vue实现Pop

Vue 实现 Popover 组件的方法 使用 Vue 内置指令 v-show/v-if 和事件监听 通过 Vue 的指令和事件绑定实现基础的 Popover 功能。定义一个布尔值控制 Popover…

vue实现watch

vue实现watch

监听数据变化 在Vue中,watch用于监听响应式数据的变化并执行回调函数。基本语法如下: watch: { propertyName(newValue, oldValue) { //…