浏览器中的Flash 鼠标滚轮事件

鼠标滚轮事件其实并不简单。不同的浏览器对鼠标滚轮事件的响应方式和delta值都不一样。更糟的是,delta值还会因为使用硬件的不同而不同。比如,在Windows系统的Safari531.21.8中,delta值为120,而在Mac系统中,这一数值为12。如果你滚动的够快的话,delta值会变得非常大。如果你的Mac带有多点触摸功能的触摸板,或是“魔术鼠标”,delta值也会不一样。

并且对于每次的滚动,Safari会触发至少两次事件,而Firefox只会触发一次。还需注意,当在页面中插入Flash对象时,wmode的设置将会极大的影响Flash对象的绘制方式和事件处理方式。

只用Flash,在某些wmode下,你甚至不能监听到鼠标滚轮事件,即使能够监听到事件,你也无从得知该鼠标事件的delta是多少。

这时,我们就要启用JavaScript啦。我们可以添加Javascrpt监听器,并用它调用swf中的事件。这听起来不错,不过仍会碰到程序部署的问题。比如你要通过一个广告条发布公司来发布你的swf,那就不可以插入自定义的JavaScript了。

此时,我们就要使用JavaScript注入技术。

点此下载所需类库

http://labs.byhook.com/swfs/WheelTest.swf

上面是demo,滚动鼠标滚轮或多点触摸板,或其它任何能够触发滚轮事件的设备,你会看到swf的变化。deltas列表列出了浏览器发送给swf的delta值,Event Count 是目前触发的事件数总和。“Use Raw Values” 和“Used Scaled Value”按钮可以切换发给swf事件原始值或是经过JS转换过的值。 按钮下的文字显示了浏览器信息。点击“Clear”按钮,可以清除列表中的delta值。

如果你查看本页源码,你会发现其中没有关于提交滚轮事件的代码,这是因为代码在页面渲染后注入了浏览器缓存中。你可以通过以下两片文章学习怎样做:

http://blog.earthbrowser.com/2009/01/simple-solution-for-mousewheel-events.html
http://www.actionscript.org/resources/articles/745/1/JavaScript-and-VBScript-Injection-in-ActionScript-3/Page1.html

我使用的许多代码都来自 Earth Browser 博客,但我加入了一些安全验证的内容,并做了一些小改动以使它更易于使用。

下面我将教你如何做。


务必记住导入类包

  1. import com.jac.mouse.MouseWheelEnabler;
复制代码
这就可以啦。在不同的 浏览器 ,平台和 窗口模式下,都能起作用。当swf收到Javascript的调用命令时,会建立一个新的鼠标事件,并发布这一事件。

代码注入有两个部分,我简单介绍一下。首先是 MouseWheelEnabler.as 中的  registerJS()
  1. private static function registerJS() : void
  2.         {
  3.             if( ExternalInterface.available )
  4.             {
  5.                 var id:String = 'mws_' + Math.floor(Math.random()*1000000);
  6.                 ExternalInterface.addCallback(id, function():void{});
  7.                 ExternalInterface.call(MouseWheelEnabler_JavaScript.CODE);
  8.                 ExternalInterface.call("mws.InitMouseWheelSupport", id);
  9.                 ExternalInterface.addCallback('externalMouseEvent', handleExternalMouseEvent);   
  10.             }
  11. }
复制代码
这是由前面提到的 init() 命令调用的。这一方法首先建立一个新“类”,并用 addCallback() 方法将其加入DOM中。这样,我们就能定位嵌入的swf。一旦我们能找到swf,我们就能检测swf的属性,例如wmode。

然后  ExternalInterface.call() 执行“注入”。它将所有控制 浏览器 层事件的javascript 加入现在的DOM中。查看MouseWheelEnabler.as文件的底部,你会发现一个叫 MouseWheelEnabler_JavaScript 的类。 它是一个带有HTML的<script>标签,包含所有JS代码的常量。当它通过 call() 方法被调用时,会定义一个匿名函数,然后生成一个新的命名空间。我们通过这一命名空间访问新定义的JS方法与属性。

我们加入了诸如BrowserInfo,userRawValues,eventTimeout,使这个类更易使

用。

首先是 BrowserInfo。 这一部分代码实现了demo中用户 浏览器 识别的功能。
  1. var browserInfo:BrowserInfo = MouseWheelEnabler.getBrowserInfo();
  2. if (browserInfo)
  3. {//show
  4.       _detectedText.text = (browserInfo.browser + " / " + browserInfo.platform + " / " + browserInfo.version);
  5. }//show
复制代码
当调用 MouseWheelEnabler.getBrowserInfo()  时,swf通过注入的JS与 浏览器 通信,并得到包含 浏览器 信息的返回值。这些返回值对象被分解,值存入一个新的BrowserInfo 对象。 BrowserInfo有3个属性和一些公共常量,属性分别为myInfoObject.platform, myInfoObject.browser, myInfoObject.version.这些值可以与BrowserInfo中的常量进行比较。

下面是类MouseWheelEnabler中的 useRawValues 属性
  1. MouseWheelEnabler.useRawValues = true;
复制代码
如果这个值设置为true,那MouseWheelEnabler会获取 浏览器 发送实际值。如果为false,则JS会将 浏览器 值按比例转换成更小的值。例如,它会将Safari 浏览器 的120转换成10,或是按你期望的比例转换。
要改变比例,请查看注入的JS代码中的 if(event.wheelDelta)  部分。 

最后是类MouseWheelEnabler中的 eventTimeout 属性
  1. //This is in milliseconds
  2. //This is why you don't see multiple events firing in the demo above.
  3. MouseWheelEnabler.eventTimeout = 50;
复制代码
这个属性可以减小每次 滚轮 触发的事件数。这实际上是一个事件调节系统。默认时间间隔为50毫秒,这足以跳过一些 浏览器 的第二次事件发布。如果将此值设为0,则能接收到所有事件。


MouseWheelEnabler类下载:
http://pan.baidu.com/s/1eQmWbsQ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值