只接受在JavaScript中不起作用的数字和字母代码

时间:2016-09-10 03:11:39

标签: javascript

我试图阻止用户输入除数字和字母之外的任何内容,但我的代码甚至不允许它们本身。可能是什么原因?这是我的代码片段:

$(document).ready(function(){
    $("#txtuname").keypress(function(e){ 
        var validExp = /^[0-9a-z]+$/gi;
        var val = $(this).val();
        if(val.match(validExp))
        {
            $("#errmsg").html("");
            return true;
        }
        else
        {
            $("#errmsg").html("Number and letters Only"); 
            return false;
        }
    });
});


<input type="text" name="txtuname" id="txtuname" />
<span id="errmsg"></span>

JSFiddle

6 个答案:

答案 0 :(得分:1)

您可以使用keyup而不是keypress

$(document).ready(function(){
	$("#txtuname").keyup(function(e){ 
		var validExp = /^[0-9a-z]+$/gi;
		var val = $(this).val();
		if(val.match(validExp))
		{
			$("#errmsg").html("");
			return true;
		}
		else
		{
			$("#errmsg").html("Number and letters Only"); 
			return false;
		}
	});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 

<input type="text" name="txtuname" id="txtuname" />
<span id="errmsg"></span>

答案 1 :(得分:1)

您可以将input事件替换为keypress事件;将RegExp调整为/[0-9a-z]/i,将.split()与参数""Array.prototype.every()RegExp.prototype.test()一起使用,以检查if处输入值的每个字符条件如果每个字符都是数字或字母条件为true,则false使用value替换.replace()的无效字符RegExp /[^0-9a-z]/ig < / p>

&#13;
&#13;
$(document).ready(function() {
      var validExp = /[0-9a-z]/i;
      $("#txtuname").on("input", function(e) {
        var val = this.value;
        var check = val.split("").every(function(value) {
          return validExp.test(value)
        });
        if (check) {
          $("#errmsg").html("");
          return check;
        } else {
          this.value = val.replace(/[^0-9a-z]/ig, "");
          $("#errmsg").html("Number and letters Only");
          return false;
        }
      });
    });
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

<input type="text" name="txtuname" id="txtuname" />
<span id="errmsg"></span>
&#13;
&#13;
&#13;

答案 2 :(得分:1)

INSERT

答案 3 :(得分:0)

这是因为在将新字符添加到元素的值之前触发了按键事件(因此在添加第一个字符之前触发第一个按键事件,而值仍为空)。你应该使用keyup,这是在添加了角色reference后触发的。

这是代码

HTML

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 

<input type="text" name="txtuname" id="txtuname" />
<span id="errmsg"></span>

JS

$(document).ready(function(){
    $("#txtuname").keyup(function(e){ 
        var validExp = /^[0-9a-z]+$/gi;
        var val = $(this).val();
        if(val.match(validExp))
        {
            $("#errmsg").html("");
            return true;
        }
        else
        {
            $("#errmsg").html("Number and letters Only"); 
            return false;
        }
    });
});

答案 4 :(得分:0)

问题是您没有获得正在按下的键的值。如果像这样设置const webpack = require('webpack'); const path = require('path'); const devBuild = process.env.NODE_ENV !== 'production'; const nodeEnv = devBuild ? 'development' : 'production'; config = { entry: [ 'es5-shim/es5-shim', 'es5-shim/es5-sham', 'babel-polyfill', './app/Register.js', ], output: { filename: 'webpack-bundle.js', path: '../app/assets/webpack', publicPath: '/webpack/' }, resolve: { extensions: ['', '.js', '.jsx'], alias: { react: path.resolve('./node_modules/react'), 'react-dom': path.resolve('./node_modules/react-dom'), }, }, plugins: [ new webpack.DefinePlugin({ 'process.env': { NODE_ENV: JSON.stringify(nodeEnv), }, }), ], module: { loaders: [ { test: require.resolve('react'), loader: 'imports?shim=es5-shim/es5-shim&sham=es5-shim/es5-sham', }, { test: /\.jsx?$/, loader: 'babel-loader', exclude: /node_modules/, }, { test: /\.(png|svg)$/i, loaders: [ 'file?hash=sha512&digest=hex&name=[hash].[ext]', 'image-webpack?bypassOnDebug&interlaced=false' ] } ], }, }; module.exports = config; if (devBuild) { console.log('Webpack dev build for Rails'); // eslint-disable-line no-console module.exports.devtool = 'eval-source-map'; } else { config.plugins.push( new webpack.optimize.DedupePlugin() ); console.log('Webpack production build for Rails'); // eslint-disable-line no-console } 变量,它将按预期工作。

val

这会获得按下的键的ASCII码,然后转换为它所代表的字母或数字。然后你可以检查你的正则表达式。

答案 5 :(得分:0)

$(document).ready(function(){
    $("#txtuname").keyup(function(e){ 
        var validExp = /^[0-9a-z]+$/gi;
        var val = $(this).val();
        if(validExp.test(val))
        {
            $("#errmsg").html("");
            return true;
        }
        else
        {
            // fix the value of input field here 
            $(this).val("");
            $("#errmsg").html("Number and letters Only"); 
            return false;
        }
    });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" name="txtuname" id="txtuname" />
<span id="errmsg"></span>

  1. 如果您打算使用这种给定的技术,您需要使用keyup以便将字符“添加”到该值。

  2. 由于String.prototype.match实际上返回了匹配的数组,因此它不会按照您希望的方式工作。更不用说它比RegEx.prototype.test贵得多。

  3. 加成

    您可以使用在Get cursor position (in characters) within a text Input field

    中显示的输入字段中查找carret位置的技巧

    要在keyup上实际修复输入字段。