Hoe zorg ik ervoor dat mijn flitsobject scherpstelt op laden?

Ik heb geprobeerd deze testpagina in te stellen voor mijn flashgame, maar het weigert focus te krijgen op de belasting. Ik heb een heleboel forum-ingangen gelezen en heb er niets voor gedaan, ik kan niet echt geloven dat dit zo moeilijk zou moeten zijn.

Dit is wat ik heb:

  <head>
<title>UP HERE WE ESCAPE THE RAT RACE</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js"></script>
<script type="text/javascript">
    swfobject.embedSWF("UpHere.swf", "myContent", "700", "300", "9.0.0");

    function setFocusOnFlash() { 
    var fl = document.getElementById("myContent"); 
      if (fl) { fl.focus(); } 
    } 
</script>
  </head>
  <body  onload="setFocusOnFlash()">
  <div style="margin:0 auto; text-align:center; width:700px;">
    <div id="myContent" style="margin:0 auto; text-align:center; width:700px;">
      
Alternative content

</div> </div> </body>

You can see it live here, http://joon.be/exclusivepreview/

wat is er mis mee? Ik heb geen uitgebreide kennis van swfObject ...

5

4 antwoord

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);
}
6
toegevoegd

Ik was wanhopig op zoek om dit werk te krijgen, gewoon om mijn eigen Flash-game-ontwikkeling te versnellen, zodat ik niet elke keer hoef te klikken om mijn spel te testen. Dus het kon me niet schelen of het in alle browsers werkte, dus hier is er een die alleen in Chrome werkt.

<body onload='document.getElementById("haxe").focus();'>
    

Als u eerder hebt geprobeerd focus() en het werkte niet voor u, merk dan op dat u alleen de tag insluiten moet gebruiken, niet de object- en param-versie.

Getest op Chrome-versie 40.0.2214.93 (64-bits).

1
toegevoegd

De manier om dit te doen is om ExternalInterface te gebruiken en de focus naar Flash te sturen met behulp van een JS-listener op de tabbladgebeurtenis (dat wil zeggen terwijl het tabblad zich voor Flash van het element af beweegt). In de praktijk is het moeilijk en de stage.focus-afhandeling in je AS moet met wat, erm, eigenaardigheden overweg te kunnen. Maar het werkt vrij veel cross-browser

1
toegevoegd

De methode die u gebruikt, werkt alleen met Internet Explorer - het is een beperking van de manier waarop Flash wordt gebruikt.

http://kb2.adobe.com/cps/155/tn_15586.html

0
toegevoegd
en is er een methode om dit te doen met Chrome en andere browsers, of is flits voor automatische scherpstelling niet een denk dat je zou moeten/kunt doen?
toegevoegd de auteur joon, de bron
Er is misschien een manier om het te doen, maar ik heb het zeker nog niet ontdekt.
toegevoegd de auteur Justin Beckwith, de bron