【问题标题】:Combine two javascript functions?结合两个javascript函数?
【发布时间】:2012-09-12 00:54:19
【问题描述】:

我怎样才能结合这两个功能,使他们都工作?现在,我只能让一个来验证,而另一个不行。

JAVASCRIPT 示例:

function validateForm() {

var x=document.forms["giftCert"]["gift_name"].value;

if (x==null || x=="") {

errMsg = "The recpient's name is required.";              
    $("div#emptyName").show();
    $("div#emptyName").html(errMsg);

return false;
  }
}

function validateForm() {

var x=document.forms["giftCert"]["gift_email"].value;

if (x==null || x=="") {

errMsg2 = "The recpient's email address is required.";              
    $("div#emptyEmail").show();
    $("div#emptyEmail").html(errMsg2);

return false;
  }
}

表单 HTML 的简短版本:

<form action="http://ww6.aitsafe.com/cf/voucher.cfm" method="post" name="giftCert" onsubmit="return validateForm()"  />
    *Name:<input type="text" name="gift_name">
    <div id="emptyName" class="error"></div>

    *Email: <input type="text" name="gift_email">
    <div id="emptyEmail" class="error"></div>

    <input class="button" type="submit" value="Add to Cart" />

</form>

【问题讨论】:

    标签: javascript forms validation function


    【解决方案1】:

    您可以将代码放在同一个函数中。

    function validateForm() {
        return ["Name", "Email"].every(function(type) {
            var lower_type = type.toLowerCase(),
                x=document.forms["giftCert"]["gift_" + lower_type].value;
    
            if (x==null || x=="")
                $("div#empty" + type).show().html("The recpient's " + lower_type + " is required.");
            else
                return true;
        });
    }
    

    由于大部分代码几乎相同,您可以将 "Name""Email" 值放入一个数组中,然后循环该数组,调用相同的代码,在需要的地方放入适当的值。

    这使用Array.prototype.every 来指示数组中的每个值是否通过验证。

    如果任何一项验证失败,则返回undefined,循环停止,validateForm 返回false

    通过验证的每个项目都返回true。如果所有项目都通过验证,.every 将返回 true,然后表单继续进行。


    如果您想确保所有验证都运行,您可以使用.filter(),并在失败时返回true,以便它将一个项目添加到结果数组中。如果没有失败,则 Array 将为空。

    然后测试Array的.length,返回一个比较0

    function validateForm() {
        return ["Name", "Email"].filter(function(type) {
            var lower_type = type.toLowerCase(),
                x=document.forms["giftCert"]["gift_" + lower_type].value;
    
            if (x==null || x=="") {
                $("div#empty" + type).show().html("The recpient's " + lower_type + " is required.");
                return true;
            }
        }).length === 0; // will be true if no validation failures
    }
    

    【讨论】:

    • 我选择了您的第二个解决方案。谢谢!
    【解决方案2】:

    完成后让它调用第二个。

    或者有一个调用它们的第三个函数并在你的 onsubmit 中有它。该函数将看到两个函数的返回值,并且仅当它们都返回 true 时才返回 true。

    或者只是将第二个的代码放在第一个中,因为无论如何它都是相似的。你也可以去掉一些重复的代码。

    【讨论】:

      【解决方案3】:

      当您重复使用相同的函数名称时,每个后续函数声明都将覆盖任何前面的条目。将验证保存在单独的函数中可能是最简单的,因此您应该适当地命名它们并创建一个驱动程序函数来调用它们。示例:

      function validateForm() {
        return validateName && validateEmail();
      }
      
      function validateName() {
      
        var x=document.forms["giftCert"]["gift_name"].value;
      
        if (x==null || x=="") {
      
          errMsg = "The recpient's name is required.";              
          $("div#emptyName").show();
          $("div#emptyName").html(errMsg);
      
          return false;
        }
      
        return true;
      }
      
      function validateEmail() {
      
        var x=document.forms["giftCert"]["gift_email"].value;
      
        if (x==null || x=="") {
      
          errMsg2 = "The recpient's email address is required.";              
          $("div#emptyEmail").show();
          $("div#emptyEmail").html(errMsg2);
      
          return false;
        }
      
        return true;
      }
      

      此外,您可以将两者结合起来,但这几乎没有那么灵活:

      function validateForm() {
      
        var name =document.forms["giftCert"]["gift_name"].value;
      
        if (name == null || name == "") {
      
          errMsg = "The recpient's name is required.";              
          $("div#emptyName").show();
          $("div#emptyName").html(errMsg);
      
          return false;
        }
      
        var email = document.forms["giftCert"]["gift_email"].value;
      
        if (email == null || email == "") {
      
          errMsg2 = "The recpient's email address is required.";              
          $("div#emptyEmail").show();
          $("div#emptyEmail").html(errMsg2);
      
          return false;
        }
      
        return true;
      }
      

      【讨论】:

        【解决方案4】:

        简短的回答就是这样做

        function validateForm() {
        
        var x=document.forms["giftCert"]["gift_name"].value;
        
        if (x==null || x=="") {
        
            errMsg = "The recpient's name is required.";              
            $("div#emptyName").show();
            $("div#emptyName").html(errMsg);
        
            return false;
        }
        x=document.forms["giftCert"]["gift_email"].value;
        
        if (x==null || x=="") {
        
            errMsg2 = "The recpient's email address is required.";              
            $("div#emptyEmail").show();
            $("div#emptyEmail").html(errMsg2);
        
           return false;
          }
        }
        

        更长的答案是您的函数必须具有唯一的名称。此外,您在部分代码中使用 jquery 为什么不使用它来访问您的表单?此外,从 HTML 调用函数通常被认为是不好的做法。

        【讨论】:

          【解决方案5】:

          一种可能的解决方案:

          function validateForm() {
          
              var x=document.forms["giftCert"]["gift_name"].value,
                  y = document.forms["giftCert"]["gift_email"].value,
                  error = false;
          
              if ( !x ) {
                  errMsg = "The recpient's name is required.";              
                  $("div#emptyName").html(errMsg).show();
                  error = true;
              }
          
              if ( !y ) {
                  errMsg2 = "The recpient's email address is required.";              
                  $("div#emptyEmail").html(errMsg2).show();
                  error = true;
              }
          
              if (error === true) return false;
          
          }​
          

          【讨论】:

            【解决方案6】:

            对于想知道如何将两个函数合二为一的人,这是我为此创建的一个函数:

            function combineFunctions() {
                var args = Array.prototype.slice.call(arguments, 0);
                return function() {
                        for (var i = 0, len = args.length; i < len; i++) {
                            if (typeof args[i] === "function") {
                                args[i].apply(this, arguments);
                            }
                        }
                };
            }
            

            然后组合成函数:

            var myFunc = function() { console.log('1'); };
            var myOtherFunc = function() { console.log('2'); };
            
            var myCombinedFunc = combineFunctions(myFunc, myOtherFunc);
            myCombinedFunc(); // outputs 1, then 2 to the console
            

            注意:这仅适用于具有相同参数的函数——非常适合将函数添加到事件处理程序

            【讨论】:

              猜你喜欢
              • 2021-08-13
              • 2019-06-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-09-22
              • 2014-01-21
              相关资源
              最近更新 更多