每当我调用第二个函数validateNumber()时,在页面上工作时,我得到一个" typeError:String不是函数"任何人都可以向我解释为什么会出现此消息?我的代码如下:
< script type = "text/javascript" >
/* <![CDATA[ */
function validateLetter(dataEntry) {
try {
var textInput = dataEntry.value;
var replacedInput = textInput.replace(/[^A-Za-z]/g);
if (textInput != replacedInput)
throw "You can only enter letters into this field.";
dataEntry.value = replacedInput;
} catch (textInputError) {
window.alert(textInputError)
return false;
}
return true;
}
function validateNumber(dataEntry) {
try {
var textInput = dataEntry.value;
var replacedInput = textInput(/[^0-9]/g);
if (textInput != replacedInput)
throw "You can only enter numbers into this field.";
} catch (numberInputError) {
window.alert(numberInputError)
return false;
}
return true;
}
function validateInput(dataEntry) {
if (navigator.appName == "Microsoft INternet Explorer")
var enteredKey = dataEntry.keyCode;
else if (navigator.appName == "Netscape")
var eneteredKey = dataEntry.charCode;
}
/* ]] */
< /script>
&#13;
<form action="validateTheCharacters" enctype="application/x-www-form-urlencoded" name="dataEntry">
<p>Enter your mother's maiden name:
<input type="text" id="letter1" name="letter1" onkeypress="validateLetter(this)">
</p>
<p>Enter the city you were born in:
<input type="text" id="letter2" name="letter2" onkeypress="validateLetter(this)">
</p>
<p>Enter the street you grew up on:
<input type="text" id="letter3" name="letter3" onkeypress="validateLetter(this)">
</p>
<p>Enter your phone number:
<input type="text" id="number1" name="number1" onkeypress="validateNumber(this)">
</p>
<p>Enter the year you were born:
<input type="text" id="number2" name="number2" onkeypress="validateNumber(this)">
</p>
<p>Enter the number of siblings you have:
<input type="text" id="number3" name="number3" onkeypress="validateNumber(this)">
</p>
<p>
<button type="reset" value="Reset Form">Reset Form</button>
</p>
</form>
&#13;
答案 0 :(得分:2)
var replacedInput = textInput(/[^0-9]/g);
这不是你在Javascript中搜索和替换的方式。
目前还不太清楚你的目的是什么,但是如果你想从字符串中删除非数字,你可以使用String.replace()
来做到这一点:
var replacedInput = textInput.replace(/[^0-9]/g, "");
话虽如此,完成此检查的一种更简单的方法是完全跳过替换,而只使用String.match()
:
var textInput = dataEntry.value;
if (textInput.match(/[^0-9]/))
throw "You can only enter letters into this field.";
dataEntry.value = textInput;
答案 1 :(得分:2)
我几乎可以肯定这是问题所在:
var textInput = dataEntry.value;
var replacedInput = textInput(/[^0-9]/g);
如果textInput
是一个字符串,则无法将参数传递给它,就像它是一个函数一样,而是:
var replacedInput = textInput.replace(/[^0-9]/g, ""); // dependening in what you are trying to achieve of course
答案 2 :(得分:1)
您可能会考虑隔离功能,以便像 validateLetter 这样的函数只是验证它们传递的字符串只包含字母,然后让调用函数解决如果返回值为true,该怎么办?
在这种情况下,你最终会得到非常简单的功能:
function validateLetters(s) {
return /^[a-z]+$/i.test(s);
}
function validateNumbers(s) {
return /^\d+$/.test(s);
}
要验证输入,您可以添加一个类来说明它应该具有哪种类型的验证,例如
<input name="letter3" class="letter" onkeypress="validateLetter(this)">
然后 validateInput 函数可以根据类确定要调用哪个验证函数:
function validateInput(element) {
var value = element.value;
// If has class letter, validate is only letters
if (/(\s|^)letter(\s|$)/i.test(element.className)) {
// validate only if there is a value other than empty string
if (!validateLetters(value) && value != '') {
alert('Please enter only letters');
}
}
// If has class number, validate is only numbers
if (/(\s|^)number(\s|$)/i.test(element.className)) {
// validate only if there is a value other than empty string
if (!validateNumbers(element.value) && value != '') {
alert('Please enter only numbers');
}
}
}
请注意,按键不是用于验证的好事件,因为无需按任何键即可输入数据(例如,从上下文菜单粘贴或拖放)。此外,听众没有看到按键产生的值,它会看到之前的值。
您只需在提交表单时执行验证。在那之前,你为什么关心价值观是什么?允许用户犯错并自行修复,而不会受到警报的影响(屏幕提示非常有用)。花一些时间使用你的表单来增强它们的可用性(我意识到这可能不是一个生产形式,但是名字可以有除字母a到z之外的字符,例如 von Braun 和 O&# 39。赖利)
最后,表单控件很少需要ID,如果需要,名称通常足以识别它们(并且它们必须具有成功的名称,因此大多数都具有名称)。来自OP的一些播放HTML:
<form>
<p>Enter your mother's maiden name:
<input name="letter1" class="letter" onkeypress="validateInput(this)">
</p>
<p>Enter the number of siblings you have:
<input name="number3" class="number" onkeypress="validateInput(this)">
</p>
<p>
<input type="reset">
</p>
</form>