124 votes

Ne rien passer de Javascript à VBScript dans IE9

J'ai un framework écrit en VBScript. À l'intérieur de certaines fonctions de ce cadre, le paramètre de la fonction est vérifié pour rien dans l'instruction If, puis certaines actions sont exécutées. Le code qui utilise le cadre est écrit en Javascript. J'ai donc besoin de passer Nothing à la fonction pour exécuter certaines actions. Dans IE8 et les versions antérieures, l'approche suivante a fonctionné :

<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 : Rien, Nul, Rien.

Dans IE9 : Rien, Nul, Nul.

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

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

éditer : Il y a un exemple de fonction cadre. Je ne peux pas le modifier car il est largement utilisé dans l'application.

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

Mise à jour

J'ai quitté mon travail. J'en ai trouvé un meilleur.

10 votes

Petite parenthèse : VBScript n'a pas d'opérateurs logiques court-circuités donc la déclaration IsObject(val) And val Is Nothing entraînera toujours une erreur. Vous devrez le diviser en un If imbriqué.

0 votes

Je l'ai fermé comme étant trop localisé pour vous. À l'avenir, vous pouvez simplement nous le signaler :)

0 votes

Est-ce que VBScript dispose de And Also ? Je sais que VB.Net l'a. Aussi nul que cela puisse être, au moins cela permet de faire des courts-circuits.

17voto

Pandelon Points 192

Malheureusement, vous êtes probablement coincé ici - JavaScript n'a pas d'équivalent "Nothing". Voir Cet article pour plus d'informations.

[Edit] Cependant, la méthode suivante peut fonctionner. Dans votre VBScript, créez une fonction appelée "GetNothing" qui renvoie "Rien". Dans votre JavaScript, utilisez "var jsNothing = GetNothing()". Vient de cet article

4voto

cwohlman Points 383

Cette question est fascinante, je me suis dit que j'allais essayer d'y répondre, juste pour le plaisir.

(Félicitations à Mixel pour avoir trouvé un meilleur emploi !)

Je n'ai pas accès à IE en ce moment, donc je ne peux pas tester cela, mais si vous essayiez 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 de VB permet d'appeler des fonctions comme ça... et vous auriez à traiter avec plus/moins d'arguments.

0 votes

C'est un bon moyen 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 attrape le upvote.

0 votes

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 je me suis dit que j'allais tenter le coup. Merci pour le vote positif !

0 votes

VBScript continue d'être le moteur de script qui fait fonctionner certains des produits HP, il ne devrait donc pas mourir. Pourtant.

0voto

svstackoverflow Points 165

Par exemple, quelque chose comme ceci fonctionnera, mais si le navigateur est IE11 ou ultérieur, 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>

0voto

Utilisez une valeur telle que zéro ou même un nombre négatif qui vous permettra d'utiliser simplement des évaluations falsy, vous n'aurez pas à vous soucier des différents navigateurs et de leurs bizarreries dans l'évaluation de la balise NULL objet.

1 votes

Merci pour la réponse, mais le problème est dans le cadre. Il a été écrit il y a longtemps et est largement utilisé dans de grandes applications et je ne peux pas le modifier. J'ai ajouté à la question l'exemple d'une fonction du framework qui est appelée depuis le javascript.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X