首页 > 代码库 > 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 (没有试过)
flex导致浏览器对指定站点输入法无法输入中文的问题