【问题标题】:More efficient way of writing this javascript编写此 javascript 的更有效方式
【发布时间】:2012-01-06 00:34:59
【问题描述】:

我正在为我的网站创建一个联系表单,并在提交之前使用 javascript 进行第一层验证,然后通过 php 再次检查,但我对 javascript 比较陌生,这是我的脚本...

$("#send").click(function() {
    var fullname = $("input#fullname").val();
    var email = $("input#email").val();
    var subject = $("input#subject").val();
    var message = $("textarea#message").val();
    if (fullname == ""){
        $("input#fullname").css("background","#d02624");
        $("input#fullname").css("color","#121212");
    }else{
        $("input#fullname").css("background","#121212");
        $("input#fullname").css("color","#5c5c5c");
    }
    if (email == ""){
        $("input#email").css("background","#d02624");
        $("input#email").css("color","#121212");
    }else{
        $("input#email").css("background","#121212");
        $("input#email").css("color","#5c5c5c");
    }
    if (subject == ""){
        $("input#subject").css("background","#d02624");
        $("input#subject").css("color","#121212");
    }else{
        $("input#subject").css("background","#121212");
        $("input#subject").css("color","#5c5c5c");
    }
    if (message == ""){
        $("textarea#message").css("background","#d02624");
        $("textarea#message").css("color","#121212");
    }else{
        $("textarea#message").css("background","#121212");
        $("textarea#message").css("color","#5c5c5c");
    }
    if (name && email && subject && message != ""){
        alert("YAY");
    }
});

如果所有字段都填写完毕,我怎样才能更有效地编写这个并显示警报,谢谢。

【问题讨论】:

  • 你知道这个:if (name && email && subject && message != "") 没有将所有这些变量与空字符串进行比较,只有message?您可能的意思是if (name != "" && email != "" && subject != "" && message != "") 您的方式仍然有效,因为if (someVar) 测试是否可以将someVar 强制转换为“真实”值,并且非空字符串是“真实”,但如果您要依赖那为什么要在最后测试message != ""。 (或者,如果您将 name 更改为 fullname 以匹配变量声明,您的方式起作用。)

标签: javascript jquery forms validation


【解决方案1】:
$("#send").click(function() {
    var failed = false;

    $('input#fullname, input#email, input#subject, textarea#message').each(function() {
        var item = $(this);
        if (item.val()) {
            item.css("background","#121212").css("color","#5c5c5c");
        } else {
            item.css("background","#d02624").css("color","#121212");
            failed = true;
        }
    });

    if (failed){
        alert("YAY");
    }
});

【讨论】:

  • 实际上,如果设置了 any 项,则似乎设置了failed,而在原始代码中,必须设置 every 项。交换truefalse 应该可以,我相信(通过)。
  • 当至少一个元素为空时,failed 为 TRUE。所以只有 if(failed) 应该固定为 if (!failed)。我认为 YAY 是错误的 ;-)
  • 好的,其他人似乎已经放弃了,与其他解决方案不同,这个解决方案实际上按照我的预期工作,因为它已修复,谢谢你的帮助,你是这个的新拥护者页面!
  • 就像我在 Lyndon 帖子的评论中写的那样,使用类,不要使用这样的静态 css 规则。 CSS 规则属于 css 文件 ;-)
  • +1 用于向他展示多个选择器和链接。该功能极大地阐明了您的代码。
【解决方案2】:

glavic 和 matt 的答案正是我要建议的,但我会更进一步,将逻辑与演示分开。

当字段包含无效条目时,在您的 css 中定义类,并使用 $.addClass()$.removeClass() 添加或删除该类

【讨论】:

  • ^ this - 当我更清楚地知道您确实应该有一个预定义的类来指示错误时,我一直在这样做。
  • 是的。我从不在 javascript 中使用静态 css 选项。所有 css 都在 *.css 文件中 ;-)
【解决方案3】:

由于您使用的是 jQuery,我建议在每个需要非空值 (class="required") 的字段上设置一个类。

然后你做这样的事情:

var foundEmpty = false;
$(".required").each(function()
{
   if($(this).val())
   {
       foundEmpty=true;
       $(this).style("background-color", "red");
   }
});
if(foundEmpty)
{
  alert("One or more fields require a value.");
}

【讨论】:

    【解决方案4】:

    给他们一个公共类,定义类来应用样式,然后这样做:

    JS

    $("#send").click(function() {
        $('.validate').attr("class", function() {
            return $(this).val() === "" ? "validate invalid" : "validate valid";
        });
        if( $('.invalid').length === 0 ) {
            alert('YAY');
        }
    });
    

    CSS

    .valid {
        background:#121212;
        color:#5c5c5c
    }
    
    .invalid {
        background:#d02624;
        color:#121212;
    }
    

    HTML

    <button id="send">SEND</button><br>
    <input class="validate"><br>
    <input class="validate"><br>
    <input class="validate"><br>
    <input class="validate">
    

    JSFIDDLE DEMO


    更有效的方法:

    var validate = $('.validate');
    
    $("#send").click(function() {
        validate.attr("class", function() {
            return $(this).val() === "" ? "validate invalid" : "validate valid";
        });
        if( validate.filter('.invalid').length === 0 ) {
            alert('YAY');
        }
    });
    

    【讨论】:

    • 不错的解决方案,但是如何检查所有字段是否不为空并执行脚本的下一部分,例如 if (complete){alert("YAY");}
    • @nblackburn:是的,我把它留了下来。已更新。
    • 太棒了,有没有机会在不向表单字段添加另一个类的情况下这样做,因为我已经定义了它们。
    • @nblackburn:你是指哪个班?您可以使用现有的类代替我使用的"validate" 类。添加像"valid""invalid" 这样的额外类是无害的。所以就让它"your_current_class invalid""your_current_class valid"吧。
    • 啊,我提出了一种使用您的代码的方法,而无需将“验证”类添加到我想要验证的字段中,我知道我可以添加多个类,但它开始看起来很乱,所以我是试图减少使用太多。
    【解决方案5】:

    您可以使用 jQuery 遍历每个对象并获取它们的值。根据您的表单,此代码会发生变化,但它只是给您一个示例。我可能在这里和那里遗漏了几个括号,但概念就在那里。

    var objectName=$(this).attr('id');    
    $('#formId').children().each(
            function(){
    
                if ($(this).value == ""){
                     $(this).css("background","#d02624");
                     $(this).css("color","#121212");
                     $error[objectName]='true';
    
                }else{
                     $(this).css("background","#121212");
                     $(this).css("color","#5c5c5c");
                     $error[objectName]='false';
                }
    
    
    
    
            }
        );
               $.each(error, function(key, value){
    
    
                    if (value=='false'){
                      alert (key + 'is empty');
                    }
               });
    

    【讨论】:

      【解决方案6】:

      我可能会将其中的一部分分成我的 css 文件。如果任何字段为空,则向对象添加类似“empty”的类,如果不是,则将其删除。然后在您的 css 文件中,您可以添加一些描述符,例如:

      input#fullname,
      input#email {
         ...
      }
      
      input#fullname.empty,
      input#email.empty {
          ...
      }
      

      您可以使用 jQuery addClass() 和 removeClass()。

      然后您可以按如下方式添加循环:

      var inputs = new Array();
      inputs[0] = "input#fullname";
      inputs[1] = "input#email";
      inputs[2] = "input#subject";
      inputs[3] = "textarea#message";
      var complete = true;
      for (var i = 0; i < 4; i++) {
          var value = $(inputs[0]).val();
          if (value.length > 0) {
              $(inputs[i]).removeClass("empty");
          } else {
              complete = false;
              $(inputs[i]).addClass("empty");
          }
      }
      if (complete) {
      }
      

      编辑:

      好了,给你修好了。

      【讨论】:

      • 谢谢老兄,这对我来说意义重大,我没想过将所有字段名称添加到数组中,好主意!
      • 将此解决方案与马特的解决方案合并将使此代码非常坚如磐石。如果您需要向表单添加控件,您只需将其添加到 html 和 css。
      • 这个答案是如何被接受的?在那一点点代码中,您已经设法挤进了SyntaxErrorReferenceErrorTypeError
      • @RightSaidFred,我们不是在这里为寻找答案的用户检查代码,我们在这里让他们走上正确的道路。我预计会有错误,但我希望 OP 可以理解省略号不是 javascript 中的有效指令,并且当我输入小的错别字时,它们很容易被识别和纠正。
      • “我们不是在这里为寻找答案的用户检查代码” 当然可以。而且我根本不是在谈论椭圆。所有错误都发生在if(complete) 语句之上。
      猜你喜欢
      • 1970-01-01
      • 2016-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多