在IE9中,不要从Javascript传递任何内容到VBScript

127
我有一个用VBScript编写的框架。在这个框架的某些函数内部,会检查函数的参数是否为Nothing,如果是,则执行一些操作。
使用该框架的代码是用JavaScript编写的。因此,我需要将Nothing传递给函数以执行一些操作。在Internet Explorer 8和早期版本中,以下方法有效:
<script type="text/vbscript">
    Function Test(val)
        If (IsNull(val)) Then
            Test = "Null"
        ElseIf (IsObject(val)) Then
            If (val Is Nothing) Then
                Test = "Nothing"
            End If
        End If
    End Function

    Dim jsNothing
    Set jsNothing = Nothing
    msgBox(Test(jsNothing))
    msgBox(Test(Null))
</script>


<script type="text/javascript">
    alert(Test(jsNothing));
</script>

在Internet Explorer 9之前,输出将为:Nothing,Null,Nothing。
Internet Explorer 9中:Nothing,Null,Null。
如何在Internet Explorer 9中从JavaScript传递Nothing到VBScript?
这里有一个框架函数的示例。我无法更改它,因为它被广泛用于应用程序。
Function ExampleFunction(val)
    If (val Is Nothing) Then
        ExampleFunction = 1
    Else
        ExampleFunction = 0
    End If
End Function

11
小提示:VBScript 没有短路逻辑运算符,因此语句 IsObject(val) And val Is Nothing 仍会导致错误。您需要将其拆分为嵌套的 If 语句。 - Cheran Shunmugavel
我将此关闭,因为对您来说过于局限。将来,您可以只需标记以让我们知道 :) - Tim Post
VBScript 有 And Also 吗?我知道 VB.Net 有。尽管这很糟糕,但至少它允许短路。 - vbullinger
@vbullinger:不,它没有懒惰逻辑。http://blogs.msdn.com/b/ericlippert/archive/2004/07/15/184431.aspx -Eric Lippert的文章。 - mixel
4个回答

18

很遗憾,您可能会被卡住 - JavaScript没有“Nothing”等价物。请参阅此文章获取更多信息。

然而,以下方法可能有效。在您的VBScript代码中,创建一个名为“GetNothing”的函数,该函数返回“Nothing”。在您的JavaScript代码中,使用“var jsNothing = GetNothing()”。它来自这篇文章


两个链接都失效了。第一个链接重定向到通用页面,而对于第二个链接,“嗯。我们无法找到那个网站。无法连接到www.siteexperts.com的服务器。”被报告。 - Peter Mortensen
好的,OP已经离开了 (“上次出现超过2年前”) - Peter Mortensen

4

我现在无法访问Internet Explorer,因此无法测试此功能,但请尝试编写以下函数:

<script type="text/vbscript">
  Function CallWithNulls(fn, arg1, arg2, arg3)
    If (isNull(arg1)) arg1 = Nothing
    If (isNull(arg2)) arg2 = Nothing
    If (isNull(arg3)) arg3 = Nothing
    fn(arg1, arg2, arg3)
  End Function
  Function IsNothing(arg1, arg2, arg3)
     return arg1 is Nothing
  End Function
</script>

<script type="text/javascript">
  alert(CallWithNulls(IsNothing, null, 1, 2));
</script>

当然,我不知道VBScript是否允许像这样调用函数...而且你需要处理更多/更少的参数。

这是一个不错的解决方法。但是这个问题已经死了3年了。我希望VBScript也能够消失 :-) 感谢你的努力,赞一个。 - mixel
我并不是在试图解决这个问题(因为我看到你已经找到了更好的解决方案),只是一个有趣的问题,我想尝试一下。感谢您的点赞! - cwohlman
VBScript仍然是驱动惠普部分产品的脚本引擎,因此它确实不应该消亡。但还没有。 - TheBlastOne

0
作为一个例子,像这样的代码可以工作,但如果浏览器是 Internet Explorer 11 或更高版本,则需要使用 'meta' 标签。
<html>

    <head>
        <meta http-equiv="x-ua-compatible" content="IE=10">
        <title>Pass JavaScript to VBScript</title>

        <script>
            var val = "null";

            window.alert("Test: " +  val);
        </script>

        <script type="text/vbscript">

            PassNothing(val)

            Sub PassNothing(value)
                If LCase(value) = "null" Then
                    MsgBox "Java passed 'null' so VBScript = 'Nothing'"
                Else
                    Msgbox "Nothing received"
                End If
            End Sub

        </script>

    </head>

</html>

0

使用零或甚至负数等值。这将允许您简单地使用虚假评估,然后您就不必担心不同浏览器及其在评估NULL对象时的怪癖。


1
谢谢您的回答,但问题出在框架上。它是很久以前编写的,并且在大型应用程序中广泛使用,我不能仅仅更改它。我在问题中添加了一个从JavaScript调用的框架函数的示例。 - mixel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接