在JavaScript中使用“Out”参数

10

我正在使用 Internet Explorer 8 中的 ActiveX 控件,该控件将显示一个保存文件对话框,让用户选择文件名和文件类型(jpg、gif 等)。这些值会被传递给代码,然后在不同的方法中用于保存文件。不幸的是,调用对话框的方法没有返回值,并且文件名和文件类型被作为out参数传递。

该方法的签名(用 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控件可以产生其对话框,我也可以处理错误条件,但是我似乎无法弄清如何捕获输出参数的值。在代码中,gxVideoPlayBack是通过HTML元素嵌入DOM中的ActiveX控件的引用。如果JavaScript无法实现这一点,是否可以使用VBScript?作为替代方案,我可以编写自己的对话框,但更愿意使用提供的对话框。
3个回答

7

编辑:似乎在JavaScript/JScript中不可能有“out”参数。

原文:也许这篇文章中描述的方法可以起作用:

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"属性,因此您可以覆盖值设置器或只需提供具有内置值设置器的对象。


这就是XPConnect连接JavaScript和XPCOM之间引用差距的方式,但我不知道ActiveX是否有类似的功能。 - Wayne
@lwburk:是的,我也一样,只是提出一个想法。我认为现实情况是,在JScript/JavaScript中没有“out”参数。 - maerics
1
有趣的概念。不幸的是,当我将这两个变量初始化为空对象时,SaveFileDialog 抛出了类型异常。它期望一个字符串和一个整数。 - RunnerRick
我的结论是从JavaScript中无法利用ActiveX方法中的“out”参数,但这是最佳答案。 - RunnerRick

1
JavaScript 中的所有函数参数都是按值传递的(即使被传递的值是一个对象的引用(它确实是))。没有按引用传递。
如果 SaveFileDialog 修改了由 saveFileName 和 saveFileType 引用的对象,则可以通过现有变量访问这些更改。

0

不幸的是,在 JScript 中,out/ByRef 参数仅适用于对象,而不适用于任何其他类型(数字、字符串)。

在这种情况下,您将不得不使用支持 ByRef 参数的 VBScript,或者像 maerics 所说的那样,编写一个 VB/VBScript 包装器来保存 SaveFileDialog 方法,该方法可以返回一个包含文件名和类型的对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接