Firefox/Chrome下flash的wmode參數設爲opaque或transparent時輸入文本框中無法輸入中文漢字的解決方法...

  這段時間做個項目,要涉及到flash開發。真悲催,之前沒有接觸過flash開發,於是找個哥們臨時教了一下Adobe Flash CS5 的使用方法,感覺還蠻簡單,所見即所得,和MFC下的開發有點像,漸漸摸到些門道,功能也開發得差不多了。於是,就像墨菲定律所述,Anything that can go wrong will go wrong(如果壞事有可能發生,不管這種可能性多麼小,它總會發生,並引起最大可能的損失),遇到一個巨噁心的問題,和大家分享下。
  在HTML文件裏有一個嵌入的flash,該flash中有一個輸入文本框。
  由於flash在嵌入HTML代碼中時,wmode參數默認被設置爲了window模式,這導致該flash下的所有HTML元素都會被隱藏。因此,如果想在該flash上顯示一個登錄框(提供用戶登錄,這是很正常的功能)或是在該flash上顯示一個div,必須要將flash的wmode參數設爲opaque或transparent(這個問題在我的另一篇文章 中有描述)。
  但是問題來了,在IE下該flash中的輸入文本框中是可以輸入中文的,但是在非IE內核的瀏覽器中(如Firefox和Chrome)下無法輸入中文(可以輸入英文)。究其原因是因爲Flash的這種模式很少用到,這是一種無窗口模式,繪製和輸入取決於瀏覽器,這種模式對於Flash來說, 繪製效率比較低,但是可以作爲HTML的層來使用,並支持透明,因此在國內還是挺常用的。由於這種模式Flash控件接收的輸入來自瀏覽器,因此需要瀏覽器對Flash的wmode特殊處理。很不幸的是,除了IE對Flash ActiveX的wmode下的透明繪製和中文輸入處理的很完美,別的瀏覽器都支持的很差。有的甚至連透明都繪製成一片黑色,就一個簡單的IME輸入,都 懶得解決。比如Firefox論壇上,這個問題從若干年前就被人發現了,一直無人修改,不光中文,所有依賴於IME的輸入都不行,包括歐洲一些國家的輸入法。
  這個BUG存在好幾年了,這很不幸,但是更不幸的是被我這個剛接觸flash開發的新手碰到了……聽說Flash Player 10.1終於修正了這個問題,可是,你不能保證用戶會升級到最新版的Flash Player啊。所以可能的話,我還是應該想個辦法搞定他。
  1. 頁面上放置一個html的textfield,AS封裝一個TextField,通過AS和JS通訊,在需要輸入的時候把這個輸入框挪過去。
  優點:支持各種輸入法,支持輸入框右鍵
  缺點:不夠優雅,AS和JS互通迅,JS加載失敗則沒戲
  2. 實現一個帶中文輸入法的TextField,用這個框替代所有的TextField
  優點:乾淨優雅,不容易出錯,兼容性好
  缺點:只支持自己實現的輸入法,易用性差
  3. 點擊的時候重建flash,設置wmode的參數值爲transparent,然後重新加載flash。
  注:改變了flash的顯示參數需要重新load的
  優點:可以解決該問題@@
  缺點:只要顯示html,就得重新加載flash
  4. 利用ExternalInerface與JavaScript window.prompt import flash.external.*; // 將 js function 宣告出去,(也可以直接寫在Html網頁中) ExternalInterface.call("eval", "function getInput(hint){return window.prompt(hint, '');}"); // 利用 ExternalInterface 呼叫 JS function,並取得 User 輸入文字 function doInput() { inputTxt.text = ExternalInterface.call("getInput", "請輸入文字"); } 優點:可行……
  缺點:以彈出對話框形式出現,用戶體驗不夠好。
  5. 使用thickbox( http://jquery.com/demo/thickbox/)這個opensource的JS工具,可以單純傳參數這個工具就會幫忙建立iframe,可以兼容IE和FF。
  注:該方法未經過測試。
  6. 使用swfInputs。詳見 http://blog.sebastian-martens.de/2009/05/swfinputs -solving-mozilla-transparent-mode-win-special-chars -within-inputs/
  優點:利用javascript動態增加input標籤來解決。效果很好
  缺點:可惜是Flex版,對我這種只用Flash開發的人沒有用
  7. 使用SwfText。詳見http://blog.webgene.com.tw/?cpage=1&p=2328
  注:該方法屬於Beta版,對我這種菜鳥不實用。
  沒辦法,網上搜了N多方法,沒一個適合我的,靠……自己動手,豐衣足食,來吧!
  首先,IE內核的瀏覽器下,wmode參數設爲opaque或transparent都可以,輸入文本框中可以輸入中文。
  其次,在非IE內核的瀏覽器下,解決方法如下。
  在嵌入flash的時候將wmode參數設置爲window模式。
  一個很偶然的發現,在通過iframe標籤引入一個網頁時,在某種很特殊的情況下(可能不止這一種情況),該iframe中顯示的內容可以覆蓋在flash上。
  條件:給body標籤增加background-color屬性@@。
  下面給出一個通過iframe嵌入的網頁的內容(showTips.shtml): body { background:url(http://mat1.gtimg.com/auto/datalib/ component/auto_kj_pic_03.gif) no-repeat; background-color:#fff; padding:0; margin:0px; width:220px; height:51px; } /* 在父頁面中調用該函數更改該頁面的內容 */ function setText(content) { document.getElementById('successTips').innerHTML = content; } 父頁面中的部分代碼: 於是,可以將所有想動態顯示在flash上的提示信息放到一個網頁中,通過iframe標籤嵌入到父頁面中(設置該iframe默認隱藏)。當需要顯示提示信息時,顯示該iframe就好了。
  注:個人感覺這種方法有點山寨,不是正規的解決辦法,但是,好歹也是一種解決辦法不是,只是我這中項目需求中,這種方法是最省事的^_^
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章