目前,我有对付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
(同样,如果我要注释掉某一行,其他三个语句将正常工作)。
有一个MSDN文章在同一个应用中混合使用VB和JS,但是从文章看来,示例代码应该工作,如TestFunction
在另一个文件中声明,是一个功能毕竟。
有没有一些方法,使所有的这件事的工作,并呼吁双方VBTestFunction
和JSTestFunction
从VB和JS代码? 我想应该有一个,否则就在混合JS和VB是没有意义的。
我一直在监测这个问题了一会儿,萨尔曼已经几乎回答了这个问题,但也有一些事情可以得到澄清。 首先,有一个与文章被引用的关键问题。 它说,执行的顺序是这样的: -
1.Script在非缺省语言元素
2.Inline脚本
3.Script在默认的语言元素
它的错,或至少其过时(它所有参考IIS4后)。 在“内嵌脚本”(即默认语言脚本),比相同语言的脚本元素没有任何差别。
以下是如何通过推理所发生的事情。
任何分析开始之前所有的包括点解决,由包含文件内容替换,以创建一个单一的词汇“文件”。 这是任何解析发生之前创建的。
脚本代码是从这个“文件”为每种语言收集。 你可以想像多个文件(每种语言一个)被附加到每个块被发现。 注意,这是为什么原因<% %>
和<script runat="server"
默认语言实际上是indistiguishable。
任何静态内容(即一个的内容外runat="server"
script标签或<% %>
)被认为是用于默认语言的代码的一部分。 的一种特殊形式Response.Write
创建逐字发送静态内容字节的响应,并追加到它在原始文件中找到的点的默认语言代码。
现在我们有一个或更多的脚本,准备由各自的脚本引擎进行处理。 非默认语言脚本解析和优先执行 。 创建的任何全局标识符,是一个函数或变量,被添加到脚本环境。 然而,由于默认语言脚本尚未在所有处理在这一点上没有什么它随后可能会添加到全局脚本环境尚未公布。
由当时的默认语言脚本解析,并全部由之前的语言脚本创建的全局标识符将被添加到脚本环境,因此可以从内嵌代码使用执行。
你应该仔细注意 ,默认语言功能可以通过代码在调用到非默认功能的条件非默认语言的函数调用可以追溯到默认语言的内联执行。
例如,如果默认语言是JScript
你可以有一个VBScript
功能(FNA)调用声明的函数JScript
(FNB),只要该呼叫fnA
作出的JScript的内联执行的一部分。 督察JScript中可以调用VBScript中这反过来又可以调用的VBScript等,限制因素是发动机,该链的顶端必须是JScript中遇到这种情况。
在你的示例代码,你在你的VBScript的全局(在线)级试图调用默认JScript语言的声明的函数有码。 如果你按照上面的子弹,你会看到,在一点上,执行被调用的函数不存在。
我鼓励你不要混用脚本语言。 在你提到的文章 ,有一个标题为“执行的服务器脚本命令”标题,它说:
......不过,你然后在IIS ASP处理器的执行顺序的摆布。 例如,如果您创建服务器脚本,并在IIS 4.0上运行它,你会发现这个执行顺序:
- 脚本在非默认语言<SCRIPT>元素
- 内嵌脚本
- 脚本中的默认语言<SCRIPT>元素
牢记这一点,这里是你的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")
%>
我不知道所有的规则,但是这对我的作品:
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>
在被包含在VBS文件标签。 - 所述
<%@ language="..." %>
在顶部标签,应表明“主”语言。 该<script>
使用该次级语言(在你的情况下,VBScript)的块将被解释,并且可用于在主要语言的任何代码。
也许相关: 我如何使用从VBScript的Javascript OO类,在ASP-经典或WSH环境?