24

我只需要允许用户在 textinput 中输入以下字符:

a-zA-Z0-9!@#$%^*_|

<form action="http://www.cknuckles.com/cgi/echo.cgi" method="get" name="logOn">
  User Name:<br />
  <input type="text" name="userName" size="25" /><br />
  Password:<br />
  <input type="password" name="pw" size="25" /><br />
  <input type="submit" value="Log In" onClick="validate()"/> 
</form>

上面是我的 HTML,下面是我试图用来验证它的 JavaScript - 但它不起作用 - 任何线索。

<script language="javascript">
   document.logOn.onsubmit=validate;

   function validate(){

var name=document.logOn.pw.value;
    if(!name = "[a-zA-Z0-9!@#$%^*_|]"){              
alert("Your Password Cant Have any thing other than a-zA-Z0-9!@#$%^*_| - Play It Straight!");
    return false;
}               

    return true;
}

</script>

但这不起作用。我仍然可以将字符放入 ">" 和 "<" 和 "{" 等。

有什么想法吗?

4

6 回答 6

43

您可以更改输入文本,如下所示:

<input type="text" pattern="[a-zA-Z0-9!@#$%^*_|]{6,25}" />

因此代码更改如下所示:

    <form action="#" method="get">
       User Name:<br />
       <input type="text" pattern="[a-zA-Z0-9!@#$%^*_|]{6,25}" /><br />
       Password:<br />
       <input type="password" /><br />
       <input type="submit" value="Log In" /> 
   </form>

这将在不使用 JavaScript 的情况下工作。pattern可以代替使用。表单验证比 JavaScript 更有效。

于 2013-05-08T06:42:32.670 回答
6

用这个

<script language="javascript">
document.logOn.onsubmit=validate;

function validate(){

var name=document.logOn.pw.value;
var reg=/[^a-zA-Z0-9\!\@\#\$\%\^\*\_\|]+/;
if(reg.test(name)){              
alert("Your Password Cant Have any thing other than a-zA-Z0-9!@#$%^*_| - Play It    Straight!");
return false;
}               

return true;
}

</script>
于 2013-05-08T06:57:14.763 回答
2

这应该做

<input type="text" name="something" pattern="[a-zA-Z0-9!@#$%^*_|]{0,100}">
于 2013-12-16T18:42:46.447 回答
2

无效输入

很多时候,我们希望在输入框上对用户可以输入的字符进行验证。其他字符将不会在输入框中输入。

问题:制作一个只接受数字空格的输入框。此外,请注意无效字符的复制粘贴 (Ctrl +V)。

第一步是在输入标签上注册事件。但是什么事件类型?我们正在向其中输入字符,因此keypress事件看起来不错。

<input type="text" id="input"/>
const input = document.getElementById('input');
var currentInputValue = '';
input.addEventListener('keypress', function inputKeypressHandler(e) {
    // keypress event on input box is listened here and this function is triggered
    // which key is pressed, keyPressed = e.which || e.keyCode; 
    const key = e.which || e.keyCode;
    // key code corresponds to digits 0-9 or space then okay
    // 0-9 key code is 48-57
    // space keycode is 32
    const SPACE = 32; // May be just stored somewhere
    const ZERO = 48;
    const NINE = 57;
    // valid digit is b/w 0-9 thus invalid will be lt 0 or gt 9
    const isNotValidDigit = key < ZERO || key > NINE;
    // if key is not a space or not a digit prevent this event
    if (key != SPACE || ( isNotValidDigit ) ) {
        e.preventDefault();
    }
});

这是一个很好的解决方案,但这并不能防止粘贴作弊。那是因为keypress事件只记录输入框中按下的键。需要更好的事件类型。input它在所有输入方式上运行,包括复制粘贴和拖动。

var currentInputValue = '';
input.addEventListener('input', function inputInputEventHandler(e) {
    // use target of event to get value of input
    const target = e.target;
    // we can use regex to check if current input value
    // is valid input
    const DIGITS_SPACE_REGEX = /^[0-9\s]*$/;
    // test if target.value or value of input box now is valid.
    // if value is valid then update currentInputValue 
    // target.value else its is not value and we will
    // ignore this target.value and replace it with 
    // previously valid value currentInputValue
    DIGITS_SPACE_REGEX.test(target.value) 
        ? ( currentInputValue = target.value ) 
        : ( target.value = currentInputValue );
});

这解决了我们的粘贴问题,但这里有一个问题。假设您粘贴了一些内容,Ctrl/Cmd + V您当前的光标位置将丢失并移至开始。这一定不能发生,您必须能够保留光标位置。

// Track cursor position
// cursor position is changed when you type something
const cursorState = {};
input.addEventListener('keydown', function inputKeydownHandler(e) {
    const target = e.target;
    // record the start and end
    cursorState.selectionStart = target.selectionStart;
    cursorState.selectionEnd = target.selectionEnd;
});

现在在input处理程序中

// modify
DIGITS_SPACE_REGEX.test(target.value) 
        ? ( currentInputValue = target.value ) 
        : ( target.value = currentInputValue );
 // to
 if (DIGITS_SPACE_REGEX.test(target.value)) {
     currentValue = target.value;
 }
 else {
    target.value = current.value;
    // restore cursor state
    target.setSelectionRange(
        cursorState.selectionStart,
        cursorState.selectionEnd
    );
 }
于 2020-05-09T13:55:50.577 回答
0

试试这个,如果它适合你,让我回复

function validate(){
        var name=document.logOn.pw.value;
        var test = new RegExp("[a-zA-Z0-9!@#$%^*_|]");
        if(!name.match(test)){              
           alert("Your Password Cant Have any thing other than a-zA-Z0-9!@#$%^*_| - Play It                     Straight!");
        return false;
  }               
   return true;
}

http://jsfiddle.net/KJEcG/

于 2013-05-08T06:56:49.350 回答
0

试试这个...

if(!/[a-zA-Z0-9!@#$%^*_|]./.test(name)){    
于 2013-05-08T06:57:34.403 回答