Ik heb een manier gevonden die voor mij werkt op Firefox 16, Chrome 23 en IE 8 (hier heb ik het tot nu toe getest). Natuurlijk, dit is een stel hacks dus wie weet of het voor altijd zal werken ... maar het maakt de zaken zeker niet erger.
function setFocusOnFlash() {
var flash = document.getElementById("theIdOfTheObjectElement");
flash.tabIndex = 1234; //This was needed on Chrome 23
flash.focus();
//Attention: FireFox needs wmode "opaque"!
}
Alleen op Firefox was
onder het element object
ook nodig, of anders focus()
had geen effect. (Ik heb Stephen Belanger's jQuery.flash
gebruikt, waar je wmode
kunt opgeven, ik neem aan dat het ook mogelijk is met SWFObject
.)
Maar het lastiger gedeelte is dat u setFocusOnFlash
niet te vroeg moet aanroepen. Voor Chrome en IE voegt u setTimeout (setFocusOnFlash, 1)
toe direct nadat het JavaScript dat het object invoegt heeft gewerkt. Rechtstreeks het uitgeven van setFocusOnFlash()
deed dat niet. Ik neem aan dat de truc is dat de getimede callbacks pas worden aangeroepen nadat de browser de documentwijziging volledig heeft verwerkt, ongeacht de vertraging die u opgeeft. Maar bij Firefox was het bellen met deze kleine vertraging te vroeg; er is een gestippelde rand rond het element object
geplaatst (dit zou niet moeten gebeuren) en Flash heeft de toetsaanslagen niet gekregen. De vertraging instellen op 250 heeft dit op mijn computer opgelost, maar wie weet hoe groot de vertraging is die je nodig hebt. (Erger nog, het herhalen van de setFocusOnFlash
-aanroepen hielp ook niet ... zodra die gestippelde rand er was, hadden ze geen verder effect.) Dus, wat ik in plaats daarvan heb gedaan is het toevoegen van een ExternalInterface. call ("flashLoaded")
callback naar de constructor flash document class. Voor de duidelijkheid, doe je dat in Flash/ActionScript, dus je hebt toegang nodig tot de bron of tot de auteur van het SWF-bestand. Op deze manier roept het de flashLoaded
JavaScript-methode op van de HTML-pagina voor insluiting wanneer de SWF start, zodat u weet dat het gereed is. De functie was als:
function flashLoaded() {
//Oddly, directly calling setFocusOnFlash() didn't work on IE8
setTimeout(setFocusOnFlash, 1);
}