Autor Zpráva
quatzael
Profil
Lze nějak jednoduše a účinně povolit v inputu type="text" pouze čísla, tzn.: 1234567890

Tzn. vůbec nedovolit napsat nějaké jiné znaky.

jQuery datepicker to umí, a umožňuje psát pouze čísla a tečky, jak to tedy prosím můžu udělat na konkrétní vybrané znaky, např. čísla?
weroro
Profil
V novších prehliadačoch môžeš použiť input type="number"
quatzael
Profil
weroro:
To je na nic. Tohle dovolí tam napsat co chci a když to není číslo a kliknu mimo input tak to celý smaže..
Já hledám řešení, kdy prostě Ti to nedovolí vůbec napsat nic i při fokusovaným inputu.


Navíc když tam zadáš: "45gg" tak Ti to nechá, když tam dáš "gg45" tak to celý smaže.. Naprosto k ničemu.


Není na to náhodou nějaký jQuery?
anonymni
Profil *
quatzael:
Není na to náhodou nějaký jQuery?
ne, stačí ti čistý JS. Událost onkeypress() a kontrola právě stisknuté klávesy.
Zechy
Profil
quatzael:
jQuery UI Spinner, ale ten funguje úplně stejně jako type="number"
quatzael
Profil
anonymni:
No ale co s tím? To mám potom to nečíslo nějak mazat?

$('#num-input').keypress(function(e){
if(e.which == neco){
//neco
}
 }); 
weroro
Profil
function numbersFormater(n)
{
    var a = n = n.split('\x20').join('').split('\xA0').join('');
    n = '';
    for (var j = 0; j < a.length; j++)
    {
        var cc = a.charCodeAt(j);
        if (cc >= 48 && cc <= 57) n += a.charAt(j);
    }
    return n;
}
document.getElementById('num-input').onkeyup = function (e)
{
    this.value = numbersFormater(this.value); 
};
(Je to škaredé riešenie)
Chamurappi
Profil
Reaguji na quatzaela:
<input onkeypress="return !isNaN(String.fromCharCode(event.charCode || event.keyCode))">
Ale nejsem si jistý vedlejšími efekty, ani universální kompatibilitou.
Vložení písmenek ze schránky tímhle skriptem zabránit nepůjde. K čemu zákaz nečíselných znaků potřebuješ?
quatzael
Profil
weroro:
Dík moc za snahu, ale musím uznat, že to je opravdu moc škaredé..


Chamurappi:
Tohle je lepší, ale povoluje to mezery. To by nešlo náhodou dát taky nějak pryč?


Chamurappi:
K čemu zákaz nečíselných znaků potřebuješ?
Když je input například pro to, aby uživatel zadal počet v celých čísel, tak je víc user-friendly když mu to prostě nedovolí tam psát něco co tam nepatří.
anonymni
Profil *
quatzael:
Když je input například pro to, aby uživatel zadal počet v celých čísel, tak je víc user-friendly když mu to prostě nedovolí tam psát něco co tam nepatří.
... pokud se bude držet toho, co má zadávat, tak je to user-friendly až až... pokud chce zkoušet, co mu projde, nebraň mu v tom (stejně, pamatuj na vypnutý JS)
Zechy
Profil
quatzael, anonymni:
Tomu se spíš nadává blbuvzdornost než user-friendly. Klasický uživatel ví, že když chceš číslo, tak máš zadat číslo.
Amunak
Profil
Něco podobného jsem dělal a mám několik poznatků:
1) tahat kvůli tomu jQuery je zbytečné
2) Kód, který naznačil Chamurappi, bude mít nežádoucí účinky
3) Těžko se dosahuje univerzální kompatibility mezi prohlížeči a stejně se některých věcí (jako je copy-paste) nedá moc zbavit
4) Spíš než vyloženě rušit keypress by mohlo v případě "jen čísla" být lepší po keypressu hledat v poli ne-čísla a odmazávat je

Mám něco takového:
(function() {
        $('input.js-sanitize-search-string').on('keypress', function(event) {
            var _event = event || window.event;
            var key = _event.keyCode || _event.which;
            // hack pro kontrolní klávesy
            if($.inArray(key, [13,8,9,16,17,18,19,20,27,33,34,35,36,37,38,39,40,45,46,91,92,93]) != -1) return true;
            key = String.fromCharCode(key);
            //povolené znaky
            var regex = /^[A-Za-z0-9 ěščřžýáíéúůďť�ĚŠČ�ŽÝ�ÍÉÚŮĎŤŇßäöüÄÖÜ]$/;
            if(!regex.test(key)) {
                _event.returnValue = false;
                if (_event.preventDefault)
                _event.preventDefault();
            }
        });
    })();

Věnujte pozornost hlavně tomu "hacku", který tam je proto, aby v poli normálně fungovaly klávesy jako šipky, tab, enter apod. V některých prohlížečích by šly i tak, jinde by se někdo mohl dost divit, proč že mu ten home a end nejde. Nevím, jestli je ten seznam kompletní, ale zatím si nikdo nestěžoval. Bez jQuery a jeho inArray by šlo prostě napsat
if(k==13,k==8,k==9,k==16/*...atd...*/) return true;
. Přes jQuery si tam ještě usnadňuji to vybírání elementů, ale pokud jde jen o jedno pole, prostě mu ručně vyplň onKeyPress.

První řádek té funkce se pokoušeí zajistit kompatibilitu se staršími prohlížeči. Druhý zajišťuje, aby se odchytilo všechno. Možná by to šlo zapsat elegantněji, ale tohle funguje.
_es
Profil
quatzael:
Ak tam má návštevník zadať číslo, no zadá niečo iné, tak si ho asi nedostatočne informoval, čo tam má zadať. Prečo neriešiš to, ale niečo, čo treba aj tak ešte overiť na serveri?
quatzael
Profil
Amunak:
Zkouším to, ale vůbec nic to nedělá.. Funkce se spustí, ale nic se opravdu neděje, chová se to furt jako klasickej input.. můžu tam psát co chci a povolí to všechno..


anonymni, Zechy, quatzael:
Je to taková pojistka, kdyby tam náhodou chtěl zadávat nějaký desetinný čárky apod.
Amunak
Profil
quatzael:
Tak to asi děláš něco špatně.

Ukázka (kód)

Tím že nerozlišuju mezi keyCode a which se mi některá čísla jakoby "sloučí", ale jeslti to chceš ještě tak nějak zdokonalit, budeš si to muset udělat sám.
quatzael
Profil
Amunak:
Teď to funguje, ale prve jsi uvedl jen kód, který umožňuje všechny klávesy.

Tím že nerozlišuju mezi keyCode a which se mi některá čísla jakoby "sloučí"
Nerozumím, jak sloučí?
Amunak
Profil
quatzael:
Netvrdil jsem, že je to už upravený kód.

Nerozumím, jak sloučí?
Jestli tomu rozumím dobře, když je keyCode prázdný a použije se which, můžeš dostat zpátky číslo, které odpovídá nějaké klávese, která píše znaky. Když to pak povolíš, jde ti jak ta povolená kontrolní klávesa, tak i nějaká jiná, která něco píše. Třeba proto jsem zakázal klávesu delete, aby nešla psát desetinná tečka, nebo tak něco.
pcmanik
Profil
quatzael:
Malo by fungovať, nemám teraz prístup k pc tak nemám ako vyskúšať.
element.onkeypress = function (event) {
    event = event || window.event;

   if (!/\d/.test(String.fromCharCode(event.keyCode))) event.preventDefault ? event.preventDefault() : event.returnValue = false;
};
quatzael
Profil
pcmanik:
Jo tohle funguje. A vypadá, že bez problému. Dík moc!

Tak teď ale který řešení je vhodnější? Tvoje nebo Amunakovo?
Amunak
Profil
quatzael:
To jeho

Ačkoliv se mi úplně nedaří reprodukovat funkčnost.
pcmanik
Profil
Amunak:
keyCode klávesy sa premení na string a ten sa následne odtestuje voči reguláru či sa jedná o číslo. Ak sa nejedná o číslo tak sa podľa prehliadačov zablokuje písanie - pre tie "normálne" preventDefault a pre IE returnValue.
Alebo som zle pochopil tú vetu?
Amunak
Profil
pcmanik:
Já jsem pochopil jak to funguje, ale nepodařilo se mi to rozchodit na té původní ukázce. Akorát... Neblokuje ti to náhodou taky klávesy jako home, end, šipky, tab, escape a podobně?
Právě proto by asi bylo u obou ukázek lepší používat jenom event.charCode.
quatzael
Profil
Amunak:
Neblokuje ti to náhodou taky klávesy jako home, end, šipky, tab, escape a podobně?
Mě to neblokuje nic (obě řešení jsou ok) i na jiných prohlížečích.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: