Кросс-браузер: различное поведение для отключенных полей ввода (текст может / не может быть скопирован)

У меня есть поле ввода HTML, который отключен. В некоторых браузерах (Chrome, Edge, Internet Explorer и Opera) можно выделять и копировать текст, но, по крайней мере, в Firefox это невозможно.

Вы можете проверить это, выполнив следующий код в разных браузерах:

<input type="text" disabled value="is disable">
<input type="text" readonly value="is readonly">

Я читал здесь, что отключенные поля могут быть в фокусе, здесь, что отключенный элемент ввода является непригодным и недоступным для клика, и здесь, чтополе ввода только для чтения не может быть изменено (однако, пользователь может вкладывать его, выделять его и скопируйте текст из него).

Я не нашел ничего говорящего о том, что текст с отключенных входов не может быть скопирован.

Существует стандартное поведение, и некоторые браузеры не соблюдают его, или браузеры могут выбирать, можно ли скопировать текст с отключенного ввода?

И есть ли решение для копирования во всех браузерах текста из отключенного поля ввода?

Примечание. Мое приложение реализовано с использованием языков Angular/TypeScript.


Похоже, что единственный браузер, который имеет отличное поведение, это Firefox. Я открыл здесь проблему, пытаясь понять, если это вариант дизайна или если это ошибка. Я жду сейчас ответа.

3 ответа

Решение

Измените свое поле с disabled в readonly, Это правильный атрибут для поведения, которое вы хотите.

Не тратьте время на совместное решение javascript, так как оно будет еще более странным, чем незначительные различия в поведении браузера.

Если проблема заключается в том, что вы хотите, чтобы ваши поля только для чтения выглядели как отключенные поля, то довольно легко стилизовать ввод с помощью readonly набор атрибутов. Вам не нужно менять поведение, чтобы изменить внешний вид.

input[readonly] {
  background: #EEE;
  color: #666;
  border: solid 1px #CCC;
}
<input readonly value="I am readonly">

Я пытался использовать user-select во входе, но это не может помешать выделению текста к нему. Даже обернуть div с user-select: none стиль до сих пор не работает. Это работает только для (я думаю) нефокусируемого элемента, такого как div, span и т. Д.

Тем не менее, сейчас я думаю, user-select: none это единственный лучший вариант, если вы хотите убедиться, что пользователь не будет копировать текст со страницы даже во многих различных браузерах (проверьте совместимость выбранных пользователем браузеров). Поэтому я бы предложил создать компонент, который выглядит примерно так:

<input  *ngIf="!isDisabled" value="model" />
<div *ngIf="isDisabled" style="user-select: none">{{model}}</div>

Будьте осторожны div чтобы больше походить на отключенный ввод.

В этом нет ничего плохого, когда вы отключаете элемент управления формы.

<input type="text" disabled readonly value="is disable">

или же

<input type="text" disabled="disabled" readonly="readonly" value="is disable">

Однако это может не привести к согласованному поведению, так как оно относится к копированию текста (после его выбора).

Несовершенный путь JavaScript:

Я не использовал select введите событие через некоторое время, но я предлагаю переключить возможность выбора текста. Вы также можете поиграть с focus а также blur События.

Внешняя таблица стилей CSS:

.preventSelection {user-select: none}  // IE 10+

W3Schools: выбор пользователя:

Быстрый и грязный обработчик событий:

function preventDisabledControlTextCopy(e)
{
    // blah, blah, blah

    if (e.target.disabled === true) {
        // Add "preventSelection" to e.target.className
        // Alternatively, change the focus to somewhere else!
    } else {
        // Remove "preventSelection" from e.target.className
    }
}

// Blah, blah, blah-blah blah

textBox.addEventListener("select", preventDisabledControlTextCopy, false);

Поиск вариантов никогда не является пустой тратой времени. Я пропустил много деталей, но я сделал важную часть явной (так как Stackru - это инструмент, который люди используют для изучения вещей). Реализация зависит от вас.

Последние мысли:

Лучшим ответом может быть использование CSS и JavaScript и переключение visibility: hidden (IE 4+) или display: none (IE 8+), в зависимости от вашего сценария, структуры DOM и сложности, которой вы можете управлять.

Динамические формы - отличный способ почувствовать взаимодействие между HTML, CSS и JavaScript.

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