【问题标题】:Email validation using Javascript doesn't work with HTML使用 Javascript 的电子邮件验证不适用于 HTML
【发布时间】:2020-08-26 21:56:46
【问题描述】:

我试图让用户检查他的电子邮件地址是否通过 RFC 标准,并将其与下面的正则表达式进行比较。

我已经使用负责执行验证测试的函数在控制台上检查了几个示例。我知道我的正则表达式还没有准备好,但是每当我在控制台上尝试一些示例时,它都可以工作。

当函数从包含的“文本”HTML 表单中获取值时,问题就开始了。

使用 Javascript,我还检查了浏览器如何解释值(只需将文本粘贴到另一个 div 中)- 结果还可以。

为什么在 HTML 表单上使用输入值时验证不能正常工作?

const regular = /^[a-z/d]+[/d/w.-]*@(?:[a-z/d-]+[a-z/d-]\.+){1,5}[a-z]{1,3}[a-z]$/i;
test = function(email) {
    if (regular.test(email) == false) {
        alert('Your email adress is not correct. Try again!')
        document.getElementById('result').innerHTML = document.getElementById('text').value;
        return false;
    } else {
        alert('Match');
        return true;
    }
}
<div id='form-structure'>
   <form name='form1' action='#'>
      <label for='email' name='email'>E-mail</label>
      <input type='text' name='text' id='text' placeholder="Enter your email" required>
      <button type='submit' name='submit' onclick="test(document.form1.text)" 
         value='Submit'>Test</button>
   </form>
</div>
<div id='result' style='font-size: 15px'>
</div>

【问题讨论】:

  • 您可以使用&lt;input type="email"&gt; 字段。请注意,您的“常规”正则表达式远不符合 RFC — 请参阅regular-expressions.info/email.html — 它立即失败了something+something@example.commy 通用地址格式,因为 plus 而被拒绝,并且name@example.museum 失败(博物馆是一个有效的 TLD)Stackoverflow 有几十个(如果不是数百个)尝试正则表达式验证电子邮件地址的问题。
  • Szpotu — 虽然您接受了一个答案,但它的陈述 “您的问题在于 document.form1.text。简单地将其更改为 document.forms.form1.text 不正确。问题是不是您没有包含.forms.form1 并且单独使用了.form1。问题是你最后没有使用.value。如果您使用 onclick="test(document.form1.text.value)",您的代码会有效

标签: javascript html validation


【解决方案1】:

虽然这可能不是最好的代码示例,但您的问题的简单解决方案在于 document.form1.text。简单地把它改成document.forms.form1.text

例如

<button type='submit' name='submit' onclick="test(document.forms.form1.text.value)" 
         value='Submit'>Test</button>

编辑:

我之前错过了 .value。现在它应该可以工作了。

【讨论】:

  • document.form1.textdocument.forms.form1.text 都引用了&lt;input&gt; HTML 元素 object — 都没有引用 value 已在该输入控件中键入 in。请参阅 Nicolas 的回答。
  • 我在 OP 的问题中使用了“复制 sn-p 来回答”并进行了更改。它以与原始代码完全相同的方式和原因失败;因此,我对答案投了反对票。
  • @StephenP,您不会因为它不起作用而拒绝人们的回答。这就是为什么 SO 有一个按钮来标记已接受的答案。
  • 您肯定会否决错误的答案。将鼠标悬停在投票按钮上;它说“这个答案没用”。也许您应该阅读帮助中心Why is voting important? 上面写着“......不正确的内容落到底部”,以及vote down 主题,上面写着“投票反对,[...] 是社区的指示哪些问题和答案最没用。”在我看来,错误的答案没有用,应该被否决。
【解决方案2】:

您没有将正确的值传递给您的函数。在您的函数中,email 变量是

<input type="text" name="text" id="text" placeholder="Enter your email" required></input>

您需要传递给函数的是元素#test 的实际值。这可以使用此选择器进行检索。您可以在函数内部使用此选择器,也可以直接在函数调用中使用。后者是首选,就像Mr Zach 指出的那样。 :

 document.getElementById('text').value;

另外,您的正则表达式没有接缝正确。您在数字标记和单词标记中使用正斜杠 (/)。在这种情况下,您需要反斜杠 (\)。

我还删除了表单的submit 行为,这是为了方便调试。这不是您的问题的原因。

const regular = /^[a-z\d]+[\d\w.-]*@(?:[a-z\d-]+[a-z\d-]\.+){1,5}[a-z]{1,3}[a-z]$/i;

var test = function(email) {
    if (regular.exec(email) == null) {
        alert('Your email adress is not correct. Try again!')
        document.getElementById('result').innerHTML = document.getElementById('text').value;
        return false;
    } else {
        alert('Match');
        return true;
    }
}
<div id='form-structure'>
   <form name='form1' action=''>
      <label for='email' name='email'>E-mail</label>
      <input type='text' name='text' id='text' placeholder="Enter your email" required>
      <button type='button' name='submit' onclick="test(document.getElementById('text').value)" 
         value='Submit'>Test</button>
   </form>
</div>
<div id='result' style='font-size: 15px'>

</div>

【讨论】:

  • 应该将值传递给函数。不要让函数找到元素然后获取值。如果你让函数找到元素,你锁定你的函数只在这个元素上工作。
  • 这很好,一点。也许我可以直接在函数调用中使用document.getElementById('text').value 选择器。
  • this.form.text.value 没有任何问题,它不需要对按钮附近的东西进行完整的 DOM ID 扫描(或 OP 开头的 document.form1.text.value)。尽管给出了label 的值,但输入的名称似乎应该email(不是text
猜你喜欢
  • 2016-01-15
  • 2018-12-13
  • 1970-01-01
  • 1970-01-01
  • 2015-02-24
  • 2023-03-15
  • 2014-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多