I've been trying to come up with a solution for locking the browser
scrolling when a swf is in focus that doesn't involve any modification
of the swf itself. Naturally, I'm using javascript focus and blur
(unfocus) events. I got it to work by setting the onfocus and onblur
params in the attributes when I embed the .swf (you can see this in
the below code, commented out).
Unfortunately, Google Chrome does not support these events as
parameters, and they must be added through addEventListener. I've
spent several hours trying different approaches to this, and none have
worked. My current code is below. The "problem code" here would be the
getElementByID towards the end. If I put an alert before that, the
alert shows. If I put one after, it does not. I have concluded that
I'm doing something wrong there.
Essentially, my problem boils down to this: How can I get a reference
to the embedded swf so that I can add event listeners to it.
<pre>
<script>
var flashvars = {
};
var params = {
menu: "false",
scale: "noScale",
allowFullscreen: "true",
allowScriptAccess: "always",
bgcolor: "",
wmode: "direct" // can cause issues with FP settings &
webcam
};
var attributes = {
id:"Wheeltest", //-------------------
IMPORTANT---------------
//onfocus:"focusIn()" , //These two lines are
important
//onblur:"focusOut()", //They handle setting the
browser scroll
on focus gain/loss
//tabindex:"1"
};
swfobject.embedSWF(
"Wheeltest.swf",
"altContent", "300", "40", "10.0.0",
"expressInstall.swf",
flashvars, params, attributes);
//---------DEFINING VARIABLES AND FUNCTIONS---------
//this variable is a boolean that will tell whether browser
scrolling is locked (true) or not (false)
var browserScrolling;
//enable or disable browser scrolling
function allowBrowserScroll(value)
{
browserScrolling=value;
}
//convention dictates that the logic to handle mouse events
based on
delta (amount of mouse movement) should be
//in a seperate function from the code that will standardize
delta
input from different browsers.
//this function simply returns the value of browserScrolling
function handle(delta)
{
if(!browserScrolling)
{
return false;
}
return true;
}
//this function will be called when the mouse is scrolled.
event is
a mouse wheel event
function wheel(event)
{
//worse case scenario: we get a bad event. in this
case, we'll just
act like the mouse
//wasn't scrolled. that means delta is 0
var delta=0;
//if the event doesn't exist, let's use the window's
event instead
if(!event){event=window.event;}
//if the event has some mouse wheel data on it
//wheelData is the property used by Internet Explorer
and opera
if(event.wheelDelta)
{
//IE and opera both report a single "tick" of
the mouse wheel as
120 delta, so we need to scale down accordingly
delta=event.wheelDelta/120;
//furthermore, opera inverts the delta value.
we correct this here
if(window.opera){delta=-delta;}
}
//detail is the property used by Firefox. in this,
"ticks" are
reported as 3, so we scale down accordingly
else if(event.detail){delta=-event.detail/3;}
//if the wheel was scrolled (delta is nonzero), we call
our handle
function
//it doesn't actually do anything in this case, and is
left in as a
matter of convention
if(delta){handle(delta);}
//if browser scrolling is disabled, we want to prevent
the
browser... from scrolling.
if(!browserScrolling)
{
//we need to make sure the preventDefault
function is defined
before we call it, thus the if statement
//prevent default will stop the default action
(browser scrolling)
if(event.preventDefault){event.preventDefault();}
//anything else taht uses this event will know
that it has failed
to execute the default behavior
event.returnValue=false;
}
//in the case that browserScrolling is true, the
browser will
scroll like normal. We need not tell it to,
//since that is the default action.
}
//will be called when the swf gains focus
function focusIn()
{
allowBrowserScroll(false);
}
//will be called when the swf loses focus
function focusOut()
{
allowBrowserScroll(true);
}
//---------SETUP MOUSE WHEEL TRAPPING---------
// we need to ensure that the addEventListener function is
defined
if(window.addEventListener)
{
//add a listener that will call our scrolling function
function
when the mouse is scrolled.
window.addEventListener('DOMMouseScroll',wheel,false);
}
//the window and the document should have the same mouse wheel
scrolling function
window.onmousewheel=document.onmousewheel=wheel;
//allow browser scroll by default.
allowBrowserScroll(true);
function addFocusListeners()
{
// alert works here
var mySwf = window.getElementByID("Wheeltest");
//problem
// alert does not work here
mySwf.addEventListener('focus', focusIn, false);
mySwf.addEventListener('blur', focusOut, false);
}
swfobject.addDomLoadEvent(addFocusListeners);
</script>
</pre>
Thanks in advance.
--
You received this message because you are subscribed to the Google Groups
"SWFObject" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/swfobject?hl=en.