2008-10-31 8 views
16

내 페이지에 플래시 앱이 있는데, 사용자가 플래시 앱과 상호 작용하면 브라우저/html/javascript가 키보드 입력을받지 않습니다.플래시가 브라우저 포커스를 훔칩니다.

예를 들어 Firefox 컨트롤에서는 더 이상 새 탭을 열지 않습니다.

그러나 플래시가 아닌 페이지의 일부를 클릭하면 브라우저에서이 이벤트를 다시 받기 시작합니다.

프로그래밍 방식으로 (플래시 또는 자바 스크립트를 통해) 포커스를 브라우저로 반환 할 수 있습니까?

사용자가 플래시의 버튼을 클릭하면 플래시가 자바 스크립트 콜백을 실행하므로 자바를 통해 양식 필드 (및 본문)에 포커스를 부여하려고 시도했지만 그 방법은 보이지 않습니다. 일하고있어.

아마도 더 구체적인 예로 Youtube가 있습니다. 그들은 또한이 문제가 있습니다. 재생/일시 정지 버튼을 클릭하거나 볼륨을 조절할 때 브라우저 키보드 컨트롤이 여전히 작동 할 것으로 예상되지만 그렇지 않은 경우 동영상 영역 외부의 페이지를 클릭해야합니다. 이것이 내가 풀려고하는 정확한 문제입니다.

답변

3

어도비는 마우스가 클라이언트 영역을 벗어나거나 그렇게 할 수있는 옵션을 제공 할 때 포커스를 없애야한다고 생각합니다.

그러나 대부분의 플래시 개발자 (특히 게임을 만드는 사람들)는 마우스가 어디에 있든 관계없이 플래시 입력에 키보드 입력이 걸린다는 사실에 의존한다고 생각합니다.

당신은 HTML 페이지에 자바 스크립트를 호출 할 수의 getURL를 수행하여 브라우저에 초점을 반환 할 수 있습니다
0

:

document.body.focus() 

당신은 영화 작품과 방법을 사용자 상호 작용에 따라 달라집니다 Flash 동영상에서이 작업을 수행하는 방법 . 타이머 나 컨트롤이 포커스를 잃거나 마우스가 움직일 때 계속 할 수 있습니다. 그것은 달려있다.

5

Flash 내에서 ExternalInterface 클래스를 사용하여 JavaScript를 호출 할 수 있습니다. 예를 들어 당신이 간격 기능을 설정할 수 있습니다 (예를 들어되어 Event.ENTER_FRAME) @Diodeus이 언급 한 자바 스크립트 함수를 호출하기 :

document.body.focus(); 

또는 더 나은 솔루션이 될 것을에 이벤트 리스너를 추가하기를 마우스가 플래시를 벗어날 때들을 수있는 플래시 루트 (스테이지). 이 이벤트를 설정하여 document.body에 포커스를 이동시킬 수 있습니다.

AS3 페이지에

package { 
    import flash.display.*; 
    import flash.events.*; 
    import flash.external.ExternalInterface; 

    public class TestMouseLeave extends Sprite 
    { 
     public function TestMouseLeave() 
     { 
      // Add event listener for when the mouse LEAVES FLASH 
      addEventListener(MouseEvent.MOUSE_OUT, onMouseLeave); 
     } 

     private function onMouseLeave(ev:Event):void 
     { 
      var jslink = new ExternalInterface(); 
      jslink.call("changeFocus"); 
     } 
    } 

} 

자바 스크립트 :

<script type="text/javascript" language="javascript"> 
    function changeFocus(){ 
     document.body.focus(); 
    } 
</script> 

은 당신이 AS2 예를 원한다면 알려줘, 나는 그것을 게시 할 수 있습니다.

이 솔루션에 대한 참고 사항 : 브라우저로 다시 포커스를 옮기면 사용자가 플래시 플러그인을 다시 클릭하여 플래시 플러그인 내부에서 사용자 입력을 활성화해야합니다. 이는 사용자에게 불쾌감을 줄 수 있으며이 솔루션을 사용할 때 고려해야 할 사항입니다.

+0

멋진 하나! 나는 1 비트 플래쉬를 모른다. (그리고 플레이트가 가득 차 있기를 원하지 않는다 ;-), 이것은 내가 알고있는 Flash'er를 대량 메일 할 것이다. –

0
<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init();"> 
    <mx:Script> 
     <![CDATA[ 
      private function init():void { 
       i.setFocus(); 
       this.addEventListener(KeyboardEvent.KEY_UP,keyPressed); 
      } 

      private function keyPressed(event:KeyboardEvent):void { 
       if(event.keyCode.toString()=="84" && event.ctrlKey==true) 
        ExternalInterface.call('newtab'); 
      } 

     ]]> 
    </mx:Script> 
    <mx:TextInput x="23" y="268" width="256" id="i" text="Text Box"/> 
</mx:Application> 

<script type="text/javascript"> 
function newtab(e){ 
    document.body.focus(); 
    window.open('about:blank'); 
} 
</script>  

자, 다른 키보드를 어떻게됩니까? T는 84 표준인가?포커스 아이디어가 마음에 들지만 풀 브라우징 앱에서는 포커스를 잃을만큼 많은 공간이 없습니다. 사용자가 키 조합을 변경할 수도 있습니다.이 설정은 브라우저에서 명령 구성을 폴링하고 기본으로 여기에서 수행하는 것처럼 콤보를 청취하지 않고도이 기능에 대한 완전한 수정이라고 생각하지 않습니다. 나는 몰라.

이것은 포커스를 부여한 후에 새 창을 열려고 시도하기 때문에 사용자가 팝업 창과 같은 창을 차단하지 않으면 두 번 누르는 것이 의미가 없습니다. 그러나 초점이 먼저 불려지므로 두 번째 시도가 성공해야합니다. 필요한 경우 브라우저 앱에서 사용자에게 알릴 수 있습니다.

2

Firefox의 경우 document.body.focus();이 작동하지 않습니다. 이 Chrome issue에 클라우디오 실바의 솔루션과 같은 아이디어를 사용하여 다음 자바 스크립트는 파이어 폭스에서 작동합니다 경우 누군가가 그것을 필요로 아래 해결책이있다

document.body.tabIndex = 0; 
document.body.focus(); 
0

. 나를 위해, 그것은 아주 잘 작동합니다. 내 플래시를 클릭 할 수 있지만 여전히 모든 브라우저 키보드 기능을 사용합니다 (플래시 내부를 클릭하면 포커스가 html 부분으로 이동합니다).

http://forums.adobe.com/message/3431403#3431403

관련 문제