2011-02-25 2 views
10

Tôi đang làm việc với điều khiển ActiveX trong Internet Explorer 8 để hiển thị hộp thoại lưu tệp, cho phép người dùng chọn tên tệp và loại tệp (jpg, gif, v.v.). Các giá trị này được chuyển tới mã và sau đó được sử dụng trong một phương thức khác để lưu tệp. Rất tiếc, phương thức gọi hộp thoại không có giá trị trả lại và tên tệp và loại tệp được chuyển thành các tham số ra.Làm việc với tham số "Out" trong JavaScript

Chữ ký của phương pháp (thể hiện trong Visual Basic) trông như thế này:

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

Hai ByRef thông số là ra tham số.

Tôi đã viết mã JavaScript sau:

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); 
    } 
} 

Mã này hoạt động trong đó các điều khiển ActiveX sản xuất thoại của mình, và tôi có thể xử lý các điều kiện lỗi, nhưng tôi dường như không thể tìm ra cách để nắm bắt các giá trị của thông số ra.

Trong mã gxVideoPlayBack là tham chiếu đến điều khiển ActiveX được nhúng trong DOM thông qua phần tử HTML.

Nếu JavaScript sẽ không hoạt động cho điều này, nó có thể được thực hiện trong VBScript không?

Thay vào đó, tôi chỉ có thể triển khai hộp thoại của riêng mình, nhưng muốn sử dụng hộp thoại được cung cấp.

Trả lời

7

Chỉnh sửa: Dường như không thể có tham số "ngoài" trong JavaScript/JScript.

gốc: Có lẽ approach described in this article sẽ làm việc:

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? 

Tôi cho rằng ý tưởng này là wrapper WSH cho cuộc gọi có nguồn gốc này sẽ cố gắng gán "giá trị" tài sản của các thông số đầu ra nhất định, vì vậy bạn có thể ghi đè lên giá trị setter hoặc chỉ cần cung cấp cho nó một đối tượng với một setter giá trị được xây dựng trong.

+0

Đó là cách XPConnect kết nối cầu nối khoảng cách giữa JavaScript và XPCOM, nhưng tôi không biết liệu ActiveX có làm được điều tương tự hay không. –

+0

@ lwburk: vâng, cùng ở đây, chỉ cần ném ra một ý tưởng. Tôi nghĩ thực tế là các tham số "out" không có sẵn trong JScript/JavaScript. – maerics

+1

Khái niệm thú vị. Thật không may khi tôi khởi tạo hai biến cho một đối tượng rỗng * SaveFileDialog * ném một ngoại lệ kiểu. Nó mong đợi một chuỗi và một số nguyên. – RunnerRick

0

Thật không may, các tham số out/ByRef sẽ chỉ hoạt động trong JScript cho các đối tượng; không cho bất kỳ loại nào khác (số, chuỗi). Trong trường hợp này, bạn sẽ phải sử dụng VBScript, hỗ trợ đối số ByRef, hoặc like maerics says, viết trình bao bọc VB/VBScript cho phương thức SaveFileDialog, có thể trả về một đối tượng chứa cả tên tệp và loại tệp.

1

Tất cả các đối số hàm trong JavaScript là passed by value (ngay cả khi giá trị được thông qua là một tài liệu tham khảo đến một đối tượng (mà nó là)). Không có tham chiếu truyền qua.

Nếu SaveFileDialog sửa đổi các đối tượng được tham chiếu bởi saveFileNamesaveFileType thì bạn có quyền truy cập vào những thay đổi đó thông qua các biến hiện có của mình.