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:
Teraz potrzebuję możliwości odczytania "raw" wartości, którą użytkownik wprowadził w polu wprowadzania. Jeśli użytkownik wprowadził numer:
Potem edQuantity.value = 4
i wszystko jest dobrze.
Ale jeśli użytkownik wprowadzi nieprawidłowe tekst, chcę pokolorować pole wejściowe na Czerwono:
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:
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
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.
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.
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();
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
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