Ничего не передавать из Javascript в VBScript в IE9

123

У меня есть фреймворк, написанный на VBScript. Внутри некоторой функции в этой структуре параметр функции проверяется на Ничего в операторе If, а затем выполняются некоторые действия. Код, использующий фреймворк, написанный на Javascript. Поэтому мне нужно передать Nothing функции для выполнения некоторых действий. В IE8 и более ранних версиях работал следующий подход:

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

В IE <9 вывод будет: Nothing, Null, Nothing.

В IE9: Nothing, Null, Null.

Как я могу ничего не передавать из Javascript в VBScript в IE9?

Извините, я знаю, что это уродливо, но я в ловушке. И ненавижу VBScript.

изменить: есть пример функции фреймворка. Я не могу его изменить, потому что он широко используется в приложении.

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

Обновить

Уволился с работы. Нашел лучший.

Mixel
источник
10
Небольшое примечание: VBScript не имеет логических операторов с коротким замыканием , поэтому оператор IsObject(val) And val Is Nothingвсе равно приведет к ошибке. Вам нужно будет разбить его на вложенный If.
Черан Шунмугавел
Я закрыл это как слишком локализованный для вас. В будущем вы можете просто пометить, чтобы сообщить нам об этом :)
Тим Пост
Есть ли у VBScript и еще? Я знаю, что это есть на VB.Net. Как бы то ни было, по крайней мере, он допускает короткое замыкание.
vbullinger
@vbullinger: Нет, в нем нет ленивой логики. blogs.msdn.com/b/ericlippert/archive/2004/07/15/184431.aspx - статья Эрика Липперта.
mixel

Ответы:

17

К сожалению, вы, вероятно, здесь застряли - JavaScript не имеет эквивалента "Nothing". См. Эту статью для получения дополнительной информации.

[Edit] Однако следующее может работать. В вашем VBScript создайте функцию с именем «GetNothing», которая возвращает «Nothing». В вашем JavaScript используйте «var jsNothing = GetNothing ()». Исходя из этой статьи

Pandelon
источник
4

Этот вопрос интересный, я подумал, что попробую ответить на него просто для удовольствия.

(Поздравляем Mixel с получением лучшей работы!)

У меня сейчас нет доступа к IE, поэтому я не могу это проверить, но что, если вы попытаетесь написать такую ​​функцию:

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

Конечно, я не знаю, позволяет ли сценарий VB вызывать такие функции ... и вам придется иметь дело с большим / меньшим количеством аргументов.

cwohlman
источник
Это хороший обходной путь. Но этот вопрос уже 3 года мертв. И я желаю, чтобы VBScript тоже умер :-) Благодарю за усилия и получайте положительные отзывы.
mixel
Я не пытался исправить проблему (поскольку я видел, что вы уже нашли лучшее решение), это был просто интересный вопрос, и я подумал, что решу его. Спасибо за голос!
cwohlman
VBScript продолжает оставаться механизмом написания сценариев, на котором работают некоторые продукты HP, поэтому он действительно не должен умереть. Все же.
TheBlastOne
0

Используйте такое значение, как ноль или даже отрицательное число, которое позволит вам просто использовать ложные оценки, тогда вам не придется беспокоиться о разных браузерах и их особенностях при оценке NULLобъекта.

Тимоти Аллин Дрейк
источник
1
Спасибо за ответ, но проблема в рамках. Он был написан давно и широко используется в больших приложениях, и я не могу его изменить. Я добавил к вопросу пример функции фреймворка, которая вызывается из javascript.
mixel
0

Например, что-то вроде этого будет работать, но если браузер IE11 или новее, вам понадобится тег 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
источник