【问题标题】:JavaScript and VBScript function callingJavaScript 和 VBScript 函数调用
【发布时间】:2016-03-30 12:27:19
【问题描述】:

HTML 表单:

<form 
    name="CheckIn" 
    method="post" 
    action="check.asp" 
    onsubmit="return CheckBreakTime()  && CheckTime();" 
>

我在提交时调用了两个函数,函数返回 true 或 false,但函数只有在它是“第一个”时才有效,例如,如果我说“onsubmit="return CheckTime() &amp;&amp; CheckBreakTime();"”,如果我先调用 ChecKBreakTime,则只有 CheckTime 才有效。

函数 (JavaScript) :

function CheckBreakTime(){
    if (document.getElementById('breakco').checked) {
        var BKTimeDif1 = '<%=BTimeDif%>';
        var var1 = 20 ;
        var sum1 = var1 - BKTimeDif1 ;
        if (BKTimeDif1 > 10 && BKTimeDif1 < 21) {
            alert("You were on a break longer than 10 minutes,You must wait " + sum1 + " minutes to pass to check out from break. ");
            return false;
        } else {
            return true;
        }
    } 

    else {
        return true;  
        }
    }

function CheckTime() {
    if (document.getElementById('breakci').checked) {
        var TimeDif2 = '<%=BTimeDiff%>';
        var TimeDif1 = '<%=TimeDif%>';
        if (TimeDif1 < 120) {
            alert("You must work at least two hours before you can go on a break.");
            return false;
        } else {
            if (TimeDif2 != 0 && TimeDif2 < 120) {
                alert("You must work at least two hours before you can go on another break.");
                return false;
            }
            else {
                return true;
            }
        }


    }
    else {
        return true;
    }
}

以及我在 JavaScript 中输入的 VBScript 代码:

Dim TimeDif
TimeDif=Round(Csng(DateDiff("n", (HourList.Fields.Item("checkInTime").Value), (Now()))), 2)
Dim BTimeDif
If Not IsNull(HourList.Fields.Item("breakCheckIn").Value) Then
BTimeDif = Round(Csng(DateDiff("n", (HourList.Fields.Item("breakCheckIn").Value), (Now()))), 2)
End If
If Not IsNull(HourList.Fields.Item("breakCheckOut").Value) Then    
Dim BTimeDiff
BTimeDiff = Round(Csng(DateDiff("n", (HourList.Fields.Item("breakCheckOut").Value), (Now()))), 2)
End If

VBScript 代码工作正常,它返回它需要的内容,JavaScript 得到它。有人能告诉我是什么问题...

【问题讨论】:

  • 如果您的服务器端 vbs 正确填充了 TimeDif 和 BTimeDif 的值,那么我可以建议这是一个 javascript 问题并且不需要其他两个标签吗?
  • 您在 CheckTime 中将数字与字符串进行比较。
  • 问题是我检查了由于 vbscript 而没有显示的按钮,所以 javascript 只检查第一个。答案是把隐藏的输入放在相同的 id 上。对不起,如果我冒犯了,对不起我的语法不好。

标签: javascript


【解决方案1】:

如果您希望两个函数都运行,即使第一个函数的计算结果为 false - 那么您可以使用“&”: onsubmit multiple javascript functions

但是,我个人会将它们都包装在一个聚合两者逻辑的函数中:

function checkBothTimes(){
  if (!CheckBreakTime()){
    return false;
  }
  else if (!CheckTime()){
    return false;
  }
  return true;
}

尽管这更长 - 它使代码更易于阅读(对我而言)。

【讨论】:

    【解决方案2】:

    JavaScript 使用short-circuit evaluation 作为其逻辑运算符。这意味着在像expr1 &amp;&amp; expr2 这样的表达式中,只有当expr1 的计算结果为真时,expr2 才会被计算。如果expr1 评估为假,则无需评估expr2,因为无论如何expr1 &amp;&amp; expr2 的结果都会为假。

    所以,如果你运行例如

    var result = foo() && bar();
    
    function foo(){
      console.log("running foo!");
      return false;
    }
    
    function bar(){
      console.log("running bar!");
      return false;
    }
    

    只会执行函数foo()。这实际上与以下内容相同:

    var result = foo();
    if (result){
      result = bar();
    }
    

    这就是为什么只调用表达式中的第一个函数的原因。如果返回 false,则无需运行第二个。

    【讨论】: