Flex 设置WMODE 后滚轮失效的解决方法
来源:互联网 发布:支付宝怎么登陆淘宝 编辑:程序博客网 时间:2024/05/17 20:24
1.问题产生
Flex 设置 wmode 属性为 opaque 或 transparent ,是为了解决flash 对象遮盖页面元素的问题。而随之而来产生了鼠标滚轮失效的问题,本人使用的Chrome浏览器,据说火狐也存在同样问题。
2.解决方法
解决方法主要是通过actionscript 中 ExternalInterface 的两个方法 addCallback 与 call 实现与浏览器 js 的鼠标事件的监听交互来实现的。以下代码来源于开源项目:flex-wmode-mousewheel-handler-example 和 EarthBrowser 。后经测试不兼容IE8,代码中已修正。
ActionScript 代码:
package com.adobe.utils.mousewheel{import flash.display.InteractiveObject;import flash.display.Stage;import flash.events.MouseEvent;import flash.external.ExternalInterface;/** full credit goes to: http://blog.earthbrowser.com/2009/01/simple-solution-for-mousewheel-events.html*/public class MouseWheelEnabler{static private var initialised : Boolean = false;static private var currentItem : InteractiveObject;static private var browserMouseEvent : MouseEvent;public static function init( stage : Stage ) : void{if( !initialised ){initialised = true;registerListenerForMouseMove( stage );registerJS();}}private static function registerListenerForMouseMove( stage : Stage ) : void{stage.addEventListener(MouseEvent.MOUSE_MOVE, function( e : MouseEvent ) : void{currentItem = InteractiveObject( e.target );browserMouseEvent = MouseEvent( e );});}private static function registerJS() : void{if( ExternalInterface.available ){var id:String = 'eb_' + Math.floor(Math.random()*1000000);ExternalInterface.addCallback(id, function():void{});ExternalInterface.call(MouseWheelEnabler_JavaScript.CODE);ExternalInterface.call("eb.InitMacMouseWheel", id);ExternalInterface.addCallback('externalMouseEvent', handleExternalMouseEvent);}}private static function handleExternalMouseEvent(delta:Number):void{if(currentItem && browserMouseEvent){currentItem.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_WHEEL, true, false, browserMouseEvent.localX, browserMouseEvent.localY, browserMouseEvent.relatedObject,browserMouseEvent.ctrlKey, browserMouseEvent.altKey, browserMouseEvent.shiftKey, browserMouseEvent.buttonDown,int(delta)));}}}}
JavaScript 代码段,直接写在ActionScript中,使用 ExternalInterface.call(MouseWheelEnabler_JavaScript.CODE); 调用。
class MouseWheelEnabler_JavaScript{public static const CODE : XML = <script><![CDATA[function(){// create unique namespaceif(typeof eb == "undefined" || !eb){eb = {};}var userAgent = navigator.userAgent.toLowerCase();eb.platform = {win:/win/.test(userAgent),mac:/mac/.test(userAgent)};eb.vars = {};eb.browser = {version: (userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1],safari: /webkit/.test(userAgent),opera: /opera/.test(userAgent),msie: /msie/.test(userAgent) && !/opera/.test(userAgent),mozilla: /mozilla/.test(userAgent) && !/(compatible|webkit)/.test(userAgent),chrome: /chrome/.test(userAgent)};// find the function we addedeb.findSwf = function(id) {var objects = document.getElementsByTagName("object");for(var i = 0; i < objects.length; i++){if(typeof objects[i][id] != "undefined"){return objects[i];}}var embeds = document.getElementsByTagName("embed");for(var j = 0; j < embeds.length; j++){if(typeof embeds[j][id] != "undefined"){return embeds[j];}}return null;}eb.usingWmode = function( swf ){if( typeof swf.getAttribute == "undefined" ){return false;}var wmode = swf.getAttribute( "wmode" );eb.log( "trying getAttributes: " + wmode );if( typeof wmode == "undefined" ){return false;}eb.log( "wmode: " + wmode );return true;}eb.log = function( message ) {if( typeof console != "undefined" ){console.log( message );}else{//alert( message );}}eb.shouldAddHandler = function( swf ){if( !swf ){return false;}if( eb.platform.mac ){return true;}var usingWmode = eb.usingWmode( swf );//if( !eb.browser.msie && usingWmode ) return true;if(usingWmode ) return true;////修复IE8滚轮失效的bugreturn false;}eb.InitMacMouseWheel = function(id) {var swf = eb.findSwf(id);var shouldAdd = eb.shouldAddHandler( swf );if( shouldAdd ) {var mouseOver = false;/// Mouse move detection for mouse wheel supportfunction _mousemove(event) {mouseOver = event && event.target && (event.target == swf);}/// Mousewheel supportvar _mousewheel = function(event) {if(mouseOver || (typeof mouseOver == 'undefined' && eb.browser.msie)) {var delta = 0;if(event.wheelDelta)delta = event.wheelDelta / (eb.browser.opera ? 12 : 120);else if(event.detail)delta = -event.detail;if(event.preventDefault)event.preventDefault();swf.externalMouseEvent(delta);return true;}return false;}// install mouse listenersif(typeof window.addEventListener != 'undefined') {window.addEventListener('DOMMouseScroll', _mousewheel, false);window.addEventListener('DOMMouseMove', _mousemove, false);}else if(typeof window.attachEvent != 'undefined') //修复IE8滚轮失效的bug{document.attachEvent('onmousemove',_mousemove);document.attachEvent('onmousewheel',_mousewheel);}window.onmousewheel = document.onmousewheel = _mousewheel;window.onmousemove = document.onmousemove = _mousemove;}}}]]></script>;}
3.使用示例
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" addedToStage="initMouseWheel()"> <mx:Script> <![CDATA[ import com.adobe.utils.mousewheel.MouseWheelEnabler; private function initMouseWheel() : void { MouseWheelEnabler.init( stage ); } ]]> </mx:Script> </mx:Application>
- Flex 设置WMODE 后滚轮失效的解决方法
- Flex 设置WMODE 后滚轮失效的解决方法
- Flex中将wmode设置为Opaque或Transparent时,鼠标滑轮mouseWheel事件失效的解决方法。
- 火狐中当wmode设置为trandparent/opaque时Flash不能响应滚轮缩放的问题
- HTML嵌入Flex,wmode的用法
- flex <param name="wmode" value="transparent">鼠标滚轮控制问题
- flex <param name="wmode" value="transparent">鼠标滚轮控制问题
- 关闭APP后cookie失效的解决方法
- <embed /> flash wmode属性的设置
- 在虚拟机上安装FC8后鼠标滚轮失效的解决
- VS2005断点设置失效的解决方法
- vc10设置断点失效的解决方法
- UEditor设置内容setContent()失效的解决方法
- Win7,64位设置成豆沙绿护眼颜色后,vc6的visual assist 颜色失效,解决方法
- flex的失效机制
- flex的失效机制
- Fedora8安装VMware Tools后鼠标滚轮不能用的问题的解决方法
- 后台程序弹出对话框(Reponse.Write)后css失效的解决方法
- Apache POI库简化,仅保留hwpf部分(word文档处理,可用于android)
- Python的字典操作
- 数据库事物隔离之通俗理解
- Universal ONVIF Viewer
- 正则表达式基础
- Flex 设置WMODE 后滚轮失效的解决方法
- 虚拟机与主机共享以及arm-linux-gcc3.3.2安装过程
- Linux设备模型(热插拔、mdev 与 firmware)
- EditText输入文字带下划线的效果
- hdu2141Can you find it?(二分查找)
- C#版数据包抓取过滤监控器
- 软件“版本”大全
- python 文件操作
- 甩掉学生气,做成熟的自己