Программный выбор текста в поле ввода на устройствах iOS (мобильный Safari)

87

Как программно выделить текст поля ввода на устройствах iOS, например iPhone, iPad с мобильным Safari?

Обычно достаточно вызвать .select()функцию для <input ... />элемента, но на этих устройствах это не работает. Курсор просто остается в конце существующей записи без выбора.

Sroebuck
источник
10
Я не вижу причин, по которым использование сенсорного устройства меняет актуальность предварительного выбора текста. То, что вы сказали о сенсорном устройстве, в равной степени можно сказать и о несенсорном устройстве. Я хочу предварительно выделить текст, когда пользователь решает коснуться элемента для его редактирования. В большинстве случаев пользователь, вероятно, захочет заменить существующее содержимое, и в этом случае он сможет сделать это без дальнейшего касания и перетаскивания. В других случаях, когда они хотят отредактировать существующий контент, они смогут отменить выбор или изменить выделение.
sroebuck
2
К сожалению .focus (). Select () не работает.
sroebuck
2
Я назначаю награду по этому поводу. Моя цель - упростить для пользователей нажатие на мое текстовое поле и нажатие «Копировать», чтобы скопировать текст в буфер обмена.
Дэн Фабулич
То же самое ... кажется, что в Mobile Safari не работает много методов .select () и .focus () - два из них.
@sroebuck хороший ответ для Дэвида В. Кейта! пальцы вверх!
эюрдакул

Ответы:

95
input.setSelectionRange(0, 9999);

https://developer.mozilla.org/en/DOM/Input.select

Jobwat
источник
3
Это сработало для меня, но пришлось включать остановку мыши на тех же входах.
DuStorm
8
У меня это не сработало ни на iPad, ни на iPhone,
Дуг,
4
Это сработало для меня только в том случае, если я активировал .focus()ввод перед вызовом input.setSelectionRange. Если вы слушаете focusсобытие на входе, не забудьте учесть бесконечный цикл.
allieferr
10
Стоит упомянуть о проблеме: это не будет работать с текстовыми полями, если для них установлен readonlyатрибут.
JayPea
5
Я потратил больше часа, играя с различными решениями. Вызов setSelectionRange()в focusобработчике работает , когда вы вызываете .focus()программны, но если вы вручную нажмите на ввод текста на прошивке, выбор не бывает. Достаточно сказать, что все, что вам нужно сделать, это вызвать setSelectionRange()в течение setTimeout, равного 0, и он будет работать, как ожидалось, независимо от того, что вызывает фокус.
30

У меня ничего в этой ветке не работает, вот что работает на моем iPad:

// t is the input field
setTimeout(function() {
    t.setSelectionRange(0, 9999);
}, 1);
nkrop
источник
это чертовски трюк! Спасибо! работает с событием 'click'
saike
Большое спасибо!!
Вацлав Кусак
26

Трудно доказать отрицательный результат, но мои исследования показывают, что это ошибка Mobile Safari.

Обратите внимание, что focus () более или менее работает - хотя для успешного выполнения может потребоваться более одного нажатия, и в этом нет необходимости, если вы пытаетесь ответить на нажатие пользователя на соответствующее поле, поскольку само нажатие даст поле фокус. К сожалению, выберите () является просто неработоспособность Mobile Safari.

Лучшим вариантом может быть отчет об ошибке в Apple .

Clozach
источник
1
Наше тестирование показывает то же самое. Это ошибка / отсутствующая функция в мобильном сафари.
Нир Леви
2
FWIW, он работает в Chrome Desktop и браузере Android, которые также основаны на WebKit.
jrummell
24

См. Эту скрипку : (введите текст в поле ввода и нажмите «Выбрать текст»)

Он выбирает текст в поле ввода на моем iPod (5-го поколения iOS6.0.1), открывает клавиатуру, а также показывает меню «Вырезать / Копировать / Предложить ...»

Использование простого javascript. Не пробовал с jQuery

document.getElementById("p1").selectionStart = 0
document.getElementById("p1").selectionEnd = 999

Обратите внимание, что число 999 - это всего лишь образец. Вы должны установить эти числа на количество символов, которые вы хотите выбрать.

ОБНОВИТЬ:

  • iPod5 - iOS6.0.1 - Работает нормально.
  • iPad1 - iOS5.1.1 - выделен только текст. Коснитесь выбора один раз, чтобы открыть меню «Вырезать / Копировать»
  • iPad2 - iOS4.3.3 - Выбран только текст. Коснитесь выбора один раз, чтобы открыть меню «Вырезать / Копировать»

С последними двумя вы можете поэкспериментировать, запустив событие щелчка на inputэлементе.

ОБНОВЛЕНИЕ: (07-10-2013)

  • iPod5 - iOS7.0.2 - Использование скрипки в ссылке: не отображается набранный текст в поле ввода. Нажатие select перенаправляет меня на facebook.com (??? wtf ???), я не знаю, что там происходит.

ОБНОВЛЕНИЕ: (14-11-2013)

  • IOS 7.0.3: Благодаря комментарии от Бинки обновления , что .selectionStartи .selectionEnd делает работу.

ОБНОВИТЬ: (15-01-2015)

  • iOS 8.xx: Спасибо за комментарий Майкла Зиберта . Взято из комментария: мне пришлось прослушивать оба события focus и click, а затем setTimeout / _. Debounce, чтобы он работал в обоих случаях: щелкните ввод или сфокусируйтесь с помощью табуляции
Барт с
источник
Ты мой герой на сегодня! Работает как шарм! ;-)
andi1984 07
3
@ andi1984 где мне получить значок героя?
bart s
1
Вы знаете о совместимости с другими версиями iOS? Работает ли на iOS5 и iOS4?
andi1984 07
1
У меня работает на iOS6, НО а) не работает на настольном Chrome б) не работает, когда ввод текста отключен :( Мой вариант использования: я генерирую уникальный URL-адрес и хочу облегчить совместное использование.
Марс Робертсон,
1
@barts Я собираюсь предположить, что вы попали в Facebook, потому что меню «Поделиться» в jsfiddle должно быть испорчено и его можно нажимать, хотя, возможно, оно невидимо. В итоге я сам нажал невидимую кнопку Twitter при тестировании iOS-7.0.3 на iPad. Я также обнаружил, что когда я думал, что нажимаю на вас <input/>, iPad думал, что я нажимаю на панель «CSS» jsfiddle (где все, что я набираю, было невидимым). Как только я направил кран на правильный<input/> , ваша кнопка «Выбрать текст» будет отлично работать на iOS-7.0.3 :-).
binki
7

Извините, в моем предыдущем посте я не заметил Javascript, подразумевающего, что вам нужен ответ в Javascript.

Чтобы получить то, что вы хотите в UIWebView с помощью javascript , мне удалось собрать воедино два важных фрагмента информации, чтобы заставить их работать. Не уверен насчет мобильного браузера.

  1. element.setSelectionRange(0,9999); делает то, что мы хотим

  2. Событие mouseUp отменяет выделение

Таким образом (используя прототип):

    input.observe ('фокус', function () {
      this.setSelectionRange (0, 9999);
    });
    input.observe ('mouseup', function (event) {
      event.stop ();
    });

делает свое дело.

Мэтт

Мэтт
источник
3
У нас возникла та же проблема, и мы обнаружили, что ваше решение работает, но мы используем jquery (на самом деле мобильный). / * выделяем текст внутри заливок * / $ ("input"). focus (function () {this.setSelectionRange (0, 9999); return false;}) .mouseup (function () {return false;} );
DuStorm
1
Я использую iOS 8 на iPad и iPhone, и код из @DuStorm (комментарий над этим) - единственное, что у меня сработало из всех приведенных здесь ответов. Повторюсь, следующее, по крайней мере, работает на iOS 8 в Chrome и Safari: $("input").focus(function () { this.setSelectionRange(0, 9999); return false; } ).mouseup( function () { return false; });
Аарон Джессен,
Мне пришлось использовать focusinвместо focus, чтобы это работало, iOS 7
Лукас,
3

Похоже, фокус будет работать, но только при прямом вызове из собственного события. вызов фокуса с использованием чего-то вроде SetTimeout не появляется, вызывает клавиатуру. Управление клавиатурой ios очень плохое. Это не очень хорошая ситуация.

Йодазеленый
источник
1

Что-то вроде следующего работает для меня на Webkit, который поставляется с Android 2.2:

function trySelect(el) {
    setTimeout(function() {
        try {
            el.select();
        } catch (e) {
        }
    }, 0);
}

См. Chromium Issue 32865 .

робот
источник
1

С iOS 7 на iPad единственный способ, которым я смог выполнить эту работу, заключался в том, чтобы использовать <textarea></textarea>вместо<input> поля.

например

<textarea onclick="this.setSelectionRange(0, 9999);">My text will be selected when textarea is clicked.</textarea>

Как запретить пользователю изменять текст внутри области было сложнее, так как если вы сделаете textarea только для чтения, трюк с выделением больше не будет работать.

Микаэль Лепистё
источник
1

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

Клиент хотел, чтобы пользователь мог щелкнуть и выбрать все , а также позволить пользователю «вкладывать» и выбирать все на iPad. (с внешней клавиатурой. Я знаю, сумасшедший ...)

Мое решение этой проблемы было переставить события. Первый фокус , а затем нажмите , затем touchstart .

$('#myFUBARid').on('focus click touchstart', function(e){
  $(this).get(0).setSelectionRange(0,9999);
  //$(this).css("color", "blue");
  e.preventDefault();
});

Я надеюсь, что это кому-то поможет, потому что вы много раз помогали мне.

Аднан Тарик
источник
-4

Если вы используете браузеры, совместимые с HTML5, вы можете использовать placeholder="xxx"в своем inputтеге. Это должно сработать.

DrMad
источник
8
Я не думаю, что это то, о чем был задан вопрос
caitriona