Как проверить, достаточно ли велико поле ввода для отображения полного содержимого?

Я использую компонент текстового поля Vuetify внутри таблицы с множеством столбцов. Возможно, этот компонент содержит слишком много содержимого для отображения, и с точки зрения UX проверка содержимого путем прокрутки внутри поля, если ячеек много, занимает слишком много времени.

Простой пример HTML

Пример Vuetify

Моя первая идея (пожалуйста, дайте мне знать, если вы знаете лучшие) заключалась в том, чтобы отобразить всплывающую подсказку, показывающую полное содержимое, но это было бы раздражающим, если компонент может отображать полное содержимое. Поэтому я хочу отображать всплывающую подсказку только в том случае, если содержимое будет скрыто/отрезано.

Итак, есть ли способ узнать, отображает ли компонент полное содержимое или что-то скрыто/отрезано? (Производительность таблицы важна, поэтому я не знаю, стоят ли того очень сложные расчеты изменений значений)

Я пытался

( Детская площадка )

<script setup>
  import { ref, watch } from 'vue'

  const field = ref()
  const msg = ref(
    'Hello World! too much content in this text field component to display.'
  )
  const isCuttingOff = ref(false)

  watch(
    msg,
    () => {
      const inputWidth = field.value?.clientWidth
      const inputValueWidth = msg.value.length // !!! measure the input value here !!!

      console.info({ inputWidth, inputValueWidth })

      isCuttingOff.value = inputWidth < inputValueWidth
    },
    { immediate: true }
  )
</script>

<template>
  <v-app>
    <div class = "text-h3">Is cutting off: {{ isCuttingOff }}</div>
    <v-container class = "w-25">
      <v-text-field ref = "field" label = "fsfdsf" v-model = "msg" />
    </v-container>
  </v-app>
</template>

но

  • при запуске переменная inputWidth не определена
  • Я не знаю, как вычислить переменную inputValueWidth
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
81
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Мне удалось сравнить текстовое поле clientWidth с его scrollWidth, изменив код, как показано ниже.

1- Избавился от field ref.

2- Дал v-text-field идентификатор

3- добавил функцию check и вызвал ее в функции обратного вызова watch

4- внутри check я проверил ввод clientWidth и scrollWidth

5- Чтобы запустить его при начальной загрузке, я назначил пустую строку msg и изменил ее на исходную строку в нижней части скрипта.

Проверьте это здесь

<script setup>
  import { ref, watch } from 'vue'

  const msg = ref("")

  const isCuttingOff = ref(false)

  function check() {
    const elm = document.querySelector('#txt')
    isCuttingOff.value = elm.clientWidth < elm.scrollWidth;
    // todo : custom tooltip or any other solution for long texts
  }

  watch(
    msg,
    (currentMsg, oldMessage, callback) => {
      callback(check)
    },
    { immediate: true }
  )

  msg.value =
    'Hello World! too much content in this text cfield component to display.'
</script>
<script></script>
<template>
  <v-app>
    <div class = "text-h3">Is cutting off: {{ isCuttingOff }}</div>
    <v-container class = "w-25">
      <v-text-field id = "txt" v-model = "msg" />
    </v-container>
  </v-app>
</template>


@baitendbidz обновил мой ответ. Я думаю, что это решает проблему сейчас.

mohsen dorparasti 06.06.2023 16:20

Вам просто нужен атрибут title и немного css

Использование css для отображения переполнения текста, такого как .... (многоточие), а атрибут title используется для отображения полного содержимого при наведении, как всплывающее окно.

<script setup>
import { ref } from 'vue'

const msg = ref('Hello World! too much content in this text field component to display')
</script>

<template>
  <h1 :title=msg>{{ msg }}</h1>
  <input v-model = "msg">
</template>

<style>
  h1{
    max-width: 15rem;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }
</style>

Я попробовал ваш фрагмент на игровой площадке play.vuejs.org/#eNpFkLtug0AQRX/lhoakIBZFGoItpcsfpKFB7JBdaV/…, но, похоже, он не работает :(

baitendbidz 06.06.2023 08:34

Я изменил код, теперь смотрите @baitendbidz

Yuvaraj M 06.06.2023 12:04

Другие вопросы по теме