7

現在、VBで記述されたレガシーシステムを処理する必要があります。私はVBとASPが苦手なので、このシステムの新しいコードをJScriptで作成することにしました。

<script language="vbscript">ただし、2つの言語間の相互運用性には問題があります。つまり、タグで宣言された関数を呼び出そうとすると、「オブジェクトが必要です」エラー(ページ言語が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

(特定の行にコメントする場合、他の3つのステートメントは正常に機能します); ページ言語を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

(ここでも、特定の行をコメントアウトすると、他の3つのステートメントが正常に機能します)。

同じアプリケーションでのVBとJSの混合に関するMSDNの記事がありますが、この記事から、別のファイルで宣言されているように、サンプルコードはTestFunction機能するはずであり、結局のところ関数です。

これらすべてを機能させ、VBコードとJSコードの両方から両方VBTestFunctionを呼び出す方法はありますか?JSTestFunctionあるべきだと思います。そうでなければ、JSとVBを混ぜても意味がありません。

4

3 に答える 3

6

私はこの質問をしばらく監視していて、Salmanはほとんどそれに答えていますが、明らかにできることがいくつかあります。まず第一に、参照されている記事に重要な問題があります。実行の順序は次のとおりです。-

1.デフォルト以外の言語の要素のスクリプト2.
インラインスクリプト
3.デフォルト言語の要素のスクリプト

その間違い、または少なくともその時代遅れです(結局のところIIS4を参照しています)。「インラインスクリプト」(つまり、デフォルト言語のスクリプト)は、同じ言語のスクリプト要素と同じように扱われます。

何が起こっているのかを推論する方法は次のとおりです。

  • 解析を開始する前に、すべてのインクルードポイントが解決され、インクルードファイルのコンテンツに置き換えられて、単一の字句「ファイル」が作成されます。これは、解析が行われる前に作成されます。

  • スクリプトコードは、言語ごとにこの「ファイル」から収集されます。各チャンクが見つかると、複数のファイル(言語ごとに1つ)が追加されることを想像できます。これが、デフォルト言語が実質的に区別できない理由であることに注意してください<% %><script runat="server"

  • 静的コンテンツ(つまり、runat="server"スクリプトタグまたはの外部のコンテンツ<% %>)は、デフォルト言語のコードの一部と見なされます。静的コンテンツバイトを逐語的に応答に送信する特別な形式Response.Writeが作成され、元のファイルで見つかった時点でデフォルトの言語コードに追加されます。

  • これで、それぞれのスクリプトエンジンで処理する準備ができている1つ以上のスクリプトができました。デフォルト以外の言語のスクリプトが最初に解析され実行されます。関数または変数のグローバル識別子が作成されると、スクリプト環境に追加されます。ただし、デフォルトの言語スクリプトはこの時点ではまったく処理されていないため、後でグローバルスクリプト環境に追加される可能性のあるものはまだ利用できません。

  • デフォルトの言語スクリプトが解析および実行されるまでに、以前の言語スクリプトによって作成されたすべてのグローバル識別子がスクリプト環境に追加されているため、インラインコードから使用できます。

デフォルト言語以外の関数の呼び出しは、デフォルト言語のインライン実行にまでさかのぼることができるという条件で、デフォルト言語の関数をデフォルト以外の言語の関数のコードで呼び出すことができることに注意してください。

たとえば、デフォルトの言語がである場合JScript、呼び出しがJScriptのインライン実行の一部として行われる限りVBScript、関数(fnA)に(fnB)で宣言された関数を呼び出させることができます。IOW JScriptはVBScriptを呼び出すことができ、VBScriptはVBScriptなどを呼び出すことができます。制限要因は、このシナリオではこのチェーンの最上位がJScriptである必要があるエンジンです。JScriptfnA

サンプルコードでは、VBScriptのグローバル(インライン)レベルで、デフォルトのJScript言語で宣言された関数を呼び出そうとするコードがありました。上記の箇条書きに従うと、実行された時点で、呼び出されている関数が存在しないことがわかります。

于 2012-04-10T19:32:10.573 に答える
2

スクリプト言語を混在させないことをお勧めします。あなたが言及した記事には、「サーバースクリプトの実行順序」というタイトルの見出しがあります。

...ただし、IISASPプロセッサの実行順序に翻弄されます。たとえば、サーバースクリプトを作成し、IIS 4.0で実行すると、次の実行順序が見つかります。

  1. デフォルト以外の言語の<SCRIPT>要素のスクリプト
  2. インラインスクリプト
  3. デフォルト言語の<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")
%>
于 2012-04-10T09:13:12.047 に答える
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>含まれるvbsファイルにはタグがありません。
  • 上部の<%@ language="..." %>タグは、「プライマリ」言語を示している必要があります。次に<script>、二次言語(この場合はVBScript)を使用するブロックが解釈され、一次言語のすべてのコードで使用できるようになります。

関連する可能性があります:ASP-ClassicまたはWSH環境でVBScriptのJavascript OOクラスを使用するにはどうすればよいですか?

于 2012-04-10T06:34:35.347 に答える