Pase nada de Javascript a VBScript en IE9


123

Tengo un marco escrito en VBScript. Dentro de alguna función en este marco, el parámetro de la función se verifica para la instrucción Nothing in If y luego se ejecutan algunas acciones. Código que usa framework escrito en Javascript. Así que necesito pasar Nada para funcionar para realizar algunas acciones. En IE8 y versiones anteriores funcionó el siguiente enfoque:

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

En IE <9 la salida será: Nada, Nulo, Nada.

En IE9: Nada, Nulo, Nulo.

¿Cómo puedo pasar Nothing de Javascript a VBScript en IE9?

Lo siento, sé que es feo, pero estoy atrapado. Y odio VBScript.

editar: hay un ejemplo de función marco. No puedo cambiarlo porque es ampliamente utilizado en la aplicación.

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

Actualizar

Renunció al trabajo. Encontré uno mejor.


10
Pequeña nota al margen: VBScript no tiene operadores lógicos en cortocircuito , por lo que la declaración IsObject(val) And val Is Nothingaún generará un error. Tendrás que dividirlo en un If anidado.
Cheran Shunmugavel

Cerré esto como demasiado localizado para ti. En el futuro, puede marcar para avisarnos :)
Tim Post

¿VBScript tiene y también? Sé que VB.Net lo tiene. Tan patético como es eso, al menos permitirá cortocircuitos.
vbullinger

@vbullinger: No, no tiene lógica perezosa. blogs.msdn.com/b/ericlippert/archive/2004/07/15/184431.aspx -Artículo de Eric Lippert.
mixel

Respuestas:


17

Desafortunadamente, probablemente esté atrapado aquí: JavaScript no tiene un equivalente de "Nada". Vea este artículo para más información.

[Editar] Sin embargo, lo siguiente puede funcionar. En su VBScript cree una función llamada "GetNothing" que devuelve "Nothing". En su JavaScript use "var jsNothing = GetNothing ()". Proviene de este artículo


4

Esta pregunta es fascinante, pensé que intentaría responderla solo por diversión.

(¡Felicidades a Mixel por conseguir un mejor trabajo!)

No tengo acceso a IE en este momento, así que no puedo probar esto, pero ¿qué pasa si intentas escribir una función como esta?

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

Por supuesto, no sé si el script VB permite llamar a funciones como esa ... y tendrías que lidiar con más / menos argumentos.


Es una buena solución. Pero esta pregunta ya lleva 3 años muerta. Y deseo que VBScript también esté muerto :-) Gracias por el esfuerzo y atrapar el voto positivo.
mixel

No estaba tratando de solucionar el problema (ya que vi que ya había encontrado una solución mejor), era solo una pregunta interesante y pensé en darle una puñalada. Gracias por el voto!
cwohlman

VBScript sigue siendo el motor de secuencias de comandos que impulsa algunos de los productos de HP, por lo que no debería morir. Todavía.
TheBlastOne

0

Use un valor como cero o incluso un número negativo que le permita simplemente usar evaluaciones falsas, luego no tendrá que preocuparse por los diferentes navegadores y sus peculiaridades al evaluar el NULLobjeto.


1
Gracias por una respuesta, pero el problema está en el marco. Fue escrito hace mucho tiempo y se usa ampliamente en aplicaciones grandes y no puedo cambiarlo. Agregué a la pregunta el ejemplo de una función de marco que llamó desde javascript.
mixel

0

Como ejemplo, algo como esto funcionará, pero si el navegador es IE11 o posterior, necesitará la etiqueta '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>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.