目前我必须处理用VB编写的遗留系统。我对VB和ASP不太满意,所以我决定用JScript编写这个系统的新代码。
但是,这两种语言之间的互操作性存在一些问题:即,当我尝试调用<script language="vbscript">
标记中声明的某些函数时,它会失败并显示“预期的对象 “错误(如果页面语言是VBScript),反之亦然。
即,以下代码:
inc.asp
<script language="vbscript" runat="server">
Sub VBTestFunction(Message)
Response.Write "VBTestFunction: " & Message
End Sub
</script>
<script language="javascript" runat="server">
function JSTestFunction(Message) {
Response.Write("JSTestFunction: " + Message);
}
</script>
testjs.asp
<%@ Language="JavaScript" %>
<!-- #include file="inc.asp"-->
<script language="javascript" runat="server">
VBTestFunction("from javascript");
JSTestFunction("from javascript");
</script>
<script language="vbscript" runat="server">
Call VBTestFunction("from vbscript")
Call JSTestFunction("from vbscript")
</script>
因以下错误而失败:
VBTestFunction: from vbscript
Microsoft VBScript runtime error '800a000d'
Type mismatch: 'JSTestFunction'
/test.asp, line 9
(如果我对特定行发表评论,其他三个陈述将正常工作);将页面语言设置为VBScript
<%@ Language="VBScript" %>
<!-- #include file="inc.asp"-->
<script language="javascript" runat="server">
VBTestFunction("from javascript");
JSTestFunction("from javascript");
</script>
<script language="vbscript" runat="server">
Call VBTestFunction("from vbscript")
Call JSTestFunction("from vbscript")
</script>
因以下错误而失败:
Microsoft JScript runtime error '800a138f'
Object expected
/test.asp, line 4
(再次,如果我将注释掉特定的行,其他三个语句将正常工作)。
在同一个应用程序中混合使用VB和JS有一个MSDN article,但从文章中可以看出示例代码应该可以工作,因为TestFunction
在另一个文件中声明并且是一个函数之后所有
是否有某种方法可以使所有这些工作正常工作,并从VB和JS代码中同时调用VBTestFunction
和JSTestFunction
?我想应该有一个,否则混合JS和VB就没有意义了。
答案 0 :(得分:6)
我一直在监视这个问题,Salman几乎已经回答了这个问题,但有些事情可以澄清。首先,正在引用的文章存在关键问题。它说执行的顺序是: -
1.非默认语言中元素的脚本
的元素中的脚本
2.内联脚本
3.使用默认语言
它错了,或者至少它已经过时了(它确实参考了IIS4之后)。 “内联脚本”(即默认语言中的脚本)的处理方式与同一语言的脚本元素不同。
以下是如何推断正在发生的事情。
在任何解析开始之前,所有包含点都会被解析,并被包含文件中的内容替换,以创建单个词汇“文件”。这是在进行任何解析之前创建的。
从每个语言的“文件”中收集脚本代码。您可以想象在找到每个块时会追加多个文件(每种语言一个)。请注意,这就是默认语言的<% %>
和<script runat="server"
实际上是不可分割的原因。
任何静态内容(即runat="server"
脚本标记或<% %>
之外的内容)都被视为默认语言代码的一部分。将创建静态内容字节逐字发送到响应的Response.Write
特殊形式创建并附加到原始文件中找到的默认语言代码。
现在我们有一个或多个脚本可供各自的脚本引擎处理。非默认语言脚本首先解析和执行。创建的任何全局标识符,无论是函数还是变量,都会添加到脚本环境中。但是,由于此时尚未处理默认语言脚本,因此可以随后添加到全局脚本环境中。
当解析并执行默认语言脚本时,之前语言脚本创建的所有全局标识符都将添加到脚本环境中,因此可以从内联代码中使用。
< / LI>调用非默认函数可以追溯到默认语言的内联执行。
例如,如果默认语言为JScript
,则可以使用VBScript
函数(fnA)调用JScript
(fnB)中声明的函数,只要调用{{1} }}是 JScript 的内联执行的一部分。 IOW JScript可以调用VBScript,而VBScript又可以调用VBScript等,限制因素是此链中顶部必须是JScript的引擎。
在您的示例代码中,您的VBScript的全局(内联)级别的代码试图调用以默认JScript语言声明的函数。如果您按照上面的项目符号进行操作,您将看到在执行该项目时,所调用的函数不存在。
答案 1 :(得分:2)
我鼓励您不要混用脚本语言。在the article you mentioned中,有一个标题为&#34;服务器脚本执行顺序&#34;在哪里说:
......然而,你将受到执行顺序的摆布 IIS ASP处理器。例如,如果您创建服务器脚本并运行它 在IIS 4.0中,您将找到此执行顺序:
- &lt; SCRIPT&gt;中的脚本非默认语言中的元素
- 内联脚本
- &lt; SCRIPT&gt;中的脚本默认语言中的元素
醇>
记住这一点,这里是你的testjs.asp脚本的执行方式,注释表明执行顺序:
<%@ Language="JavaScript" %>
<script language="vbscript" runat="server">
'' #1
Sub VBTestFunction(Message)
Response.Write "VBTestFunction: " & Message
End Sub
</script>
<script language="javascript" runat="server">
// #3
function JSTestFunction(Message) {
Response.Write("JSTestFunction: " + Message);
}
</script>
<script language="javascript" runat="server">
// #4
VBTestFunction("from javascript");
JSTestFunction("from javascript");
</script>
<script language="vbscript" runat="server">
'' #2
Call VBTestFunction("from vbscript")
Call JSTestFunction("from vbscript")
</script>
注意导致错误的行:
Call JSTestFunction("from vbscript")
它的执行顺序是#2;此时,函数JSTestFunction
未定义(稍后在执行顺序中定义)。
现在为testvbs.asp文件:
<%@ Language="VBScript" %>
<script language="vbscript" runat="server">
'' 3
Sub VBTestFunction(Message)
Response.Write "VBTestFunction: " & Message
End Sub
</script>
<script language="javascript" runat="server">
// 1
function JSTestFunction(Message) {
Response.Write("JSTestFunction: " + Message);
}
</script>
<script language="javascript" runat="server">
// 2
VBTestFunction("from javascript");
JSTestFunction("from javascript");
</script>
<script language="vbscript" runat="server">
'' 4
Call VBTestFunction("from vbscript")
Call JSTestFunction("from vbscript")
</script>
导致错误的行:
VBTestFunction("from javascript");
同样,VBTestFunction
在定义之前被调用。解决方案是尽量不混合脚本语言。如果绝对必要,请修改脚本的顺序。
如果您已设置@ Language="JavaScript"
,则此代码应按预期工作:
<!-- inc.asp-->
<script language="vbscript" runat="server">
Sub VBTestFunction(Message)
Response.Write "VBTestFunction: " & Message
End Sub
</script>
<%
function JSTestFunction(Message) {
Response.Write("JSTestFunction: " + Message);
}
%>
<!-- testjs.asp -->
<%@ Language="JavaScript" %>
<!-- #include file="inc.asp"-->
<%
// at this point, both functions are available
VBTestFunction("from inline JavaScript");
JSTestFunction("from inline JavaScript");
%>
如果您想使用@ Language="VBScript"
,则必须重新安排所有代码:
<!-- inc.asp-->
<script language="javascript" runat="server">
function JSTestFunction(Message) {
Response.Write("JSTestFunction: " + Message);
}
</script>
<%
Sub VBTestFunction(Message)
Response.Write "VBTestFunction: " & Message
End Sub
%>
<!-- testvbs.asp -->
<%@ Language="VBScript" %>
<!-- #include file="inc.asp"-->
<%
' at this point, both functions are available
VBTestFunction("from inline VBScript")
JSTestFunction("from inline VBScript")
%>
答案 2 :(得分:0)
我不知道所有规则,但这对我有用:
TEST.ASP:
<%@ language="JavaScript" %>
<script language="VBScript" runat="server" src="mix2.vbs"></script>
<script language="JavaScript" runat="server">
TestFunction("from javascript");
</script>
mix2.vbs:。
Sub TestFunction (message)
Response.Write message
End Sub
注意:
<script>
标记。 <%@ language="..." %>
标记应指明“主要”语言。然后,将解释使用辅助语言(在您的情况下为VBScript)的<script>
块,并且可用于主要语言的任何代码。 也许相关:How can I use Javascript OO classes from VBScript, in an ASP-Classic or WSH environment?