Ne passez rien de Javascript à VBScript dans IE9

123

J'ai un framework écrit en VBScript. À l'intérieur d'une fonction dans ce paramètre de cadre de la fonction est vérifié rien dans l'instruction If, puis certaines actions exécutées. Code qui utilise un framework écrit en Javascript. J'ai donc besoin de passer Nothing pour fonctionner pour effectuer certaines actions. Dans IE8 et les versions antérieures, l'approche suivante fonctionnait:

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

Dans IE <9, la sortie sera: Nothing, Null, Nothing.

Dans IE9: Nothing, Null, Null.

Comment puis-je passer Nothing de Javascript à VBScript dans IE9?

Désolé, je sais que c'est moche, mais je suis piégé. Et déteste VBScript.

edit: Il existe un exemple de fonction de cadre. Je ne peux pas le changer car il est largement utilisé en application.

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

Mettre à jour

Travail abandonné. J'ai trouvé un meilleur.

mixel
la source
10
Petite remarque: VBScript n'a pas d'opérateurs logiques court-circuités , donc l'instruction IsObject(val) And val Is Nothingentraînera toujours une erreur. Vous devrez le diviser en un If imbriqué.
Cheran Shunmugavel
J'ai fermé cela comme étant trop localisé pour vous. À l'avenir, vous pouvez simplement signaler pour nous le faire savoir :)
Tim Post
VBScript a-t-il Et aussi? Je sais que VB.Net l'a. Aussi boiteux que cela soit, au moins cela permettra un court-circuit.
vbullinger
@vbullinger: Non, il n'a pas de logique paresseuse. blogs.msdn.com/b/ericlippert/archive/2004/07/15/184431.aspx - Article d' Eric Lippert.
mixel

Réponses:

17

Malheureusement, vous êtes probablement bloqué ici - JavaScript n'a pas d'équivalent «Rien». Consultez cet article pour plus d'informations.

[Modifier] Cependant, ce qui suit peut fonctionner. Dans votre VBScript, créez une fonction appelée "GetNothing" qui renvoie "Nothing". Dans votre JavaScript, utilisez "var jsNothing = GetNothing ()". Provient de cet article

Pandelon
la source
4

Cette question est fascinante, j'ai pensé que j'essaierais d'y répondre juste pour le plaisir.

(Félicitations à Mixel pour avoir obtenu un meilleur travail!)

Je n'ai pas accès à IE pour le moment, donc je ne peux pas tester cela, mais que faire si vous avez essayé d'écrire une fonction comme celle-ci:

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

Bien sûr, je ne sais pas si le script VB permet d'appeler des fonctions comme ça ... et vous auriez à gérer plus / moins d'arguments.

cwohlman
la source
C'est une belle solution de contournement. Mais cette question est déjà morte depuis 3 ans. Et je souhaite que VBScript soit mort aussi :-) Merci pour l'effort et attrapez le vote positif.
mixel
Je n'essayais pas de résoudre le problème (puisque j'ai vu que vous aviez déjà trouvé une meilleure solution), c'était juste une question intéressante et j'ai pensé que je lui donnerais un coup de pouce. Merci pour le vote positif!
cwohlman
VBScript continue d'être le moteur de script qui alimente certains produits HP, il ne devrait donc pas mourir. Encore.
TheBlastOne
0

Utilisez une valeur telle que zéro ou même un nombre négatif qui vous permettrait d'utiliser simplement des évaluations fausses, alors vous n'avez pas à vous soucier des différents navigateurs et de leurs bizarreries lors de l'évaluation de l' NULLobjet.

Timothy Allyn Drake
la source
1
Merci pour une réponse mais le problème est dans le cadre. Il a été écrit il y a longtemps et est largement utilisé dans les grandes applications et je ne peux pas le changer. J'ai ajouté à la question un exemple d'une fonction de framework qui a appelé de javascript.
mixel du
0

Par exemple, quelque chose comme ça fonctionnera, mais si le navigateur est IE11 ou une version ultérieure, vous aurez besoin de la balise «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
la source