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


88

Як ви програмно вибираєте текст поля введення на пристроях iOS, наприклад iPhone, iPad із мобільним Safari?

Зазвичай достатньо викликати .select()функцію на <input ... />елементі, але це не працює на цих пристроях. Курсор просто залишається в кінці існуючого запису без вибору.


10
Я не бачу жодної причини, чому сенсорний пристрій змінює актуальність попереднього вибору тексту. Те, що ви сказали про сенсорний пристрій, однаково добре можна сказати і про нечутливий пристрій. Я хочу попередньо виділити текст, коли користувач вирішить торкнутися елемента, щоб редагувати його. У більшості випадків користувач, швидше за все, захоче замінити наявний вміст, і в цьому випадку він міг би це зробити без подальшого торкання та перетягування. В інших випадках, коли вони хочуть редагувати наявний вміст, вони зможуть скасувати вибір або змінити виділення.
sroebuck

2
На жаль, .focus (). Select () не працює.
sroebuck

2
Я починаю щедроту з цього питання. Моя мета - полегшити користувачам натискання моєї області тексту та натискання кнопки "Копіювати", щоб скопіювати текст у буфер обміну.
Dan Fabulich

Те саме тут .. здається, у Mobile Safari є безліч методів, які не працюють. Це два .select () та .focus ().

@sroebuck приємна відповідь для Девіда В. Кіта! пальці вгору!
ейрдакуль

Відповіді:


95
input.setSelectionRange(0, 9999);

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


3
Це спрацювало для мене, але мусило включати зупинку наведення миші на тих самих входах.
DuStorm

8
Це не спрацювало для мене ні на iPad, ні на iPhone
Дуг

4
Це працювало у мене, лише якщо я спрацьовував .focus()на вході перед викликом input.setSelectionRange. Якщо ви слухаєте focusподію на вході, не забудьте врахувати нескінченний цикл.
allieferr

10
Принцип, який варто згадати: це не спрацює на текстових областях, якщо вони мають readonlyатрибут.
JayPea

5
Я витратив більше години, граючись із різними рішеннями. Виклик setSelectionRange()в focusобробнику працює, коли ви запускаєте .focus()програмно, але коли ви вмикаєте текст вручну на iOS, виділення не відбувається. Достатньо сказати, що все, що вам потрібно зробити, це зателефонувати setSelectionRange()в межах setTimeout 0, і він працює належним чином, незалежно від того, що викликає фокус.

30

Ніщо в цій темі не працювало для мене, ось що працює на моєму iPad:

// t is the input field
setTimeout(function() {
    t.setSelectionRange(0, 9999);
}, 1);

це трішки! Дякую! працює з подією "клік"
saike

Дуже тобі вдячний!!
Вацлав

26

Важко довести негатив, але моє дослідження показує, що це помилка в Mobile Safari.

Зверніть увагу, що focus () працює більш-менш - хоча для успіху може знадобитися кілька натискань, і це не потрібно, якщо ви намагаєтеся відповісти на натискання користувача на поле, оскільки саме натискання дасть поле фокус. На жаль, виберіть () є просто непрацездатність Mobile Safari.

Найкращим вибором може бути звіт про помилку в Apple .


1
Наше тестування вказує на те саме. Це помилка / відсутність у мобільному сафарі.
Нір Леві,

2
FWIW, він працює в Chrome Desktop та браузері Android, які також базуються на WebKit.
jrummell

24

Дивіться цю скрипку : (введіть трохи тексту у поле введення та натисніть "вибрати текст")

Це виділення тексту у вікні вводу на моєму iPod (iOS 5.0 покоління, відкриття клавіатури), а також відображення меню Вирізати / Копіювати / Запропонувати ...

Використання простого 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: Завдяки коментарю Майкла Зіберта . Взято з коментаря: Мені довелося прослуховувати події фокусування І клацання, а потім setTimeout / _.

Ти мій герой на сьогодні! Працює як шарм! ;-)
andi1984

3
@ andi1984 де я можу отримати значок героя?
Барт s

1
Чи знаєте ви про сумісність з іншими версіями iOS? Чи працює це на iOS5 та iOS4?
andi1984

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 ('focus', 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замість фокусу, щоб це працювало, iOS 7
Лукас

3

Схоже, фокус спрацює, але лише за умови безпосереднього виклику з власної події. фокус виклику, використовуючи щось на зразок SetTimeout, не з'являється, викликайте клавіатуру. Керування клавіатурою ios дуже погане. Це не хороша ситуація.


1

На Webkit, який постачається з Android 2.2, для мене працює щось на зразок наступного:

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

Див. Випуск Chromium 32865 .


1

З iOS 7 на iPad єдиним способом, яким я зміг зробити цю роботу, було використання власне <textarea></textarea>замість <input>поля.

напр

<textarea onclick="this.setSelectionRange(0, 9999);">My text will be selected when textarea is clicked.</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тегу. Це повинно зробити роботу.


8
Я не думаю, що це
задавало
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.