Nic nie przekazuj z JavaScript do VBScript w IE9

123

Mam framework napisany w VBScript. Wewnątrz jakiejś funkcji w tym frameworku parametr funkcji jest sprawdzany pod kątem Nothing w instrukcji If, a następnie wykonywane są pewne akcje. Kod wykorzystujący framework napisany w Javascript. Więc muszę przekazać Nic do funkcji, aby wykonać pewne czynności. W IE8 i wcześniejszych wersjach działało następne podejście:

<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>

W IE <9 wyjście będzie: Nothing, Null, Nothing.

W IE9: Nothing, Null, Null.

Jak mogę przekazać Nothing z JavaScript do VBScript w IE9?

Przepraszam, wiem, że to brzydkie, ale jestem uwięziony. I nienawidzę VBScript.

edycja: Jest przykład funkcji frameworka. Nie mogę tego zmienić, ponieważ jest szeroko stosowany w aplikacji.

Function ExampleFunction(val)
    If (val Is Nothing) Then
        ExampleFunction = 1
    Else
        ExampleFunction = 0
    End If
End Function

Aktualizacja

Rzucił pracę. Znalazłem lepszy.

mixel
źródło
10
Mała uwaga: VBScript nie ma skróconych operatorów logicznych , więc instrukcja IsObject(val) And val Is Nothingnadal będzie skutkować błędem. Będziesz musiał podzielić go na zagnieżdżone If.
Cheran Shunmugavel
Zamknąłem to jako zbyt zlokalizowane dla Ciebie. W przyszłości możesz po prostu zgłosić, aby nas powiadomić :)
Tim Post
Czy VBScript ma i też? Wiem, że VB.Net to ma. Choć jest to kiepskie, przynajmniej pozwoli na zwarcie.
vbullinger
@vbullinger: Nie, nie ma leniwej logiki. blogs.msdn.com/b/ericlippert/archive/2004/07/15/184431.aspx - artykuł Erica Lipperta.
mixel

Odpowiedzi:

17

Niestety, prawdopodobnie utknąłeś w tym miejscu - JavaScript nie ma odpowiednika „Nothing”. Więcej informacji można znaleźć w tym artykule .

[Edytuj] Jednak poniższe mogą działać. W swoim VBScript utwórz funkcję o nazwie „GetNothing”, która zwraca „Nothing”. W swoim JavaScript użyj "var jsNothing = GetNothing ()". Pochodzi z tego artykułu

Pandelon
źródło
4

To pytanie jest fascynujące, pomyślałem, że spróbuję odpowiedzieć na nie tylko dla przyjemności.

(Gratulacje z okazji znalezienia lepszej pracy!)

Nie mam teraz dostępu do IE, więc nie mogę tego przetestować, ale co by było, gdybyś próbował napisać taką funkcję:

<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>

Oczywiście nie wiem, czy skrypt VB pozwala na wywoływanie takich funkcji ... i musiałbyś mieć do czynienia z większą / mniejszą liczbą argumentów.

cwohlman
źródło
To fajne obejście. Ale to pytanie jest już martwe od 3 lat. I chciałbym, żeby VBScript też nie żył :-) Dziękuję za wysiłek i cieszę się, że jestem pozytywny.
mixel
Nie próbowałem rozwiązać problemu (ponieważ widziałem, że już znalazłeś lepsze rozwiązanie), to było po prostu interesujące pytanie i pomyślałem, że zadam mu pytanie. Dzięki za upvote!
cwohlman
VBScript nadal jest silnikiem skryptów, który obsługuje niektóre produkty HP, więc rzeczywiście nie powinien umrzeć. Jeszcze.
TheBlastOne
0

Użyj wartości takiej jak zero lub nawet liczba ujemna, która pozwoli ci po prostu użyć fałszywych ocen, a wtedy nie musisz martwić się o różne przeglądarki i ich dziwactwa w ocenie NULLobiektu.

Timothy Allyn Drake
źródło
1
Dzięki za odpowiedź, ale problem jest w ramach. Został napisany dawno temu i jest szeroko stosowany w dużych aplikacjach i nie mogę tego zmienić. Dodałem do pytania przykład funkcji frameworka, który wywołał z javascript.
mixel
0

Na przykład coś takiego zadziała, ale jeśli przeglądarka to IE11 lub nowsza, będziesz potrzebować tagu „meta”.

<HTML>
<HEAD>
<meta http-equiv="x-ua-compatible" content="IE=10">
<TITLE>Pass Javscript 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>
svstackoverflow
źródło