2010-12-09 5 views
3

Flex TextArea에서 텍스트가 변경되는 것을 방지하려고합니다. 편집 가능한 속성을 false로 설정하고 싶지 않습니다. 왜냐하면 사용자가 '검색 시작 위치'를 알 수 있도록 '현재 위치'표시기에 캐럿을 표시해야하기 때문입니다.Flex 3 : TextArea에서 백 스페이스 비활성화 및 삭제

변경 및 textInput에 대한 이벤트 처리기뿐만 아니라 'event.preventDefault'및 'event.stopImmediatePropagation'을 수행하는 keyUp 및 keyDown을 추가했습니다. 백 스페이스 및 삭제를 제외하고 대부분의 키는 정상적으로 작동합니다.

아무 것도하지 못하게 할 방법이 있습니까?

+0

preventDefault 및 stopPropagation을 제거한 이벤트 리스너에서 캡처 단계를 사용하고 있습니까? –

답변

1

을 음은, 정말 브라우저에서 작동하지 않는 것처럼, 어떻게 해결 방법에 대해 확실하지 당신이 그것을 좋아할 경우 보이지만 당신이 필요로하는 무엇을 달성 할 것으로 보인다 따로 붙여 넣기에서 : 플래시에로 preventDefault 키 이벤트 작동하지 않습니다,하지만 그들은 변경 이벤트 잘 작동 :

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> 
    <mx:Script> 
     <![CDATA[ 
      import mx.controls.Alert; 

      private var _lastSelStart:Number = 0; 
      private var _lastSelEnd:Number = 0; 
      private var _lastText:String = null; 
      private var _prevent:Boolean = false; 

     private function onKeyDown(event:KeyboardEvent):void { 
      if (event.keyCode == 8 || event.keyCode == 46) { 
       if (!_prevent) { 
        _prevent = true; 
        _lastText = txt.text; 
        _lastSelStart = txt.selectionBeginIndex; 
        _lastSelEnd = txt.selectionEndIndex; 
       } 
      } 
     } 

     private function onKeyUp(event:KeyboardEvent):void { 
      if (_prevent) { 
       _prevent = false; 
       txt.text = _lastText; 
       _lastText = null; 
       callLater(txt.setSelection, [_lastSelStart, _lastSelEnd]); 
      } 
     } 

     ]]> 
    </mx:Script> 
    <mx:TextArea keyDown="onKeyDown(event);" keyUp="onKeyUp(event);" width="100%" height="100%" 
     id="txt" /> 
</mx:Application> 
+0

대단히 감사합니다. 많은 도움을 주셨습니다. 누르고있는 열쇠에 대처하기 위해 어떤 논리가 필요할 것이라고 생각합니다. 그러나 이것은 좋게 보입니다. 문자열의 사본을 만들어야하는 것에 대해 수치 스럽다. – Nic

+0

키를 누른 채로 처리하도록 코드를 수정했습니다. 또한, 도움이된다면 대답으로 표시 할 수 있습니까? – radekg

1

변경시 텍스트를 다시 삽입하지 않는 이유는 무엇입니까?

+0

흠 - 재미있는 아이디어입니다.하지만 변경 이벤트가 시작될 때까지 이미 텍스트 필드가 변경되어 텍스트의 두 번째 복사본을 유지해야합니다. 나는 꽤 큰 문자열을 다루므로 이렇게하지 않는 것이 좋습니다. 또한 선택 시작 및 종료 인덱스는이 단계에서 모두 동일하므로 사용자가 텍스트 블록을 선택한 경우 실제로 변경된 내용을 해결할 방법이없는 것 같습니까? 아니면 어딘가에서 이벤트를 얻을 수 있습니까? – Nic

+0

@Mike 텍스트 필드를 텍스트를 포함하는 변수에 바인딩하는 경우 텍스트의 두 번째 사본을 보관하지 않아도됩니다. 그런 다음 텍스트를 변경하려면 변수를 변경하십시오. 텍스트 필드의 키 수신기에서 var 값으로 재설정됩니다. 나는 이것을 시험하지는 않았지만 내 머리 속에서 소리가납니다. –

2

이 도움이 될 수

<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> 
    <mx:Script> 
     <![CDATA[ 
      private function onKeyDown(event:KeyboardEvent):void { 
       if (event.keyCode == 8 || event.keyCode == 46) { 
        event.preventDefault(); 
       } 
      } 
    ]]> 
    </mx:Script> 
    <mx:TextArea keyDown="onKeyDown(event);" width="100%" height="100%" /> 
</mx:WindowedApplication> 
+0

불행히도 그것은하지 않습니다! 나는 이것과 비슷한 것을 시도해 보았고, 이벤트 핸들러가 호출되었지만, 텍스트는 여전히 지워졌고, 나는 왜 그런지 모르겠다. ...... – Nic

+0

나는 이것을 테스트하고 완벽하게 작동한다. –

+0

그래, 데스크톱 응용 프로그램으로 작동하고 작동하지만 웹 응용 프로그램이 작동하지 않습니다. –

관련 문제