2012-10-12 57 views
3

在我的项目中,我只有数字值的文本字段。但是当我使用ctl + c复制字母并使用ctl + v粘贴时,它将允许文本中的字母所以我使用下面的代码禁用了复制和粘贴。使用jquery禁用文本字段中的字母复制

$('input').bind('copy paste', function(e) { 
e.preventDefault(); 
}); 

但我只想防止字母。这意味着我想复制粘贴数字值不是字母。

回答

6

试试这个功能。这可能不是你正在寻找的东西,但你可以做一些事情。我之前做过这些,并发布在我的博客上。

JS:

$(function(){ 
       $(".numericOnly").bind('keypress',function(e){ 
          if(e.keyCode == '9' || e.keyCode == '16'){ 
           return; 
          } 
          var code; 
          if (e.keyCode) code = e.keyCode; 
          else if (e.which) code = e.which; 
          if(e.which == 46) 
           return false; 
          if (code == 8 || code == 46) 
           return true; 
          if (code < 48 || code > 57) 
           return false; 
        } 
       ); 
       $(".numericOnly").bind("paste",function(e) { 
        e.preventDefault(); 
       }); 
       $(".numericOnly").bind('mouseenter',function(e){ 
         var val = $(this).val(); 
         if (val!='0'){ 
          val=val.replace(/[^0-9]+/g, "") 
          $(this).val(val); 
         } 
       }); 
      }); 

HTML:

<body> 
     <input type="text" id="textBox" class="numericOnly" /> 
</body> 

这将允许你只输入唯一的数值。你甚至不能复制粘贴和拖放。

DEMO

Code Link

1

这个函数是针对jQuery的。它允许只有数字到文本框 验证码:

jQuery.fn.filter = function() { 
    $(this).keydown(function (e) { 
     if (e.shiftKey || e.ctrlKey || e.altKey) { // if shift, ctrl or alt keys held down 
      e.preventDefault();   // Prevent character input 
     } else { 
      var n = e.keyCode; 
      if (!((n == 8)    // backspace 
      || (n == 46)    // delete 
      || (n >= 35 && n <= 40)  // arrow keys/home/end 
      || (n >= 48 && n <= 57)  // numbers on keyboard 
      || (n >= 96 && n <= 105)) // number on keypad 
      ) { 
       e.preventDefault();  // Prevent character input 
      } 
     } 
    $(document).mousedown(function(e){ 
    if(e.button == 2) { 
     e.preventDefault();   // Prevent character input 
     } else { 
      var n = e.keyCode; 
      if (!((n == 8)    // backspace 
      || (n == 46)    // delete 
      || (n >= 35 && n <= 40)  // arrow keys/home/end 
      || (n >= 48 && n <= 57)  // numbers on keyboard 
      || (n >= 96 && n <= 105)) // number on keypad 
      ) { 
       e.preventDefault();  
      } 
    } 
    }); 
} 

林新台币确定自己正确的需要,但尝试。如果它的nt wat你想要的话。

+0

http://aseptik.net/demo/allowing-just-numeric-text-on-input-text-field/为你演示需要我相信。 – Okky

+0

但此代码只适用于按键按下鼠标右键点击 –

+0

@ user1647898我有posy一个答案,照顾鼠标右键单击 – jaychapani

1

我对你的问题有一个有趣的解决方法。对于paste事件你可以使用下面的代码:

$("input").on("paste", function(e) { 
    var that = this; 
    that.style.color = "#fff";  // field background color 
    setTimeout(function() { 
     that.value = that.value.replace(/\D/g, ""); 
     that.style.color = "#000"; // normal field font color 
    }, 100); 
});​ 

DEMO:http://jsfiddle.net/dgWDX/

3

查看事件对象和 “duckduckgoing” 了一下后:

$('input').on('paste', function (event) { 
    if (event.originalEvent.clipboardData.getData('Text').match(/[^\d]/)) { 
     event.preventDefault(); 
    } 
}); 

我有不知道如何跨浏览器,这是但如果向后兼容性不成问题,请继续使用它。

瞧瞧吧codepen

PS:我使用的是谷歌Chrome浏览器版本22在Mac OS 10.6

编辑:火狐13不具备clipboardData对象,即10都不是,Safari浏览器5.1.2支持它(所以它是一个webkit功能)。

1

jaychapani提供的解决方案几乎适用于此用户的特定问题。但是,它可以防止粘贴任何东西,甚至是数字。

我稍微修改了代码,现在Javascript(a)允许用户粘贴数字,但(b)不允许使用字母和特殊字符。我删除从上面jaychapani的例子如下:

  $(".numericOnly").bind("paste",function(e) { 
       e.preventDefault(); 
      }); 

最后的代码是:

  $(function(){ 
      $(".numericOnly").bind('keypress',function(e){ 
         if(e.keyCode == '9' || e.keyCode == '16'){ 
          return; 
         } 
         var code; 
         if (e.keyCode) code = e.keyCode; 
         else if (e.which) code = e.which; 
         if(e.which == 46) 
          return false; 
         if (code == 8 || code == 46) 
          return true; 
         if (code < 48 || code > 57) 
          return false; 
       } 
      ); 

      $(".numericOnly").bind('mouseenter',function(e){ 
        var val = $(this).val(); 
        if (val!='0'){ 
         val=val.replace(/[^0-9]+/g, "") 
         $(this).val(val); 
        } 
      }); 
     }); 

这个工程并粘贴或者使用CTL + V或从菜单时会拒绝字母和特殊字符。不过,我注意到,在表单拒绝之前,用户粘贴不需要的字符后,有时会出现延迟。

通常情况下,拒绝不需要的字符只会在一两秒后发生。但是有少数情况下,在文本被清除之前等待约10秒。我猜这是因为(a)我很清新,观察行为和一些奇怪的缓存行为导致Javascript的延迟工作很快或(b)一些循环问题的Javascript或(c)一些组合的都。

虽然这在大多数生产环境中都能正常工作。我怀疑用户在提交前一遍又一遍刷新页面。

但是,我想知道是否有更优化的解决方案。欢迎提出改进这方面的建议。

相关问题