Преобразовать в верхний регистр как пользовательские типы, используя JavaScript - PullRequest
37 голосов
/ 06 апреля 2011

Я хочу преобразовать строчные буквы в прописные, когда пользователь печатает с использованием javascript. Любые предложения приветствуются.

Я пробовал следующее:

$("#textbox").live('keypress', function (e) {
    if (e.which >= 97 && e.which <= 122) {
        var newKey = e.which - 32;
        // I have tried setting those
        e.keyCode = newKey;
        e.charCode = newKey;
    }
});

Ответы [ 12 ]

56 голосов
/ 06 апреля 2011
css

#textbox{text-transform:uppercase}
23 голосов
/ 06 апреля 2011
$("#textbox").bind('keyup', function (e) {
    if (e.which >= 97 && e.which <= 122) {
        var newKey = e.which - 32;
        // I have tried setting those
        e.keyCode = newKey;
        e.charCode = newKey;
    }

    $("#textbox").val(($("#textbox").val()).toUpperCase());
});
9 голосов
/ 22 сентября 2011

Это может быть хорошим обходным путем.Просто установите это в своем CSS:

input#textbox {
    text-transform: uppercase;
}

Если вы отправляете данные в серверный скрипт (скажем, php), вы всегда можете сделать что-то вроде этого:

$upper_data = strtoupper($_POST['textbox']);
5 голосов
/ 13 сентября 2013

Привет, этот код отлично работает на вводе и текстовой области без задержки или изменения заглавных букв

$("#input").on('input', function(evt) {
              var input = $(this);
              var start = input[0].selectionStart;
              $(this).val(function (_, val) {
                return val.toUpperCase();
              });
              input[0].selectionStart = input[0].selectionEnd = start;
            });

микс из https://stackoverflow.com/a/7944108/1272540 и https://stackoverflow.com/a/13155583/1272540

jsFiddle

3 голосов
/ 15 апреля 2014

попробуйте этот скрипт css, он работает для меня.

<style>    
input{text-transform:uppercase};
</style>    

для информации, что вы видите, может быть, верхний регистр, но на самом деле это то, что вы печатаете, если вы наберете "Test", он будет показан как "TEST"но когда вы получаете метод val (), он отображается как «Test».

, если вы хотите, чтобы это был верхний регистр для реального, добавьте ниже сценарий для события, такого как размытие от объекта или элемента, как вам нужно.

$ (this) .val ($ (this) .val (). ToUpperCase ());

И если вы хотите использовать для конкретного объекта, добавьте несколько дополнительных сценариев, например, то, что я использовалк настоящему времени

input[attr]{
text-transform:uppercase;
}

input[attr='value']{
text-transform:uppercase;
}
1 голос
/ 01 декабря 2016

Я знаю, что довольно поздно для вечеринки, но я хотел бы предложить это:

(function ( $ ) {

  var displayUppercase = function ($element) {
    if ($element.val()) {
      $element.css('text-transform', 'uppercase');
    } else {
      $element.css('text-transform', 'none');
    }
  };

  $.fn.displayAsUppercase = function() {
    $(this).each(function() {
        var $element = $(this);
      displayUppercase($element);
      $element.on('input', function(){displayUppercase($element)});
    });
    return this;
    };

}( jQuery ));

У него есть следующие преимущества:

  • Сохраняет заглавную букву заполнителябез изменений
  • Сразу вводит заглавные буквы (при нажатии клавиши)
  • Не перемещает курсор
  • С заглавной буквы вводит значение, если оно предварительно заполнено

JS Fiddle здесь

1 голос
/ 30 июля 2015
$(document).ready(function () {
        $("#textbox").keyup( function (e) {
            var str = $(this).val();
            $("#textbox").val(str.toUpperCase());
});
});
1 голос
/ 18 октября 2013
function changeToUpperCase(event,obj) {
    charValue = (document.all) ? event.keyCode : event.which;
    if (charValue!="8" && charValue!="0" && charValue != "27"){
        obj.value += String.fromCharCode(charValue).toUpperCase();
        return false;
    }else{
        return true;
    }
}

<input id="txtId" type="text" onkeypress="return changeToUpperCase(event,this)" />

Edit:

Самый простой способ - это использование css:

#txtId {text-transform:uppercase}
1 голос
/ 14 сентября 2012

Поскольку вы также отметили это как вопрос jQuery, вот простое (ну, довольно простое) решение jQuery:

$('#text_statute_section').on('keypress', function(event) {
    if(null !== String.fromCharCode(event.which).match(/[a-z]/g)) {
        event.preventDefault();
        $(this).val($(this).val() + String.fromCharCode(event.which).toUpperCase());
    }
});

Использование нажатия клавиши предотвращает эффект "отскока", который имеет нажатие клавиши (нажатие клавиши также имеет место, но не событие, которое здесь не различает непосредственно верхний и нижний регистр - проверка клавиши Shift является грязной из-за блокировки прописных букв). Кроме того, это работает с вводимым символом, преобразует его в верхний регистр, а затем добавляет его к существующему значению, а не сначала добавляет, а затем преобразует все это в верхний регистр, как это делают большинство других решений, которые я видел. Наконец, он фактически преобразует символ, а не применяет к нему стиль форматирования, как это делает CSS. Все это дает лучший контроль, особенно в ситуациях, когда некоторые символы необходимо вводить в верхнем регистре, а некоторые нет, например, в серийных номерах и т. П.

РЕДАКТИРОВАТЬ: (четыре года спустя)!

Я никогда не был доволен тем, как jQuery / javascript обрабатывает изменение ключей в верхний регистр, когда они вводятся. Я рассмотрел все предложения в этом посте, и ни одно из них (меньше всего моих) не работает безупречно , Это раздражает меня, так как в старые времена VB6 было просто изменить символ KeyAscii, который был передан событию KeyPress. Во всяком случае, совершенно случайно, я нашел своего рода «черное искусство» решение, которое работает безупречно, насколько я его тестировал. Это означает, что он работает в Chrome, он правильно обрабатывает любую позицию курсора на тексте, он (с некоторой работой) не меняет поведение фокуса браузера и надежно переключается на верхний регистр без какого-либо резкого показа строчной буквы в первую очередь. В то время как решение CSS также делает все это, как уже отмечали другие, у него есть недостаток, заключающийся в необходимости программно принудительно переводить нижележащие символы в нижний регистр, когда вам нужна фактическая строка для работы, что может быть хлопотным для отслеживания и, следовательно, не масштабируется хорошо. Итак, я подумал, что мог бы написать это на тот случай, если кто-то посчитает это полезным.

Это решение зависит от небольшого количества Джоша Буша (180 строк кода, для тех, кто беспокоится о раздувании зависимостей). Маскированный входной плагин от digitalbush , который отлично работает и делает то, что он делает очень хорошо. Если вы измените event.which на другое значение, а затем вызовете метод mask() (сначала укажите обработчик нажатия клавиш, а затем вторую маску в своем коде), изменение сохранится.

Вот немного кода:

$.mask.definitions['b'] = '[A-Z, ]';

$('#txtMyInput').on('keypress', function(e) {
    e.which =     String.fromCharCode(e.which).toUpperCase().charCodeAt(0);
})
.mask('b?bbbbbbbbbbbbbbbbbbb', { placeholder: '' })

Маска изначально не поддерживает очень много типов масок: это литералы, буквенные, числовые и буквенно-цифровые. Если вы хотите пунктуации или что-то еще, вы должны бросить свои собственные с помощью регулярных выражений. (Если вы сделаете это, вам нужно помнить, что одно и то же совпадение с регулярным выражением применяется к каждому персонажу по одному, без учета других символов, поэтому вы не сможете сделать что-нибудь необычное). В моем конкретном случае мне нужны были все заглавные буквы, а также пробелы и запятые. ? в строке маски означает, что следующие символы являются необязательными, поэтому этот дает мне до 20 символов. Поскольку мне не нужно было показывать маску, я использовал пустую строку для заполнителя.

Это все работает отлично, за исключением одной маленькой проблемы: если вы хотите сохранить способ, которым браузер выделяет текст при вставке в поле, вам нужно проделать дополнительную работу. Мне пришлось взломать код маски, чтобы получить то, что я хотел.

Сначала я попытался просто выбрать текст в обработчике событий фокуса, который обычно работает, когда я вызываю focus() из обработчика нажатия клавиш. Это не сработало здесь; курсор только что был установлен в конец текста, как при щелчке мышью там. Я попытался изменить заполнитель на пробел. Это привело к заполнению текста достаточным количеством пробелов, чтобы заполнить указанный предел, и выбору всего этого.

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

Итак, я копался в коде маски. Как оказалось, плагин также имеет обработчик событий фокуса, который он использует для установки индикатора маски (скажем, (___) ___-___-____ для телефона) в поле, когда вы фокусируете его. Это поведение, которое вы хотите большую часть времени, но не здесь, потому что оно заменяет выделенный текст выделенным текстом, соединенным с той частью индикатора маски, которая еще не была заполнена. Если у вас нет индикатора маски, это приводит к отмене выбора текста в блоке, как если бы вы программно присвоили текстовое значение блока.

Я решил немного взломать код маски. Сначала я попытался закомментировать весь обработчик события фокуса, что привело к тому, что маска ввода не отображалась в других полях, где я этого хотел. Итак, я нашел менее агрессивную альтернативу. Я изменил это (в настоящее время jquery.maskedinput.js, строка 164):

}).on("focus.mask", function() {
    if (!input.prop("readonly") { 
        // etc.

на это:

}).on("focus.mask", function() {
    if (!input.prop("readonly") && settings.placeholder.length > 0) {

Это позволяет обойти настройку индикатора маски, если вы установили в качестве заполнителя пустую строку, что позволяет браузеру вести себя как фокус.

Еще одна вещь: если вы используете метод focus(), чтобы сосредоточиться на текстовом поле (например, чтобы спасти пользователя ввода данных от тенденции браузера переходить к частям, неизвестным при использовании клавиши табуляции), вы Придется вызвать метод select() в обработчике события фокуса, чтобы правильно выделить текст (keybdFocus - это флаг, который я устанавливаю при вызове события focus() из обработчика keydown, чтобы отличить его от сгенерированный мышью фокус):

$('#txtMyInput').on('keypress', function(e) {
    e.which = String.fromCharCode(e.which).toUpperCase().charCodeAt(0);
})
.mask('b?bbbbbbbbbbbbbbbbbbb', { placeholder: '' })
.focus(function() {
    if (kybdFocus) {
        kybdFocus = false;
        $(this).select();
    }
});

Суммируя шаги:

  1. Загрузите плагин Josh Bush's Masked Edit.
  2. Изменить строку кода в обработчике фокуса плагина.
  3. Установите определение маски (если необходимо) для обработки нужных символов.
  4. В обработчике событий нажатия клавиш используйте вашу любимую технику, чтобы изменить e.which на его эквивалент в верхнем регистре. (Важно: вызов обработчику должен предшествовать вызову метода mask() в вашем коде. Маска вычисляет, например, чтобы определить, соответствует ли символ-кандидат маске, и, очевидно, обработчику и Код маски запускается в том порядке, в котором они указаны.)
  5. Установите значение заполнителя на '' при вызове метода mask().
  6. Если вы попали в поле ввода с фокусом, вызовите метод select() в обработчике события фокуса.

Конечно, если вы просто хотите, чтобы символы вводились в верхнем регистре в контексте типичного поля ввода в маске, вы можете пропустить шаги 2 и 4. Вот как я попал в это в первую очередь.

0 голосов
/ 31 августа 2016

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

Внимание: не изменяет «значение»поле, только дисплей.Для этого смотрите здесь: Обновление значения ввода без потери позиции курсора

$(function() {
    $("[data-uppercase='1']").on('keypress', function (e) {
        var $this = $(this);
        var placeholder = $this.attr('placeholder');
        if(placeholder && placeholder.length > 0) {
            this["_placeholder"] = placeholder;
            $this.attr('placeholder', '');
        }
        $this.css('text-transform', 'uppercase');
    }).on('keyup blur', function () {
        var $this = $(this);
        if ($this.val().length < 1) {
            $this.css("text-transform", "");
            $this.attr("placeholder", this["_placeholder"]);
            this["_placeholder"] = undefined;
        }
    });
});

Затем добавьте атрибут data-uppercase к элементу HTML:

<input type="text" data-uppercase="1" />

Обработанов Chrome, Firefox и IE9 +.

Fiddle: https://jsfiddle.net/GarryPas/ptez7q0q/3/

...