Flex嵌入到HTML中切换焦点不能输入中文和遮盖DIV的问题
默认情况下如果Flash被嵌入到Web页面中,则SWF文件默认被置于所有HTML元素的顶层渲染级别的。类似在所有html元素的总父容器上一层,无法被任何html元素遮挡。
无论怎么设置flash容器和层的深度(z-index)也无济于事。 遇到这个问题我们可以在插入flash的embed或object标签中加入“wmode”属性并设置为wmode=“transparent”或”opaque” 在Flex4中默认的HTML包围容器的方式变了如代码: <script type="text/javascript"> var swfVersionStr = "10.0.0"; var xiSwfUrlStr = "playerProductInstall.swf"; var flashvars = {}; var params = {}; params.quality = "high"; params.bgcolor = "#ebf4ff"; params.allowscriptaccess = "sameDomain"; params.allowfullscreen = "true"; var attributes = {}; attributes.id = "BSC_ABIS_App"; attributes.name = "BSC_ABIS_App"; attributes.align = "middle"; swfobject.embedSWF( "BSC_ABIS_App.swf","flashContent","100%",swfVersionStr,xiSwfUrlStr,flashvars,params,attributes); swfobject.createCSS("#flashContent","display:block;text-align:left;"); </script> 这时我们可以在上面的params中加 params.wmode = "opaque";或者 params.wmode = "transparent";其他情况基本相同 然后我们了解下这些属性: window 模式 默认情况下的显示模式,在这种模式下flash player有自己的窗口句柄,这就意味着flash影片是存在于Windows中的一个显示实例,并且是在浏览器核心显示窗口之上的,所以flash只是貌似显示在浏览器中,但这也是flash最快最有效率的渲染模式。由于他是独立于浏览器的HTML渲染表面,这就导致默认显示方式下flash总是会遮住位置与他重合的所有DHTML层。 但是大多数苹果电脑浏览器会允许DHTML层显示在flash之上,但当flash影片播放时会出现比较诡异的现象,比如DHTML层像被flash刮掉一块一样显示异常。 Opaque 模式 这是一种无窗口模式,在这种情况下flash player没有自己的窗口句柄,这就需要浏览器需要告诉flash player在浏览器的渲染表面绘制的时间和位置。这时flash影片就不会在高于浏览器HTML渲染表面而是与其他元素一样在同一个页面上,因此你就可以使用z-index值来控制DHTML元素是遮盖flash或者被遮盖。 Transparent 模式 透明模式,在这种模式下flash player会将stage的背景色alpha值将为0并且只会绘制stage上真实可见的对象,同样你也可以使用z-index来控制flash影片的深度值,但是与Opaque模式不同的是这样做会降低flash影片的回放效果,而且在9.0.115之前的flash player版本设置wmode=”opaque”或”transparent”会导致全屏模式失效。 当看完这些属性时,我们恍然大悟 可以解决了。但是问题接踵而来,就是我们突然发现 当焦点置于Flash后再切换到HTML元素中 如HTML的INPUT输入框中,不管怎么切换我们的输入法,中文就是出不来。 不要急,其实这算是Flash的一个BUG但是我们也有办法解决 当我使劲翻阅了藏在API角落的一个函数时我笑了。淫荡的笑了。 这个大侠就是flash.system.Capabilities。 我们只需用到它的一个属性 就是查看系统的输入法 Capabilities.hasIME :[只读] 指定系统是否安装了输入法编辑器 (IME),如果是,则为 当我们焦点进入到Flash时 我们的 IME.enabled属性直接被Flash禁用 值变为False 这也就是 当我们为什么焦点放在HTML的元素中 狂且输入法就是不管用的原因。既然找到原因了。那么我们动手解决吧 首先对Flash主程序进行事件监听用到这个事件MouseEvent.ROLL_OUT: 用户将指针设备从 InteractiveObject 实例上移开时分派。事件目标是指先前在指针设备下的对象或该对象的父级。
appGroup.addEventListener(MouseEvent.ROLL_OUT,setSRF); /** * 当光标离开Flash时开启设置系统的输入法 * */ private function setSRF(event:MouseEvent):void{ if(Capabilities.hasIME){ try{ if(!IME.enabled){ IME.enabled=true; } IME.conversionMode="CHINESE"; }catch(error:Error){ } } }OK 运行我们的页面 发现 成功了。DIV也上来了。中文输入法也能用了。高兴欢呼吧 转载请注明出处 http://www.voidcn.com/article/p-tenayxgc-bkn.html (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |