2008-11-21 69 views
1

我正在使用Flash TextField控件在Flash演示文稿中顯示一些HTML內容,以便在大型觸摸屏上顯示。不幸的是,如果在顯示HTML內容指向一個不存在的圖像的任何圖像標籤,將會顯示一個對話框並顯示錯誤消息Flash TextField HTML - 如何防止丟失圖像的錯誤對話框? (錯誤#2044:未處理的IOErrorEvent :. text =錯誤#2035:找不到URL)

Error #2044: Unhandled IOErrorEvent:. text=Error #2035: URL Not Found. 

我試圖避免這種對話彈出。用於通過加載器類加載內容的solution是爲了趕上IOErrorEvent.IO_ERROR,但我試着在TextField上,在舞臺上,Main和loaderInfo上聽到這一點無濟於事。我嘗試在試穿中包裹整個事物,但這也行不通。

下面是簡單的代碼,我使用的是找到解決辦法:

package { 
    import flash.display.Sprite; 
    import flash.errors.IOError; 
    import flash.events.Event; 
    import flash.events.IOErrorEvent; 
    import flash.text.TextField; 
    import flash.text.TextFieldType; 

    public class Main extends Sprite { 

     public function Main():void { 
      if (stage) init(); 
      else addEventListener(Event.ADDED_TO_STAGE, init); 
     } 

     private function init(e:Event = null):void { 
      removeEventListener(Event.ADDED_TO_STAGE, init); 

      var html:TextField = new TextField(); 
      html.type = TextFieldType.DYNAMIC; 
      html.multiline = true; 
      html.htmlText = "Bogus image: <img src=\"foo.jpg\" />";   

      addChild(html); 
     } 
    } 
} 

編輯:這裏是整個工作的代碼。

對於動態內容等等,當然,你需要的圖像列表,並生成一個處理功能等

package { 
    import flash.display.Loader; 
    import flash.display.Sprite; 
    import flash.errors.IOError; 
    import flash.events.Event; 
    import flash.events.IOErrorEvent; 
    import flash.text.TextField; 
    import flash.text.TextFieldType; 

    public class Main extends Sprite { 

     public function Main():void { 
       if (stage) init(); 
       else addEventListener(Event.ADDED_TO_STAGE, init); 
     } 

     private function init(e:Event = null):void { 
       removeEventListener(Event.ADDED_TO_STAGE, init); 

       var html:TextField = new TextField(); 
       html.type = TextFieldType.DYNAMIC; 
       html.multiline = true; 
       html.htmlText = "Bogus image: <img id=\"image\" src=\"foo.jpg\" />";     

       var loader:Loader = html.getImageReference("image") as Loader; 
       if(loader){   
        loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, function(e:Event):void { 
          trace("Error loading foo.jpg!"); 
         }); 
       }    

       addChild(html); 
     } 
    } 
} 

回答

5

您可以添加ID對圖像

html.htmlText = "Bogus image: <img src=\"foo.jpg\" id="image" />"; 

然後安裝IOErrorEvent處理程序,以每幅圖像在HTML

var loader:Loader = html.getImageReference("image") as Loader; 
if(loader){ 
    loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, function(e:Event):void{}); 
} 
+0

哦...我現在沒有時間去測試這個,但我會解決它。 – 2009-05-27 21:24:41

-1

這是一個問題,我還面臨着:這是一個真正的煩惱。我真的很想抓住所有的錯誤。我認爲你可以說...

stage.addEventListener(IOError.IO_ERROR, myErrorHandler); 

...但是,這似乎並沒有工作,因爲你已經指出。

也許您可以檢查以確保自助服務終端的Flash播放器不是調試版本。我不認爲發佈版本會拋出對話框(可能是錯誤的)。

2

這是一個很酷的問題。

我有兩個建議。

1)不要使用TextField。我猜你是在Flex之前用Flash開發的,就像我一樣。您可能已經知道這一點,但花了一段時間才發現:TextField對象並不是用於在Flex中定期使用的。從Flex3語言裁判檢查了這一點:

TextField類用於創建文本顯示和輸入 顯示 對象。 SWF文件中的所有動態和輸入文本 字段都是TextField類的 的實例。您可以使用 TextField類來執行低級 文本呈現。但是,在Flex中, 通常使用標籤,文本, TextArea和TextInput控件以 處理文本。

顯然,使用TextField沒有任何問題,但是我發現當我試圖弄清楚棘手的問題時,盡我所能去除未知數是非常有幫助的(儘可能多,至少)。

2)我想我會嘗試擴展文本組件,或者基於文本創建一個新組件。在這個組件中,我會添加加載和插入圖像到TextField對象的邏輯。這樣,您可以輕鬆地構建並驗證要插入到TextField對象中的字符串,然後再將其插入到TextField中。

如果你得到這個工作,請張貼 - 我可以自己使用它。 :)

-1

不可能!如果您使用Loader加載不存在的圖像,則會出現同樣的問題! Flex是一個框架,Image類使用這個Flash Loader對象,但有大量的代碼行(查看SwfLoader的源代碼...)。

您可以檢查圖像的URL,然後設置htmlText屬性,也可以創建自己的組件來顯示文本和圖片..

我無法相信這個簡單的&愚蠢的缺陷,是不是還由Adobe固定!

1

如果您有一種方法可以使用新的FTE/TLF組件,請這樣做。 Adobe基本上不贊成舊的TextField API,這種錯誤也是我過去不得不放棄許多項目和組件的原因。這個錯誤被拋出,基本上不能被捕獲。我認爲Flash工作最糟糕的方面之一。

TLF解決了這些問題,並且更容易處理。現在只需幾個小時就可以在舊API中進行幾天的實驗。我在新的API上構建了一些富文本編輯器,它非常好用。你會很高興你做的:)

1

我能夠檢測圖像何時加載,但我想我會遵循TLF的建議。無論如何,如果你需要知道,你必須在Loader上實現一個enter_frame事件監聽器,並檢查bytes屬性中的contentInfo的長度,如果圖像沒有加載長度爲0xffffffff,如果圖像加載的長度是文件的大小,如果有錯誤,則字節屬性爲NULL。

1
var html:TextField = new TextField(); 
    html.width=388.95; 
    html.height=400; 
    html.type = TextFieldType.DYNAMIC; 
    html.multiline = true; 
    html.htmlText = "Bogus image: <img id='image' src='foo.jpg'/>";     
    var loader:Loader = html.getImageReference("image") as Loader; 
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHan); 
function completeHan(e:Event){ 
    addChild(html); 
} 

This will work.. 
相關問題