Преобразование в верхний регистр для пользовательских типов с помощью javascript

Я хочу преобразовать символы нижнего регистра в верхний регистр, поскольку пользователь вводит с помощью 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;
    }
});

person Butcher    schedule 06.04.2011    source источник
comment
Что они набирают? Если это ввод или текстовое поле, вы можете подключиться к нажатию клавиши   -  person babsher    schedule 06.04.2011


Ответы (12)


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

input#textbox {
    text-transform: uppercase;
}

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

$upper_data = strtoupper($_POST['textbox']);
person Andres SK    schedule 21.09.2011

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

$("#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

person Yann86    schedule 12.09.2013
comment
Я обнаружил, что этот код у меня работает нормально. Одно небольшое изменение, чтобы принимать все входные данные: использование класса, который применяется ко всем входным данным $ (. Input-large) .on (...); - person Adrian P.; 20.09.2013
comment
Это решение также работает для позиции курсора. Мне это нравится. - person Nicolas Belley; 10.12.2015
comment
Также оставляет наиболее набранный в данный момент символ в нижнем регистре (Chrome). - person BobRodes; 01.07.2016

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

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

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

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

$ (это) .val ($ (это) .val (). toUpperCase ());

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

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

input[attr='value']{
text-transform:uppercase;
}
person percayahati    schedule 15.04.2014
comment
Я использую его на Chrome и Mozilla. он отлично работает для меня. может быть, вы могли бы помочь с другим браузером и поделиться им с другими. Благодарность - person percayahati; 15.04.2014
comment
Проблема с этим решением заключается в том, что оно будет отображаться на экране только в верхнем регистре, но если вам нужен текст в верхнем регистре в базе данных, это решение не будет работать должным образом. - person jairhumberto; 08.10.2014

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)" />

Изменить:

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

#txtId {text-transform:uppercase}
person Vishrant    schedule 18.10.2013

Поскольку вы также отметили это как вопрос 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());
    }
});

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

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

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

Это решение действительно зависит от небольшого (180 строк кода, для тех, кто беспокоится о раздувании зависимостей) Джоша Буша Masked Плагин ввода от 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. Загрузите плагин Masked Edit Джоша Буша.
  2. Измените строку кода в обработчике фокуса плагина.
  3. Настройте определение маски (при необходимости) для обработки нужных символов.
  4. В обработчике событий нажатия клавиш используйте свой любимый прием, чтобы изменить e.which на его эквивалент в верхнем регистре. (Важно: вызов обработчика должен предшествовать вызову метода mask() в вашем коде. Маска оценивает e.which, чтобы определить, подходит ли символ-кандидат маске, и, очевидно, обработчик и маска code запускаются в том порядке, в котором они указаны.)
  5. Установите значение заполнителя на '' при вызове метода mask().
  6. Если вы попали в поле ввода с фокусом, вызовите метод select() в обработчике событий фокуса.

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

person BobRodes    schedule 14.09.2012
comment
Добавлять набранный символ к текущему значению не всегда правильно. Это делает невозможным редактирование текста в другом месте строки (например, введите WORLD, затем щелкните, чтобы поместить курсор в начало, и попробуйте сделать так, чтобы значение говорило HELLO WORLD ... вы получите WORLDHELLO). - person quietmint; 22.01.2013
comment
Хорошее замечание, пользователь. Я заимствовал из того, что написал, где это не было проблемой (я думаю), но, безусловно, могло быть. Я вернусь и дважды проверю свой код. Спасибо! - person BobRodes; 05.02.2013

Я знаю, что довольно опаздываю на вечеринку, но хочу предложить следующее:

(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 здесь

person Chris HG    schedule 01.12.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 +.

Сценарий: https://jsfiddle.net/GarryPas/ptez7q0q/3/

person garryp    schedule 31.08.2016

Хотя подход CSS + Server Side UCase, вероятно, «лучший», вот решение jQuery на стороне клиента, которое я использую, когда возникает необходимость:

$("#id").keyup(function() {
    $(this).val($(this).val().replace(/([a-z])/,function(s){return s.toUpperCase()}));
});

Она некрасива, но со своей работой справится!

person Campbeln    schedule 19.06.2012
comment
Нет ... это просто улучшает ситуацию при включении. вы видите проблему в конкретном браузере @esp? - person Campbeln; 14.02.2013
comment
Если бы эта вещь в сафари при изменении поля формы приводила к перемещению курсора в конец поля, так как он находится выше, он не позволит вам перемещать курсор со стрелками внутри поля. Возможно, если вы тщательно отфильтруете, какие клавиши не касаются поля, это может сработать. Но странно, что я не могу найти способ просто заменить символ по мере его ввода, прежде чем он будет вставлен. Хотя выглядело не очень сложно;) - person esp; 14.02.2013
comment
Не очень красиво, как вы говорите, но, безусловно, намного проще, чем красивое решение, которое я только что опубликовал. - person BobRodes; 01.07.2016

$("#id").keyup(function() {
    $(this).val($(this).val().replace(/([a-z])/,function(){
        return $("#id").toUpperCase();
    }));
});

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

person samrat chitta    schedule 26.07.2012
comment
Позиция курсора теряется - он переходит на последнюю позицию. Вы должны протестировать свое решение, прежде чем размещать его здесь. - person Danubian Sailor; 27.08.2013

person    schedule
comment
Использование Event.charCode вызовет предупреждение в консолях JS. Это предупреждение: The 'charCode' property of a keyupevent should not be used. The value is meaningless. Я не уверен, зачем вы его используете, если уже используете Event.which и Event.keyCode. - person ; 06.04.2011
comment
@MattMcDonald: Я просто взял код из примера и надеялся ответить на то, что хотел OP. ;) - person Shaz; 06.04.2011
comment
Это работает. Это просто выглядит некрасиво, потому что вы можете видеть, как текст меняется. Я думаю, что это вместе с преобразованием текста CSS - лучшее решение. Спасибо - person Butcher; 07.04.2011
comment
Вы не увидите, как изменяется текст, если вы используете keydown вместо keyup. - person BobRodes; 14.09.2012
comment
Положение курсора потеряно. Блок в if ничего не делает. - person Danubian Sailor; 27.08.2013
comment
e.currentTarget.value = e.currentTarget.value.toUpperCase (); внутри функции выглядит лучше, чем все эти вызовы jQuery. Выглядит проще и лучше работает, когда вам нужно связать несколько полей. Другая проблема заключается в том, что событие keydown работает не так хорошо, как keyup, потому что значение всегда пропускает последнюю введенную цифру. Я думаю, что решение Butcher - лучшее для этого случая. - person jairhumberto; 08.10.2014
comment
но если вы нажмете клавишу возврата (стрелка), эта функция отправит вас в конец значения = ( - person Marcelo Lujan; 18.08.2016

person    schedule
comment
.. но тогда вы можете поймать событие onchange и обновить значение до фактических символов верхнего регистра (если вы получите доступ к значению поля ввода, оно все равно будет строчными буквами) - person naivists; 06.04.2011
comment
Теперь это работает - в первой версии было upper-case вместо uppercase. :) +1 от меня, так как это умный ответ, но на самом деле не меняет значение текстового поля. - person Andrew Hare; 06.04.2011
comment
Это элегантное решение. На стороне сервера обычно все равно требуется обрабатывать нормализацию ввода. Я не знал, что CSS может это сделать. - person Pete; 02.05.2012
comment
Я знаю, что OP спросил, как это сделать с помощью JavaScript, однако я бы сказал, что это более элегантный и эффективный способ сделать это. Кроме того, его следует считать более удобным в обслуживании, чем такие вещи: if (e.which >= 97 && e.which <= 122) {. - person crmpicco; 28.08.2013
comment
text-transform:uppercase также делает HTML 5 placeholder текстом в верхнем регистре в поле ввода (я тестировал только в Chrome 41). мне это не понравилось, поэтому я выбрал решение JavaScript. - person Phil M; 09.04.2015
comment
Единственная проблема в том, что он также является заполнителем uc :( - person dlchambers; 25.09.2015
comment
Это аккуратное решение. Но с другой стороны, если у вас есть проверка ввода, которая требует верхнего регистра, например, британский почтовый индекс и т. Д., На самом деле это не будет верхний регистр, просто стиль - person Johnn5er; 27.01.2017

person    schedule
comment
самый простой способ преобразовать нижний регистр в верхний регистр - person T rakesh; 30.07.2015