input ограничение на ввод числа

Discussion in 'PHP' started by The46Doctor, 3 Jul 2012.

  1. The46Doctor

    The46Doctor New Member

    Joined:
    31 May 2012
    Messages:
    44
    Likes Received:
    0
    Reputations:
    0
    есть поле input
    Как средствами js ограничивать величину вводимого числа?
    Есть свои варианты, но они кривоваты. Хотелось бы прочитать советы более опытных людей.
     
  2. MaxFast

    MaxFast Elder - Старейшина

    Joined:
    12 Oct 2011
    Messages:
    569
    Likes Received:
    146
    Reputations:
    94
    Code:
    function limitText(limitField, limitCount, limitNum) {   if (limitField.value.length > limitNum) {   limitField.value = limitField.value.substring(0, limitNum);   } else {   limitCount.value = limitNum - limitField.value.length;   }   }
    Code:
    <form name="form">   <textarea name="message" onKeyDown="limitText(this,this.form.count,30);"   onKeyUp="limitText(this,this.form.count,30);">   </textarea>   <br>   <input readonly type="text" name="count" size="3" value="30"> символов осталось.   </form>
    (c) Google
     
  3. The46Doctor

    The46Doctor New Member

    Joined:
    31 May 2012
    Messages:
    44
    Likes Received:
    0
    Reputations:
    0
    величину вводимого числа
    А не его длину.
     
  4. |qbz|

    |qbz| Banned

    Joined:
    25 Dec 2009
    Messages:
    385
    Likes Received:
    169
    Reputations:
    65
    HTML:
    <script>
    	numlimit = 999; // tut postavish limit
    	
    	window.onload = function()
    	{
    		var oldvalue = document.getElementById('txtlimit').value;
    	}
    </script>
    
    <input type="text" id="txtlimit" onKeyUp="if(this.value>numlimit){this.value=oldvalue;alert('Wrong number!');}else{oldvalue=this.value;}">
     
  5. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Только вот не сработает, если юзер кликнет правой кнопкой и вставит из буфера обмена большое число в input. Да и буквы не фильтруются... Самым надежным вариантом, по-моему, будет сделать numeric up-down.
     
    #5 GRRRL Power, 3 Jul 2012
    Last edited: 3 Jul 2012
  6. bdsql

    bdsql New Member

    Joined:
    28 Dec 2011
    Messages:
    12
    Likes Received:
    2
    Reputations:
    0
    http://caniuse.com/input-number
    браузеры !html5 не поймут numberic up-down.
    по моему через js все лучше фильтровать.
     
  7. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Почему это? Делаешь div для номера, пару div'ов - кнопки вверх-вниз, биндишь ивенты нажатия на них, сам все рисуешь и контролируешь... Даже IE 4 понял бы.
     
    1 person likes this.
  8. Apeckou

    Apeckou Elder - Старейшина

    Joined:
    23 Jan 2007
    Messages:
    143
    Likes Received:
    11
    Reputations:
    0
    Не тупите

    Code:
    <input id="myinput" onchange="javascript:checkme(this.id,123);" onkeyup="this.onchange();" onkeydown="this.onchange();">
    
    <script>
    function checkme(id,maxnum)				{
    var inp=document.getElementById(id);
    if(isNaN(inp.value,10)){inp.value=0;}
    if(parseInt(inp.value,10)>=maxnum){inp.value=maxnum;}
    							}
    </script>
    
     
    #8 Apeckou, 4 Jul 2012
    Last edited: 4 Jul 2012
    1 person likes this.
  9. Melfis

    Melfis Elder - Старейшина

    Joined:
    25 Apr 2011
    Messages:
    505
    Likes Received:
    105
    Reputations:
    53
    Не пиши больше на js
     
  10. Apeckou

    Apeckou Elder - Старейшина

    Joined:
    23 Jan 2007
    Messages:
    143
    Likes Received:
    11
    Reputations:
    0
    напиши код лучше, ждем
     
  11. Melfis

    Melfis Elder - Старейшина

    Joined:
    25 Apr 2011
    Messages:
    505
    Likes Received:
    105
    Reputations:
    53
    Мне лень, посмотри среди тех, где плюсы ставили.
     
  12. Чакэ

    Чакэ Elder - Старейшина

    Joined:
    15 Aug 2010
    Messages:
    260
    Likes Received:
    66
    Reputations:
    62
    bitch, please
    Code:
    <input oninput="a=this.value.replace(/[^\d]+/g,'');this.value=a>10?10:a">
     
  13. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Чакэ,
     
  14. Чакэ

    Чакэ Elder - Старейшина

    Joined:
    15 Aug 2010
    Messages:
    260
    Likes Received:
    66
    Reputations:
    62
    Code:
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
    <html><head></head>
    <body>
    <input oninput="a=this.value.replace(/[^\d]+/g,'');this.value=a>10?10:a">
    </body>
    </html>
    работает в opera12 ff13 & chrome20, а то что там разработчики осла решили использовать вместо стандартов, меня, мягко скажем, не ебёт.
     
  15. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Написано же - oninput в стандарт не входит.
     
  16. Чакэ

    Чакэ Elder - Старейшина

    Joined:
    15 Aug 2010
    Messages:
    260
    Likes Received:
    66
    Reputations:
    62
    может в стандарт и не входит. но у меня проблем с этим не было никогда в нормальных браузерах. можете считать меня быдлокодером.
     
    1 person likes this.
  17. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    PHP:
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    <
    html>
    <
    head>
    <
    style>
    .
    numeric_parent {
        
    overflowhidden;
    }
    .
    numeric_right {
        
    floatleft;
        
    width20px;
        
    height20px;
        
    background#888;
        
    border1px solid #888;
    }
    .
    numeric_left {
        
    floatleft;
        
    overflowhidden;
        
    height20px;
        
    width100px;
        
    background#eee;
        
    text-alignright;
        
    border1px solid black;
    }
    .
    numeric_up {
        
    height10px;
        
    background-colorred;
    }
    .
    numeric_down {
        
    height10px;
        
    background-colorblue;
    }
    .
    numeric_dummy {
        
    clearleft;
    }
    </
    style>
    <
    script language='JavaScript'>
    var 
    input_timeout;
    var 
    ticks 0;

    function 
    start_numerics()
    {
        if(
    document.getElementsByClassName == undefined) {
           
    document.getElementsByClassName = function(cl) {
              var 
    retnode = [];
              var 
    myclass = new RegExp('\\b'+cl+'\\b');
              var 
    elem this.getElementsByTagName('*');
              for (var 
    0elem.lengthi++) {
                 var 
    classes elem[i].className;
                 if (
    myclass.test(classes)) {
                    
    retnode.push(elem[i]);
                 }
              }
              return 
    retnode;
           }
        };
        
        var 
    numeric_controls document.getElementsByClassName("numeric_updown");
        var 
    numeric_controls_array = Array.prototype.slice.call(numeric_controls0);

        for(var 
    0numeric_controls_array.length; ++i)
        {
            var 
    numeric_controls_array[i];
            if(
    c.tagName == 'INPUT' && c.type == "text")
            {
                var 
    main_elem document.createElement("div");
                var 
    value_elem document.createElement("div");
                var 
    controls_elem document.createElement("div");
                var 
    up_elem document.createElement("div");
                var 
    down_elem document.createElement("div");
                var 
    dummy document.createElement("div");
                
                
    main_elem.clessName "numeric_parent";
                
    value_elem.className "numeric_left";
                
    controls_elem.className "numeric_right";
                
    up_elem.className "numeric_up";
                
    down_elem.className "numeric_down";
                
    dummy.className "numeric_dummy";
                
                
    value_elem.innerHTML c.value;
                
                
    c.parentNode.insertBefore(main_elemc);
                
    main_elem.appendChild(value_elem);
                
    main_elem.appendChild(controls_elem);
                
    controls_elem.appendChild(up_elem);
                
    controls_elem.appendChild(down_elem);
                
    main_elem.appendChild(dummy);
                
                var 
    max_number parseInt(c.getAttribute('max_number'));
                (function(
    xyz)
                {
                    
    up_elem.onmousedown = function(){ return add_value(xyz); };
                    
    up_elem.onmouseup = function(){ clearInterval(input_timeout); }
                    
    down_elem.onmousedown = function(){ sub_value(xy); }
                    
    down_elem.onmouseup = function(){ clearInterval(input_timeout); }
                })
                (
    value_elemcmax_number);
                
                
    c.style.display "none";
            }
        }
    }

    function 
    get_increment(t)
    {
        if(
    <= 20)
            return 
    1;
        if(
    <= 50)
            return 
    10;
            
        return 
    100;
    }

    function 
    add_value_timeout(dispcontrolmax_numberfirst_tick)
    {
        var 
    value parseInt(control.value);
        
    value += get_increment(ticks);
        if(
    value max_number)
            
    value max_number;
        
        
    control.value value;
        
    disp.innerHTML control.value;
        
        if(
    first_tick)
        {
            
    clearInterval(input_timeout);
            
    input_timeout setInterval(function(){add_value_timeout(dispcontrolmax_number);}, 50);
        }
        
        ++
    ticks;
    }

    function 
    sub_value_timeout(dispcontrolfirst_tick)
    {
        var 
    value parseInt(control.value);
        
    value -= get_increment(ticks);
        if(
    value 0)
            
    value 0;
            
        
    control.value value;
        
        
    disp.innerHTML control.value;
        
        if(
    first_tick)
        {
            
    clearInterval(input_timeout);
            
    input_timeout setInterval(function(){sub_value_timeout(dispcontrol);}, 50);
        }
        
        ++
    ticks;
    }

    function 
    add_value(dispcontrolmax_number)
    {
        
    ticks 0;
        
    add_value_timeout(dispcontrolmax_number);
        
    input_timeout setInterval(function(){add_value_timeout(dispcontrolmax_numbertrue);}, 500);
    }

    function 
    sub_value(dispcontrol)
    {
        
    ticks 0;
        
    sub_value_timeout(dispcontrol);
        
    input_timeout setInterval(function(){sub_value_timeout(dispcontroltrue);}, 500);
    }

    window.onload = function() {start_numerics();}
    </script>
    </head>
    <body>
    <form>
    <input type="text" class="numeric_updown" name="val1" value="123" max_number="200"><br />
    <input type="text" class="numeric_updown" name="val2" value="100" max_number="5000"><br />
    <input type="text" class="numeric_updown" name="val3" value="100500" max_number="500000"><br />
    <input type="text" class="numeric_updown" name="val4" value="5" max_number="10"><br />
    <input type="submit" value="Send">
    </form>
    </body>
    </html>
    Идея понятна, работать будет во всех браузерах. Со стилями только помудрить, чтобы отображалось все нормально и на кнопках картинки "вверх" и "вниз" были. Форма отправляется хорошо, несмотря на полную "яваскриптовость" контролов. Кстати, код будет работать и без JavaScript - просто отобразятся поля ввода.
     
    #17 GRRRL Power, 4 Jul 2012
    Last edited: 4 Jul 2012
    1 person likes this.