Работа с «Out» параметрами в JavaScript - PullRequest
10 голосов
/ 26 февраля 2011

Я работаю с элементом управления ActiveX в Internet Explorer 8, который отображает диалоговое окно сохранения файла, в котором пользователь может выбрать имя и тип файла (jpg, gif и т. Д.). Эти значения передаются в код, а затем используются в другом методе для сохранения файла. К сожалению, метод, который вызывает диалог, не имеет возвращаемого значения, а имя файла и тип файла передаются как из параметров.

Подпись метода (выраженная в Visual Basic) выглядит следующим образом:

Public Sub SaveFileDialog( _
   ByVal bstrDialogType As Variant, _
   ByRef pbstrFileName As String, _
   ByRef out_pvType As Long _
)

Два параметра ByRef являются параметрами out .

Я написал следующий код JavaScript:

try
{
    var saveFileName, saveFileType; // out variables
    gxVideoPlayBack.SaveFileDialog("image", saveFileName, saveFileType);
    alert(saveFileName); // displays "undefined"
    alert(saveFileType); // displays "undefined"
}
catch(error)
{
    if(!error.number === -2147221484) // User clicked cancel.
    {  
        alert(error.message);
    }
}

Код работает в том смысле, что элемент управления ActiveX создает свое диалоговое окно, и я могу справиться с ошибочными условиями, но Я не могу понять, как получить значения параметров out .

В коде gxVideoPlayBack является ссылкой на элемент управления ActiveX, встроенный в DOM через элемент HTML.

Если JavaScript не будет работать для этого, можно ли это сделать в VBScript?

В качестве альтернативы я могу просто реализовать свой собственный диалог, но лучше использовать предоставленный.

Ответы [ 3 ]

7 голосов
/ 26 февраля 2011

Редактировать: Кажется, что невозможно иметь "out" параметры в JavaScript / JScript.

Оригинал: Возможно, подход , описанный в этой статье , сработает:

var saveFileName={}, saveFileType={}; // Empty "output" objects.
gxVideoPlayBack.SaveFileDialog("image", saveFileName, saveFileType);
alert(saveFileName.value); // The "value" attribute is assigned ...
alert(saveFileType.value); // ... by the "SaveFileDialog" method?

Я предполагаю, что идея заключается в том, что оболочка WSH для этого собственного вызова будет пытаться присвоить свойство "value" заданным выходным параметрам, так что вы можете либо переопределить установщик значения, либо просто дать ему объект со встроенным установщик значений.

1 голос
/ 26 февраля 2011

Все аргументы функции в JavaScript передаются по значению (даже если передаваемое значение является ссылкой на объект ( что это такое)). Там нет передачи по ссылке.

Если SaveFileDialog изменяет объекты, на которые ссылаются saveFileName и saveFileType, то у вас есть доступ к этим изменениям через существующие переменные.

0 голосов
/ 26 февраля 2011

К сожалению, параметры out / ByRef будут работать только в JScript для объектов; не для любого другого типа (числа, строки).

В этом случае вам придется использовать VBScript, который поддерживает аргументы ByRef, или , как говорит maerics , написать оболочку VB / VBScript для метода SaveFileDialog, который может вернуть объект, содержащий оба имя и тип файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...