Виділення тексту для фокусування за допомогою jQuery не працює в Safari та Chrome


85

У мене є такий код jQuery (подібний до цього запитання ), який працює у Firefox та IE, але не працює (помилок просто не працює) у Chrome та Safari. Будь-які ідеї щодо обхідного шляху?

$("#souper_fancy").focus(function() { $(this).select() });

Я хочу точну поведінку в сафарі iPad / iPhone. Це не працює у браузерах iPod / iPhone. будь-яка підказка. Відповідь нижче прийнято лише для Chrome / safari на робочому столі.
Ананд

5
Примітка: Прийнята тут відповідь вирішує лише половину проблеми. Це робить вибраний режим працездатним, але ускладнює його подальший скасування з наступними клацаннями. Краще рішення можна знайти тут: stackoverflow.com/questions/3380458/…
SDC

Відповіді:


188

Саме подія onmouseup спричиняє скасування виділення, тому вам просто потрібно додати:

$("#souper_fancy").mouseup(function(e){
    e.preventDefault();
});

3
Детальніше про помилку тут: code.google.com/p/chromium/issues/detail?id=4505
Раджат,

Як досягти того ж за допомогою прототипу?
tehfink

Ви також можете спробувати прив’язати до події „клацання” і не робити двох прив’язок.
uglymunky

@uglymunky Залежно від того, що ви робите, прив'язка до події кліку працюватиме не у всіх випадках - зрештою, існують інші способи вибору поля введення, крім клацання по ньому, і ви хочете, щоб вони також працювали (наприклад вкладання в нього)
Такро

2
Я хочу точну поведінку в сафарі iPad / iPhone. Це не працює у браузерах iPod / iPhone. будь-яка підказка.
Ананд

25
$('#randomfield').focus(function(event) {
    setTimeout(function() {$('#randomfield').select();}, 0);
});

3
Це найкраща відповідь, якщо ви намагаєтеся виділити текст у полі форми для програми PhoneGap, яка працює на Android. Це дає візуальне вказівку користувачеві, що текст виділений, тоді як прийнята відповідь - ні.
BallisticPugh

4

Це чудово працює для елементів вводу type = "text". Що це за елемент #souper_fancy?

$("#souper_fancy").focus(function() {
    $(this).select();
});

це елемент type = "text". Я також спробував $ ("input [type = text]"). Досі не працює з jQuery 1.3.2 у Safari.
user140550

3

Просто запобігання замовчуванню при наведенні миші призводить до того, що виділення тексту постійно увімкнено. Подія MOUSEUP відповідає за очищення виділеного тексту. Однак, запобігаючи поведінці за замовчуванням, ви не можете скасувати вибір тексту за допомогою миші.

Щоб уникнути цього і змусити текст виділення знову працювати, ви можете встановити прапор на FOCUS, прочитати його з MOUSEUP і скинути його, щоб майбутні події MOUSEUP працювали належним чином.

$("#souper_fancy").focus(function() {
    $(this).select();

    //set flag for preventing MOUSEUP event....
    $this.data("preventMouseUp", true);
});

$("#souper_fancy").mouseup(function(e) {
    var preventEvent = $this.data("preventMouseUp");

    //only prevent default if the flag is TRUE
    if (preventEvent) {
        e.preventDefault();
    }

    //reset flag so MOUSEUP event deselect the text
    $this.data("preventMouseUp", false);
});

1

Хоча це працює для вибору його в IE, Firefox, Chrome, Safari та Opera, це не дозволить вам редагувати його, натиснувши вдруге у Firefox, Chrome та Safari. Не зовсім впевнений, але я думаю, що це може бути пов’язано з тим, що ці 3 браузери перевидали подію фокусу, навіть якщо поле вже має фокус, таким чином, ніколи не дозволяючи вам фактично вставити курсор (оскільки ви вибираєте його знову), тоді як в IE і Opera, здається, цього не робить, тому подія фокусу не запускалася знову, і таким чином курсор вставляється.

Я знайшов краще виправлення в цій публікації стека , яке не має цієї проблеми і працює у всіх браузерах.


1

Це також має працювати в хромі:

$("#souper_fancy").focus(function() {
    var tempSouper = $(this);
    setTimeout(function(){
        tempSouper.select();
    },100);
});

Будь ласка, розгляньте можливість додавання конструктивних відгуків про те, чому OP бачить проблему, а ваше рішення її вирішує.
Mirko Adari

1

Оскільки при використанні setTimeout виникає мерехтіння, існує інше рішення, засноване на подіях. Таким чином подія 'focus' приєднує подію 'mouseup', і обробник подій знову від'єднується.

    function selectAllOnFocus(e) {
    if (e.type == "mouseup") { // Prevent default and detach the handler
        console.debug("Mouse is up. Preventing default.");
        e.preventDefault();
        $(e.target).off('mouseup', selectAllOnFocus);
        return;
    }
    $(e.target).select();
    console.debug("Selecting all text");
    $(e.target).on('mouseup', selectAllOnFocus);
}

Потім підключіть першу подію

    $('.varquantity').on('focus', selectAllOnFocus);

1

Використовуйте setSelectionRange()всередині зворотного дзвінка, щоб requestAnimationFrame():

$(document).on('focus', '._selectTextOnFocus', (e) => {
    var input = e.currentTarget;
    var initialType = e.currentTarget.type;

    requestAnimationFrame(() => {
        // input.select() is not supported on iOS
        // If setSelectionRange is use on a number input in Chrome it throws an exception,
        // so here we switch to type text first.
        input.type = "text";
        input.setSelectionRange(0, Number.MAX_SAFE_INTEGER || 9999);
        input.type = initialType;
    });
});

Використовуйте setSelectionRange()замість того , select()так як select()не працює в мобільному Safari (див програмним шляхом виділення тексту в поле введення КСН пристроїв (мобільний Safari) ).

Потрібно зачекати використання, requestAnimationFrameперш ніж виділяти текст, інакше елемент неправильно прокручується до перегляду після появи клавіатури на iOS.

При використанні setSelectionRange()важливо встановити для типу введення значення text, інакше це може викликати винятки в Chrome (див. SelectionStart / selectionEnd on input type = "number" більше не дозволяється в Chrome ).


0

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

<input type="text" value="Hello world..." onFocus="window.setTimeout(() => this.select());">

(без setTimeout () не працює на Safari, мобільному Safari та MS Edge)

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