Asp classic 从JScript代码调用VB上编写的函数(经典ASP)
目前我必须处理用VB编写的遗留系统。我不擅长VB和ASP,所以我决定用JScript编写这个系统的新代码 但是,这两种语言之间的互操作性存在一些问题:即,当我试图调用Asp classic 从JScript代码调用VB上编写的函数(经典ASP),asp-classic,vbscript,jscript,Asp Classic,Vbscript,Jscript,目前我必须处理用VB编写的遗留系统。我不擅长VB和ASP,所以我决定用JScript编写这个系统的新代码 但是,这两种语言之间的互操作性存在一些问题:即,当我试图调用标记中声明的某个函数时,它失败,并出现“预期对象””错误(如果页面语言为VBScript),反之亦然 即以下代码: 公司asp (如果我对具体行进行评论,其他三个语句也可以);将页面语言设置为VBScript <%@ Language="VBScript" %> <!-- #include file="inc.as
标记中声明的某个函数时,它失败,并出现“预期对象””错误(如果页面语言为VBScript),反之亦然
即以下代码:
公司asp
(如果我对具体行进行评论,其他三个语句也可以);将页面语言设置为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>
(同样,如果我将注释掉具体的行,其他三个语句也可以)
在同一个应用程序中混合使用VB和JS有一个问题,但是从文章来看,示例代码应该可以工作,因为TestFunction
在另一个文件中声明,毕竟是一个函数
是否有某种方法可以使所有这些工作正常,并从VB和JS代码中调用
VBTestFunction
和JSTestFunction
?我想应该有一个,否则混合JS和VB就没有意义了。我不知道所有的规则,但这对我来说很有用:
test.asp:
<%@ language="JavaScript" %>
<script language="VBScript" runat="server" src="mix2.vbs"></script>
<script language="JavaScript" runat="server">
TestFunction("from javascript");
</script>
注意:
- vbs文件中没有包含的
标记李> - 顶部的
标记应指示“主要”语言。然后,使用辅助语言(在您的案例中为VBScript)的
块将被解释并可用于主语言中的任何代码李>
可能相关:我建议您不要混合使用脚本语言。在中,有一个标题为“服务器脚本执行顺序”,其中指出: 。。。然而,你将受到执行命令的摆布 IIS ASP处理器。例如,如果创建服务器脚本并运行它 在IIS 4.0中,可以找到以下执行顺序:
<%@ 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>
<%@ 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>
其执行顺序为#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
在定义之前被调用。解决方案是尽量不要混合使用脚本语言。如果绝对必要,请修改脚本的顺序
编辑--示例
如果已设置@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");
%>
我已经关注这个问题有一段时间了,萨尔曼几乎已经回答了这个问题,但是有一些事情需要澄清。首先,引用的文章存在一个关键问题。它说执行的顺序是这样的:- 1.使用非默认语言在元素中编写脚本
2.内联脚本
3.使用默认语言在元素中编写脚本 它错了,或者至少已经过时了(毕竟它引用了IIS4)。“内联脚本”(即默认语言中的脚本)与同一语言中的脚本元素没有任何区别 下面是如何通过正在发生的事情进行推理
- 在任何解析开始之前,所有包含点都被解析并替换为包含文件中的内容,以创建单个词汇“文件”。这是在进行任何解析之前创建的
- 从每个语言的“文件”中收集脚本代码。您可以想象,当找到每个块时,会附加多个文件(每种语言一个)。请注意,这就是我修改答案的原因。您的建议修复了特定的原始问题,但破坏了从VB代码中调用JS函数的能力。它实际上没有。您只需要重新编写语言声明,仔细阅读您提到的文章,特别是其中的“服务器脚本执行顺序”部分。你的问题就在这里。这篇文章特别在主代码流(“内联服务器脚本”)和子例程声明之间划清了界限。从这篇文章看来,子例程可以用任何语言声明,我可以用任何语言调用它。我提到的这篇文章明确地告诉我们,它只对做某些事情的代码重要,而不是对过程声明。你是想说,从任何非主要语言编写的代码中调用以主要语言编写的函数是完全不可能的吗?你提到的这篇文章为你提供了一些关于如何混合使用脚本语言的建议(和诀窍),比如……或者只为函数或子例程使用元素,或者对于执行顺序无关紧要的代码。。我会看看是否可以重新安排您的代码以使其正常工作。我鼓励您不要混合使用脚本语言。似乎没有必要。@cheeso:似乎没有必要,但就我所知,这是一个很好的建议。多语言脚本块的求值顺序不允许您编写合理的过程性代码。@SalmanA:我认为您自己的回答已经证明,事实上,当以“合理的过程性”方式编写代码时,脚本引擎处理的顺序不是问题。只有当试图使用两个脚本引擎内联执行代码时,才会出现问题。对不起,本文中提到的执行顺序仍然有效。运行,并在IIS7上记录执行顺序——它保持不变,与文章中描述的完全相同。回答中的一些断言是错误的,特别是那些与执行顺序相关的断言。至于您的注释:您的意思是,全局名称解析发生在运行时,因此,基本上,所有函数调用都是内联的,然后生成的代码将不被执行
Sub TestFunction (message) Response.Write message End Sub
<%@ 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")
<%@ 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");
<!-- 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"); %>
<!-- 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") %>