Jelly Bean WebView плохо работает с атрибутом HTML maxlength для текстового поля


Jelly Bean, похоже, не нравится атрибут maxlength HTML для ввода текста. Это, конечно, ограничивает количество вводимых символов, но в тот момент, когда вы пытаетесь ввести больше разрешенного количества символов, текстовое поле терпит неудачу. Теперь вы не сможете вводить другие текстовые поля и не сможете удалить уже введенный символ в этом текстовом поле.

Если вы еще не сталкивались с этим, то попробуйте сами на простом HTML и проверьте. Пожалуйста, скажите мне, если у вас есть какие-либо ключ к разгадке этой загадки.

6 13

6 ответов:

Я также испытал ту же проблему в моем приложении

На данный момент я обработал его с помощью js, который удаляет все атрибуты maxlength из входного текста и textarea и останавливает пользователя от ввода большего количества текста, чем требуется. Здесь предполагается, что все входные тексты и текстовые области имеют уникальный идентификатор.

Код также доступен по адресу jsfiddle

    $(document).ready(function () {

        var ver = window.navigator.appVersion;
            ver = ver.toLowerCase();

        if ( ver.indexOf("android 4.1") >= 0 ){            

            var idMaxLengthMap = {};

            //loop through all input-text and textarea element
            $.each($(':text, textarea, :password'), function () {
                var id = $(this).attr('id'),
                    maxlength = $(this).attr('maxlength');

                //element should have id and maxlength attribute
                if ((typeof id !== 'undefined') && (typeof maxlength !== 'undefined')) {
                    idMaxLengthMap[id] = maxlength;

                    //remove maxlength attribute from element
                    $(this).removeAttr('maxlength');

                    //replace maxlength attribute with onkeypress event
                    $(this).attr('onkeypress','if(this.value.length >= maxlength ) return false;');
                }
            });

            //bind onchange & onkeyup events
            //This events prevents user from pasting text with length more then maxlength
            $(':text, textarea, :password').bind('change keyup', function () {
                var id = $(this).attr('id'),
                    maxlength = '';
                if (typeof id !== 'undefined' && idMaxLengthMap.hasOwnProperty(id)) {
                    maxlength = idMaxLengthMap[id];
                    if ($(this).val().length > maxlength) {

                        //remove extra text which is more then maxlength
                        $(this).val($(this).val().slice(0, maxlength));
                    }
                }
            });
        }
    });​

Ошибка для этого вопроса уже была открыта на 35264

Если ваш случай очень прост, то простое дополнение в вашей html-строке тоже может работать, например:

​<input type="text" class="abc" onkeypress="if(this.value.length > 9) return false;"/>​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

Предоставьте разрешение как WRITE_EXTERNAL_STORAGE " в файле манифеста android.

Сейчас в моем android 4.1.2 идет работа с приемом ввода типа номер 7.

Я открыл следующий выпуск android: 35823. Если вы столкнулись с этой проблемой, пожалуйста, отметьте ее, чтобы она могла привлечь некоторое внимание и разрешиться.

Это, безусловно, кошмарный баг разработчика :) Пока вы не осознаете первопричину и не почувствуете "ага..." момент. FYI: несмотря на то, что все поля ввода в DOM замерзают из-за этой ошибки, я все еще мог манипулировать и изменять значения полей ввода с помощью Javascript.

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

HTML

<textarea ng-model="model " rows="3" maxlength="100" cols="70" class="custom_txtarea ng-pristine ng-valid charlength" placeholder="Achievements"></textarea>

Javascript

$(".charlength").keypress(function(event) {
          if(event.which >= 32 || event.which == 13) {
          var maxLength = event.currentTarget.maxLength;
           var length = event.currentTarget.value.length;
           if(length >= maxLength) {                     
               event.preventDefault();
           }
       }
   });