JavaScript字符串不是函数

时间:2014-11-17 01:03:54

标签: javascript html

每当我调用第二个函数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;
&#13;
&#13;

3 个答案:

答案 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>