To do this, we're going to inject JS dynamically at runtime. I'm only giving you code snippets, you'll have to tie the logic together yourself.
First, you'll want to make sure you have a working ExternalInterface and add a callback to handle scroll events coming from JS:
if (ExternalInterface.available && ExternalInterface.objectID != null)
{
try {
ExternalInterface.call('eval', 'true;');
ExternalInterface.addCallback("scrollEvent", onScrollEvent);
} catch (e:Error){
// nope!
}
}
Here's your handler:
function onScrollEvent(xDelta:Number, yDelta:Number):void
{
// scroll something in a fancy manner by xDelta and yDelta
// note: Webkit may give you TWO non-zero values as it allows
// simultaneous scrolling
}Now we need to drop the JS into a String const:
const SCROLL_SCRIPT:String = (<![CDATA[
function setupScrolling(objectID)
{
var flashObject = document.getElementsByName(objectID)[0];
var eventListenerObject = flashObject;
var isWebkit = false;
if (navigator && navigator.vendor)
{
isWebkit = navigator.vendor.match("Apple") || navigator.vendor.match("Google");
}
// some events will need to point to the containing object tag
if (isWebkit && flashObject.parentNode.tagName.toLowerCase() == "object")
{
eventListenerObject = flashObject.parentNode;
}
var scrollHandler = function(event)
{
var xDelta = 0;
var yDelta = 0;
// IE special case
if (!event)
event = window.event;
// IE/Webkit/Opera
if (event.wheelDelta)
{
// horizontal scrolling is supported in Webkit
if (event.wheelDeltaX)
{
// Webkit can scroll two directions simultaneously
xDelta = event.wheelDeltaX;
yDelta = event.wheelDeltaY;
}
else
{
// fallback to standard scrolling interface
yDelta = event.wheelDelta;
}
// you'll have to play with these,
// browsers on Windows and OS X handle them differently
xDelta /= 120;
yDelta /= 120;
// Opera special case
if (window.opera)
{
yDelta = -yDelta;
// Opera doesn't support hscroll; vscroll is also buggy
}
}
// Firefox (Mozilla)
else if (event.detail)
{
yDelta = -event.detail/1.5;
// hscroll supported in FF3.1+
if (event.axis)
{
if (event.axis == event.HORIZONTAL_AXIS)
{
// FF can only scroll one dirction at a time
xDelta = yDelta;
yDelta = 0;
}
}
}
try
{
flashObject.scrollEvent(xDelta, yDelta);
}
catch(e) {};
if (event.preventDefault)
event.preventDefault();
event.returnValue = false;
}
if (window.addEventListener)
{
// not IE
eventListenerObject.addEventListener('mouseover', function(e)
{
if (isWebkit)
{
window.onmousewheel = scrollHandler;
}
else
{
window.addEventListener("DOMMouseScroll", scrollHandler, false);
}
}, false);
}
else
{
// IE
flashObject.onmouseover = function(e)
{
document.onmousewheel = scrollHandler;
};
}
}]]>).toString();
Finally, execute it in the browser:
ExternalInterface.call("eval", SCROLL_SCRIPT);
ExternalInterface.call("eval", 'setupScrolling( "' + ExternalInterface.objectID + '" );');
Try it out (click the logo to look at my other documents at Scribd!) -- zoom in as far as you can go:
---
* Poor man's support for IE: Use a modifier key to enable horizontal scrolling. For instance, vertical scrolling works as usual -- and if you want hscroll, hold down CTRL while vscrolling.
