2008-12-30 27 views
8

Sản phẩm của tôi mở trình duyệt web và trỏ nó vào một tệp HTML có chứa ứng dụng Flash cục bộ. Làm thế nào để tôi phát hiện lập trình cho dù tệp này được tải thành công và nếu không phải là ngoại lệ được ném? Có cách nào để làm điều này bằng cách sử dụng Javascript?Phát hiện xem ứng dụng Flash có được tải đúng cách bằng Javascript không?

Kiểm tra bên ngoài xem tệp có tồn tại trên đĩa không đủ vì tôi đã thấy các lỗi khác xảy ra (điều kiện chủng tộc có thể có liên quan).

Trả lời

11

Trả lời câu hỏi của riêng tôi: https://sourceforge.net/forum/message.php?msg_id=5929756

  1. Định nghĩa một hàm Javascript mà nên được gọi nếu Flash nạp.
  2. Gọi phương thức này từ đầu tệp Flash của bạn.
  3. Sử dụng bộ hẹn giờ để phát hiện xem cuộc gọi lại có bao giờ được gọi hay không.
  4. Ưu tiên gọi hàm Javascript từ Flash thay vì gọi các hàm Flash từ Javascript. Dù bằng cách nào bạn cũng không thể gọi một hàm chưa được tải. Nó dễ dàng hơn nhiều để đảm bảo rằng trình duyệt đã tải xong chức năng Javascript của bạn trước khi gọi nó từ Flash, hơn là đảm bảo rằng Flash đã tải xong chức năng Flash của bạn trước khi gọi nó từ Javascript.

Dưới đây là một ví dụ:

  • Tôi đang sử dụng swfobject để nhúng Flash.
  • Tôi sử dụng FlashVars để cho Flash biết chức năng Javascript cần gọi. Điều này rất hữu ích nếu có nhiều đối tượng Flash trên trang.

flash

var params:Object = LoaderInfo(this.root.loaderInfo).parameters; 
if (ExternalInterface.available) 
{ 
    var onLoaded:String = params["onLoaded"]; 
    if (onLoaded != null) 
     ExternalInterface.call(onLoaded, true); 
} 

Javascript

var flashLoaded = false; 
var flashTimer; 

function onFlashLoaded() 
{ 
    flashLoaded = true; 
    clearTimeout(flashTimer); 
} 

function onFlashTimeout() 
{ 
    if (!isFlashLoaded) 
    { 
     // Remove the Flash object in case it is partially loaded 
     $("#videoFeed").empty(); 
     $("#videoFeed").append('<div id="flashObject"></div>'); 
     alert("Failed to load video player"); 
    } 
    clearTimeout(flashTimer); 
} 

function connectToVideo() 
{ 
    var flashvars = {}; 
    flashvars.onLoaded = "onFlashLoaded"; 

    var params = {}; 
    params.menu = false; 

    var attributes = {}; 

    isFlashLoaded = false; 
    flashTimer = setTimeout("onFlashTimeout()", 5000); 

    swfobject.embedSWF("flash/VideoFeed.swf", "flashObject", "800", "600", "11", "expressInstall.swf", flashvars, params, attributes); 
} 
+1

rực rỡ! Điều này sẽ giúp ích rất nhiều cho ngày hôm nay: D –

3

Trên thực tế, khi các trang HTML kết thúc việc nạp, nội dung Flash có thể không được nạp hoàn toàn được nêu ra. Nếu SWF không được tải xong, thì nó sẽ xuất hiện thất bại.

Phương pháp tôi thường khuyên là để SWF gọi hàm JavaScript thông qua ExternalInterface ngay khi trình tạo lớp tài liệu được gọi. Về cơ bản, giả sử rằng SWF không tải được trừ khi hàm JS được gọi.

+0

Đủ công bằng, nhưng tôi cần một cách cụ thể hơn để phát hiện nếu xảy ra lỗi. Thời gian chờ không đủ tin cậy. – Gili

+0

Một vấn đề với phương pháp này là bạn không thể có hai phiên bản flash trên cùng một trang. Hoặc ít nhất bạn không biết cái nào đã kích hoạt cuộc gọi lại. – zimbatm

+0

Để biết SWF nào đã kích hoạt gọi lại, bạn có thể chuyển một chuỗi hoặc số duy nhất làm số nhận dạng bằng FlashVars. Khi SWF thực hiện lệnh gọi JavaScript, nó cũng chuyển mã định danh trong các đối số. – joshtynjala

1

Làm theo tài liệu hướng dẫn ExternalInterface adobe: http://livedocs.adobe.com/flex/3/langref/flash/external/ExternalInterface.html một số trình duyệt web hạn chế gọi hàm Javascript thông qua ExternalInterface trong trình tạo lớp tài liệu nếu bật trình chặn cửa sổ bật lên.

Có giải pháp nào khác để phát hiện khi phim swf đã được tải thành công không?

4

Trong trường hợp bạn không thể sửa đổi swf và thêm ExternalInterface không phải là một tùy chọn, bạn vẫn có thể sử dụng Javascript để nhận trạng thái của swf. Ví dụ, bạn có thể gọi document.getElementById (swf_id) .PercentLoaded() từ Javascript, và đợi nó là 100.

Điều đó sẽ không cho bạn biết ngoại lệ nào được ném nếu swf không tải được, nhưng ít nhất bạn sẽ biết chắc chắn liệu nó có được tải hay không. Các cuộc gọi hữu ích khác được tìm thấy tại đây: http://www.adobe.com/support/flash/publishexport/scriptingwithflash/scriptingwithflash_03.html

+0

bạn có thể khởi chạy một tệp SWF để phát tệp SWF khác không? Bạn kiểm soát trình bao bọc, và nó ném một ngoại lệ nếu tệp SWF lồng nhau ném một. – Gili

+0

Liên kết này đang trả về 404 ngay bây giờ. –

Các vấn đề liên quan