flex导致浏览器对指定站点输入法无法输入中文的有关问题

flex导致浏览器对指定站点输入法无法输入中文的问题

主体环境

     flash player 11, ie8/ie9, mx控件(非s控件),xp系统,极点五笔


问题

    在html中设计div弹方框,并用swfobject方式加载swf,同时设置其params.wmode="opaque",此swf包括mx:Button, mx:Label, mx:Progressor, mx:Cavas, mx:Image, mx:HBox等,没有mx:Textfield.

    html页面中包括textarea。

    加载后,textarea无法输入中文了,无论怎么切换输入法都不可以。同时,访问当前浏览的网站的其他页面的textarea/input,也无法输入中文了。


主要原因

    flex的控件,都有设置内部的IME支持,默认情况下,这些控件应该是根据一定的系统初始化了IME的设置(暂时无法取证),而且IME的生效与控件的focus相关。所以当浏览器访问flex的控件时,会触发了IME的设置,并把浏览器当前站点的IME设置给屏蔽掉。


测试及验证

    案例1:更换输入法 为sougo中文输入法

    结果1:问题继续呈现,证明与输入法的安装及环境无关

 

    案例2:更换浏览器 为chrome, firefox, 360(IE),ie7, ie8, ie9

    结果2:chrome(33.+版本), firefox(27.+版本)问题不再呈现,360(IE),ie8,ie9,ie7出现,可见这种现在发生在IE上


    案例3:将wmode设置为"window", "transparent","opaque"

    结果3:window模式问题不再呈现,而opaque, transparent则会发生此问题


    案例4:测试是在flash加载后产生,还是在控件focus后产生(以button为代表)

    结果4:flash加载,不触发任何控件的聚焦,则不会发生;反而一旦触发了某个控件的focus事件,则产生问题。


    案例5:测试各种控件的发生情况,button,label,image,textfield等

    结果5:基本的文字控件(button, textfield, date等)都会,combox, image, label则不会


解决方案

    方案1: 一般情况下,flex应该遵循外部的IME设置,可以在初始化整个flex窗体的时候,全部设置: 

focusManager.mx_internal::IMEEnabled = false;

    参考: https://issues.apache.org/jira/browse/FLEX-33144


    方案2:利用flash.system.Capabilities设置窗体的roll out 事件:

addEventListener(MouseEvent.ROLL_OUT, function(e:Event):void{
    if(Capabilities.hasIME){  
      try{  
        if(!IME.enabled){IME.enabled=true;} 
        IME.conversionMode="CHINESE";
      }catch(e:Error){ } 
    }  
}); 

     参考:http://zyn010101.iteye.com/blog/1115295

    

     方案3:除非有样式要求,否则直接使用wmode="window"方式。

     

     其他方案,可参考 http://hi.baidu.com/jackflit/item/59725b9a14c7908a581461a0 (没有试过)