鼠标滚轮事件其实并不简单。不同的浏览器对鼠标滚轮事件的响应方式和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 博客,但我加入了一些安全验证的内容,并做了一些小改动以使它更易于使用。
下面我将教你如何做。
务必记住导入类包
代码注入有两个部分,我简单介绍一下。首先是 MouseWheelEnabler.as 中的 registerJS() 这是由前面提到的 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中用户 浏览器 识别的功能。 当调用 MouseWheelEnabler.getBrowserInfo() 时,swf通过注入的JS与 浏览器 通信,并得到包含 浏览器 信息的返回值。这些返回值对象被分解,值存入一个新的BrowserInfo 对象。 BrowserInfo有3个属性和一些公共常量,属性分别为myInfoObject.platform, myInfoObject.browser, myInfoObject.version.这些值可以与BrowserInfo中的常量进行比较。
下面是类MouseWheelEnabler中的 useRawValues 属性 如果这个值设置为true,那MouseWheelEnabler会获取 浏览器 发送实际值。如果为false,则JS会将 浏览器 值按比例转换成更小的值。例如,它会将Safari 浏览器 的120转换成10,或是按你期望的比例转换。
要改变比例,请查看注入的JS代码中的 if(event.wheelDelta) 部分。
最后是类MouseWheelEnabler中的 eventTimeout 属性 这个属性可以减小每次 滚轮 触发的事件数。这实际上是一个事件调节系统。默认时间间隔为50毫秒,这足以跳过一些 浏览器 的第二次事件发布。如果将此值设为0,则能接收到所有事件。
MouseWheelEnabler类下载:
http://pan.baidu.com/s/1eQmWbsQ