Как программно сфокусироваться на текстовом поле при загрузке страницы для мобильного сафари?

Примечание. Из-за изменений, связанных с работой, я больше не могу проверить ответы, размещенные здесь. Скорее всего, я никогда не смогу принять ответ внизу. Информация, размещенная здесь, полезна для ИМО, поэтому я просто оставлю ее как есть. Если вы думаете, что знаете ответ, не стесняйтесь отвечать, и мы просто позволим сообществу решить, какие из них полезны.


Фон

Я занимаюсь разработкой автономного веб-приложения для iPod Touch. Одно из моих требований - сосредоточиться на текстовом поле при загрузке страницы, чтобы пользователь мог выполнять задачу постоянно (например, с помощью считывателя штрих-кода).

проблема

Проблема в том, что он фокусируется на рассматриваемом текстовом поле, но клавиатура не поднимается. Есть ли обходной путь для этого? Или это от Apple?

Образец HTML

Я не уверен, как поместить это в фрагмент кода, но вот где я экспериментировал:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0.0">

    <meta name="apple-mobile-web-app-capable" content="yes">
    <link rel="apple-touch-icon" href="#" onclick="location.href='https://cdn57.androidauthority.net/wp-content/uploads/2016/06/android-win-2-300x162.png'; return false;">

    <title>TESTING</title>

    <link rel="stylesheet" href="#" onclick="location.href='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css'; return false;">

    <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

    <script>
        // javascript goes here
    </script>
</head>
<body>

    <section id="content">

        <div class="container" style="margin-top: 50px;" >

            <p>Testing textfield focus</p>

            <form method="POST">
                <div class="row">
                    <div class="col-xs-12">
                        <input type="text" class="form-control first-responder" />
                    </div>
                    <div class="col-xs-12">
                        <button type="submit" class="btn" style="width: 100%" >OK</button>
                    </div>
                </div>
            </form>

        </div>

    </section>

</body>
</html>

Я просматриваю это в Safari, а затем добавляю на домашний экран, чтобы он действовал как отдельное веб-приложение.

попытки

Я попытался найти решения, первый (я потерял ссылку) предложил попробовать тайм-ауты так:

$(function () {
    var firstResponder = $(".first-responder");
    setTimeout(function() {
        firstResponder.focus();

    }, 1000);

})

Другое решение, которое я нашел, предложило установить диапазон выбора следующим образом:

$(function () {
    var firstResponder = $(".first-responder");
    setTimeout(function() {
        firstResponder[0].setSelectionRange(0, 9999);

    }, 1000);

})

Было также предложение привязать его к клику следующим образом:

$(function () {
    var firstResponder = $(".first-responder");
    firstResponder.on('click', function() {
        firstResponder.focus();
    });

    firstResponder.focus().click();
})

Я также попытался запустить TouchStart следующим образом:

$(function () {
    var firstResponder = $(".first-responder");
    firstResponder.on('touchstart', function() {
        firstResponder.focus();
    });

    firstResponder.trigger('touchstart');
})

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

function doAjax() {
    var firstResponder = $(".first-responder");

    $.ajax({
        url: "#",
        method: "POST",
        dataType: "json",
        success: function(result) {
            firstResponder.focus();
        },
        error: function(request, error) {
            firstResponder.focus();         
        }
    });
}

Я впал в отчаяние, поэтому попытался установить несколько CSS:

user-select: text;
-webkit-user-select: text;

Эти решения работали на iOS 9.1 (кроме CSS), но все они не работали на iOS 11.1.1. Я пытался комбинировать различные решения, устанавливать таймауты и т.д., Но ни одно из них не помогло. Как я уже отметил, он фокусируется, потому что я вижу, что границы текстового поля становятся синими, показывая, что у него есть фокус. Но мне нужно, чтобы клавиатура тоже отображалась.

Такое поведение кажется либо ошибкой, либо удобством использования/функцией безопасности. Если это специально (то есть функция безопасности), есть ли официальная документация Apple, в которой об этом говорится?

добавление

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

Непрерывная задача возможна, потому что считыватель штрих-кода может включать клавишу Enter после считываемого штрих-кода, тем самым отправляя форму, на которой включено текстовое поле. После перезагрузки страницы, если текстовое поле автоматически фокусируется, все, что нужно сделать пользователю, это прочитать другой штрих-код. Страница отправляется снова, перезагрузки, автофокусировки и цикл может быть повторен.

Ответ 1

После некоторых сложных тестов я нашел способ, который работал в моей девушке iphone 7 с ios 11, теперь я не знаю, доходит ли она до ваших потребностей, но она всплывает по виртуальной клавиатуре!

Это тест html:

<input type='text' id='foo' onclick="this.focus();">
<button id="button">Click here</button>

Это javascript:

function popKeyboard(input) {
  input.focus();
  input.setSelectionRange(0, 0);
}

$("#button").on("click", function() {
  popKeyboard($("#foo"));
});

И это fiddle.

Oh и CanIUse на всякий случай!

Теперь, когда это происходит, когда мы нажимаем кнопку, это оценивается как "Пользовательский ввод", потому что клавиатура может быть выведена только в том случае, если пользователь вводит вход (в android и ios), мы запускаем функцию popKeyboard, которая фокусирует вход и устанавливает для параметра selectionRange значение 0,0, что означает, что он устанавливает каретку в 0, и клавиатура должна появиться.

Это было протестировано в Android и Iphone 7 с IOS 11.

Будьте осторожны, что она предупредила меня, что ее ios 11 не был полностью обновлен, но если он работает, пожалуйста, скажите мне!

Ответ 2

Попробуйте это?

 $(function(){
    $('input.form-control.first-responder').first().focus();
  });

Селектор сужается первым() и гарантирует, что он не будет затронут другими аналогичными классами на странице.

Ответ 4

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

Из-за какой-то странности современные браузерные веб-браузеры (chrome, iOS11) задержка была добавлена ​​по какой-то причине событие load запускается до того, как браузер фактически полностью загружен. тем не менее, я обязательно буду использовать событие load в качестве отправной точки.

(function($){
  $(function(){
      window.addEventListener("load", function(){
        setTimeout(function(){  $(".first-responder").focus();  }, 150);
      });
  })
})(jQuery);

https://jsfiddle.net/barkermn01/xzua65jd/1/

Ответ 5

Используйте ajaxComplete вместо load или ready событие.

Я просто загружаю 1 файл через ajax и ajaxComplete метод. Я установил фокус для поля ввода.

Это рабочий пример, я надеюсь, что это сработает для вас.

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0.0">

    <meta name="apple-mobile-web-app-capable" content="yes">
    <link rel="apple-touch-icon" href="https://cdn57.androidauthority.net/wp-content/uploads/2016/06/android-win-2-300x162.png">

    <title>TESTING</title>

    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">

    <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
	
	<style>
	span{
		display:none;
	}
	</style>
	
    <script>
	$(document).ready(function(){
	
		$("span").load("https://www.w3schools.com/xml/cd_catalog.xml");
	
		$(document).ajaxComplete(function(){
			$(".first-responder")[0].focus();
		});
	});
    </script>
</head>
<body>

    <section id="content">

        <div class="container" style="margin-top: 50px;" >

            <p>Testing textfield focus</p>

            <form method="POST">
                <div class="row">
                    <div class="col-xs-12">
                        <input type="text" class="form-control first-responder" />
                    </div>
                    <div class="col-xs-12">
                        <button type="submit" class="btn" style="width: 100%" >OK</button>
                    </div>
                </div>
            </form>

        </div>

    </section>
<span></span>
</body>
</html>

Ответ 6

Просто экспериментировал. В iOS 11,.focus() не будет отображать клавиатуру, если вы попытаетесь установить ее на самом первом элементе управления, если пользователь не коснется элемента управления в первый раз. Однако .focus() отобразит клавиатуру, если вы не сделали .blur() в текущем документе. ActiveElement перед тем, как вы .focus() на другом элементе.

Ниже код работал у меня с этого нажатия (считыватель штрих-кодов, ScanBoard) для iPod: -

$(window).keypress(function (e) {
    if (e.which === 13) {
        switch (true) {
            case window.location.href.indexOf('FindReplenishmentLocation') > -1:
            case window.location.href.indexOf('ConfirmReplenishmentLocation') > -1:
            case window.location.href.indexOf('ConfirmReplenishmentPickFace') > -1:
                if (document.activeElement.id === 'pickFaceLocationTextBox' || document.activeElement.id === 'bulkLocationTextBox') {
                    if ($('#skuTextBox').val()) {
                        $('#skuTextBox').focus().select();
                    }
                    else {
                        if (isMobile) {
                            $('#skuTextBox').focus().select();
                        }
                        else {
                            $('#skuTextBox').focus();
                        }
                    }
                }
                else {
                    if (window.location.href.indexOf('ConfirmReplenishmentPickFace') > -1) {
                        if ($('#qtyPutAwayNumericTextBox').val()) {
                            $('#qtyPutAwayNumericTextBox').focus().select();
                        }
                        else {
                            if (isMobile) {
                                $('#qtyPutAwayNumericTextBox').focus().select();
                            }
                            else {
                                $('#qtyPutAwayNumericTextBox').focus();
                            }
                        }
                    }
                    else {
                        $('#next-btn').trigger('click');
                    }
                }
                break;                
            default:
                break;
        }

        e.preventDefault();
    }
});

Ответ 7

сначала воспользуйтесь становлением сталФиронResponder() в веб-просмотре