Jak uzyskać wartość surową pola?

Jak mogę uzyskać "rzeczywistą" wartość pola <input type="number">?


Mam pole input i używam nowszego typu wejścia HTML5 number:

<input id="edQuantity" type="number">
Jest to najczęściej obsługiwane w Chrome 29:

Tutaj wpisz opis obrazka

Teraz potrzebuję możliwości odczytania "raw" wartości, którą użytkownik wprowadził w polu wprowadzania. Jeśli użytkownik wprowadził numer:

Tutaj wpisz opis obrazka

Potem edQuantity.value = 4 i wszystko jest dobrze.

Ale jeśli użytkownik wprowadzi nieprawidłowe tekst, chcę pokolorować pole wejściowe na Czerwono:

Tutaj wpisz opis obrazka

Niestety, dla pola wejściowego type="number", jeśli wartość w polu tekstowym nie jest liczbą, to value zwraca pusty łańcuch:

edQuantity.value = "" (String);

(przynajmniej w chromie 29)

Jak mogę uzyskać "raw" wartość kontrolki <input type="number">?

Próbowałem przejrzeć listę innych właściwości pola wejściowego Chrome:

Tutaj wpisz opis obrazka

Nie widziałem niczego, co przypomina rzeczywiste wejście.

Nie mogłem znaleźć sposobu, aby stwierdzić, czy pudełko "jest puste", czy nie. Może mógłbym wywnioskować:

value          isEmpty        Conclusion
=============  =============  ================
"4"            false          valid number
""             true           empty box; not a problem
""             false          invalid text; color it red

Uwaga: możesz zignorować wszystko po regule poziomej; to tylko wypełniacz, aby uzasadnić pytanie. Ponadto: nie myl przykładu z pytaniem. Ludzie mogą chcieć odpowiedzi na to pytanie z powodów innych niż zabarwienie pola na Czerwono (jeden przykład: konwersja tekstu "four" na symbol łaciński "4" podczas onBlur event)

Jak mogę uzyskać "raw" wartość kontrolki <input type="number">?

Bonus Reading

Author: Ian Boyd, 2013-09-17

4 answers

Zgodnie z WHATWG , nie powinieneś być w stanie uzyskać wartości, chyba że jest to poprawne wejście liczbowe. Algorytm sanityzacji pola numer wejściowy mówi, że przeglądarka powinna ustawić wartość na pusty łańcuch, jeśli wejście nie jest poprawną liczbą zmiennoprzecinkową.

Algorytm dezynfekcji wartości jest następujący: Jeśli wartość element nie jest poprawną liczbą zmiennoprzecinkową , następnie ustaw ją na pustą string zamiast tego.

Określając typ (<input type="number">) prosisz przeglądarkę, aby wykonała za Ciebie jakąś pracę. Z drugiej strony, jeśli chcesz mieć możliwość przechwytywania danych nieliczbowych i robienia z nimi czegoś, musisz polegać na starym sprawdzonym polu wprowadzania tekstu i samodzielnie analizować zawartość.

W3 ma te same specyfikacje i dodaje:

Agenci użytkownika nie mogą pozwolić użytkownikowi na ustawienie wartości niepustej string that is a valid Liczba zmiennoprzecinkowa.

 52
Author: j08691,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-17 15:15:55

Nie odpowiada na pytanie, ale przydatne obejście polega na sprawdzeniu

edQuantity.validity.valid

The ValidityState obiektu daje wskazówki o tym, co użytkownik wprowadził. Rozważmy wejście type="number" z zestawem min i max

<input type="number" min="1" max="10">

My zawsze chcemy używać .validity.valid.

Inne właściwości dają tylko informacje o bonusach:

User's Input  .value  .valid | .badInput  .rangeUnderflow  .rangeOverflow
============  ======  ====== | =========  ===============  ==============
""            ""      true   | false      false            false  ;valid because field not marked required
"1"           "1"     true   | false      false            false  
"10"          "10"    true   | false      false            false
"0"           "0"     false  | false      true             false  ;invalid because below min
"11"          "11"    false  | false      false            true   ;invalid because above max
"q"           ""      false  | true       false            false  ;invalid because not number
"³"           ""      false  | true       false            false  ;superscript digit 3
"٣"           ""      false  | true       false            false  ;arabic digit 3
"₃"           ""      false  | true       false            false  ;subscript digit 3

Musisz upewnić się, że przeglądarka obsługuje walidację HTML5 przed jej użyciem:

function ValidateElementAsNumber(element)
{
   //Public Domain: no attribution required.
   if ((element.validity) && (!element.validity.valid))
   {
      //if html5 validation says it's bad: it's bad
      return false;
   }

   //Fallback to browsers that don't yet support html5 input validation
   //Or we maybe want to perform additional validations
   var value = StrToInt(element.value);
   if (value != null)
      return true;
   else
      return false;
}

Bonus

Spudly ma przydatną odpowiedź, którą skasował:

Po prostu użyj selektora CSS :invalid.

input[type=number]:invalid {
    background-color: #FFCCCC;
}

Spowoduje, że twój element zmieni kolor na czerwony, gdy nie-numeryczny wpisywane jest poprawne.

Obsługa przeglądarki dla <input type='number'> jest mniej więcej taka sama jak :invalid, więc nie ma problemu.

Czytaj więcej o :invalid tutaj .

 47
Author: Ian Boyd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-17 16:05:09
input.focus();
document.execCommand("SelectAll");
var displayValue = window.getSelection().toString();
 11
Author: int32_t,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-18 02:50:34

Śledź wszystkie wciśnięte klawisze na podstawie ich kodów klawiszy

Przypuszczam, że można słuchać zdarzeń keyup i zachować tablicę wszystkich wprowadzonych znaków, na podstawie ich kodów klawiszy. Ale to dość żmudne zadanie i prawdopodobnie podatne na błędy.

Http://unixpapa.com/js/key.html

Wybierz wejście i uzyskaj wybór jako ciąg znaków

document.querySelector('input').addEventListener('input', onInput);

function onInput(){
  this.select(); 
  console.log( window.getSelection().toString() )
}
<input type='number'>

All credit to: int32_t

 3
Author: sandstrom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-17 12:20:09