【问题标题】:Validate error message styling验证错误消息样式
【发布时间】:2016-05-17 15:01:06
【问题描述】:

我试图让 jQuery Validate 错误类以某种方式显示,但很难让它工作。我希望验证消息直接出现在我的输入下。现在它们出现在我的输入下,但是整个输入跳到下一行。

输入自然是这样设置的:

姓名 -- 号码 -- 电子邮件

我希望消息显示如下:

姓名 -- 号码 -- 电子邮件

消息 -- 消息 -- 消息

现在它正在做:

名字

留言

数字

留言

电子邮件

留言

HTML 如下所示:

<form action="" method="POST" id="contact-form1">
                <input type="text" class="contact-input show-input" name="name" id="name" placeholder="Name *">
                <input type="text" class="contact-input show-input" name="number" id="number" placeholder="Phone Number *">
                <input type="text" class="contact-input show-input" name="email" id="email" placeholder="Email *">
                <input type="text" class="contact-input hidden-input" placeholder="Company Name">
                <input type="text" class="contact-input hidden-input" placeholder="Title">
                <input type="text" class="contact-input hidden-input" placeholder="Referral">
                <textarea class="contact-message" rows="10" name="message" id="message" placeholder="Your Message*"></textarea>
                <input type="submit" value="Submit" id="contact-submit">
            </form>

我尝试在每个输入周围包装 div,但这会将每个输入以块格式放在一个新行上。

这是一个小提琴,看看它在做什么:Fiddle

我做错了什么?

更新:

 submitHandler: function(form) {

        var name = $("#name").val();
        var number = $("#number").val();
        var email = $("#email").val();
        var message = $("#message").val();
        /*var company_name = $("#company_name");
        var title = $("#title");
        var referral = $("#referral");*/
        //var targeted_popup_class = jQuery(this).attr('data-popup-open');

        $.ajax({
          url: "map-send.php",
          type: "POST",
          data: {
            "name": name,
            "number": number,
            "email": email,
            "message": message
            /*"company_name": company_name,
            "title": title,
            "referral": referral*/
          },
          success: function(data) {

在上面的代码中,您将看到被注释掉的项目。这些是未经验证的项目。出于某种原因,当我删除评论标签时,我的页面就死了。没有错误,它只是在我提交页面时冻结。我尝试将变量放在验证标签之外,但它仍然没有帮助。你知道为什么这会杀死页面吗?

【问题讨论】:

  • 您的编辑仅供参考:您在三个已注释掉的项目上缺少.val()。但是,正如对我的回答的评论中所述,只需使用 jQuery .serialize() 而不是指定每个值。
  • @Sparky 我没有使用.val(),因为我不想验证这些项目。我只想通过ajax发送数据。这让我有点困惑。
  • jQuery .val() 检索“值”。它与验证完全无关。

标签: jquery html css jquery-validate


【解决方案1】:

the documentation

  1. 您不能将the onfocusout option 设置为true。它覆盖了插件的内部功能,从而破坏了它。它只能设置为false 以禁用此选项或覆盖功能。否则,请忽略此选项以保留默认情况下处于活动状态的 onfocusout 行为。

  2. 您在某些输入值上缺少.val(),因此您试图传递整个 jQuery 对象而不仅仅是其值。但是,不要尝试在 .ajax() 函数中手动指定每个值,而是使用 jQuery .serialize() 传递整个表单的数据字符串。

    data: $("#contact-form1").serialize(),
    

    submitHandler 函数内的任何地方,您都可以使用传递的form 参数变量...

    data: $(form).serialize(),
    
  3. 使用errorElementerrorPlacement 选项来确定错误消息在DOM 中的显示方式/位置。

    • errorElement 默认为label(内联元素),您可以将其更改为div(块级元素)或您可能需要的任何元素。下面以默认值为例。

      errorElement: 'label', // default
      
    • errorPlacement 默认在输入元素之后 插入错误消息。在您的情况下,您的结构会导致此包装,从而破坏您的布局。如果您希望消息出现在 DOM 中的其他位置,那么您需要编写一个新的 errorPlacement 函数。下面以默认设置为例。

      errorPlacement: function(error, element) {
          error.insertAfter(element); // default
      },
      

您的根本问题是您在设计表单布局时没有考虑到错误消息。您需要重新开始并制作一个可以在您想要的确切位置容纳错误消息元素的布局。那么这两个自定义的 jQuery Validate 函数可以动态创建错误消息元素并将其插入到您想要的位置。

概念证明示例

HTML

<form>
    <div class="input">
        <input type="text" name="name" />
    </div>
    <div class="input">
        <input type="text" name="number" />
    </div>
    ....

JavaScript

$("#contact-form1").validate({
    errorElement: 'div',
    errorPlacement: function(error, element) {
        error.insertAfter(element);  // default
    },
    rules: { ....

演示:https://jsfiddle.net/ng3a9xwz/


编辑:

检查 live DOM 发现...

<form novalidate="novalidate">
    <div class="input">
        <input type="text" name="name" class="error" />
        <div for="name" class="error">Please enter your name</div>
    </div>
    ....

errorElement: 'div' 将错误消息放入div,默认errorPlacementinput 元素之后立即插入这个新的div。设计您的布局(CSS 和 HTML)以适当地适应这些选项。您可以使用实时 DOM 中的标记进行布局测试。

【讨论】:

  • 这是 `errorElement: 'div',` 表示错误消息将在 div 中包含它所包裹的输入吗?
  • @Becky,,这只是说将创建一个 &lt;div&gt; 来包含每个错误消息,而不是默认的 &lt;label&gt; 元素。您可以使用浏览器中的开发人员工具来检查实时 DOM 并在创建这些动态元素时查看它们。请参阅我编辑的答案。
  • 谢谢。我在一个新的小提琴中尝试了这个,它就像我想要的一样工作(除了修复样式)。两个问题(如果你不介意的话,三个问题)。 1. live DOM 为什么显示novalidate="novalidate"。这是 validate 插件的默认值吗(这是否使它仅在提交被点击后才生效?) 2. 如果这个 error.insertAfter(element); // default 是默认值,那么为什么需要将它输入到代码中? 3. 查看我的问题更新......顺便说一句,感谢您帮助我解决这个问题并提供了很好的答案!
  • @Becky - 1. novalidate 由插件动态添加以禁用 HTML 5 验证。 2. 如果您只想要默认值,则不需要将errorPlacement 放入代码中...我只是将其放在那里进行演示。 3. 只需查找并使用 jQuery .serialize() 函数,而不是指定每个输入的值。
  • 感谢您的帮助!
【解决方案2】:

尝试将每个输入放在一个 div 中,然后将所有输入放在一个 div 中的一行中,将整体 div 设置为 100% 宽度,将内部 div 设置为 100/3 %

【讨论】:

  • 我有点理解你的意思,但你能详细说明一下吗?对内部 div 部分不太确定。
猜你喜欢
  • 1970-01-01
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
  • 2017-12-28
  • 2019-05-31
  • 2017-03-22
  • 2018-12-10
  • 1970-01-01
相关资源
最近更新 更多