2010-12-09 22 views
3

我試圖阻止任何鍵在Flex TextArea中更改文本。我不想將可編輯屬性設置爲false,因爲我希望插入符號對於「當前位置」指示符可見,以便用戶知道他啓動的搜索將從哪裏開始。Flex 3:在TextArea中禁用退格和刪除

我已經爲change和textInput添加了事件處理程序,還添加了執行'event.preventDefault'以及'event.stopImmediatePropagation'的keyUp和keyDown。這對絕大多數密鑰都適用,除了退格和刪除之外。

有沒有辦法阻止這些做任何事情?

+0

在您的preventDefault和stopPropagation您使用捕獲階段的事件偵聽器中? – 2010-12-09 20:06:05

回答

1

嗯,好像真的在瀏覽器不能正常工作,怎麼樣一個解決辦法,不知道你會喜歡它,但似乎是實現你所需要的除了粘貼:

<?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> 
1

爲什麼不只是重新插入文本的變化?

+0

嗯 - 有趣的想法,但當改變事件被觸發時,文本字段已經改變,意味着我不得不保留第二個文本副本。我會處理一些相當大的字符串,所以不希望這樣做。另外,在這個階段,選擇開始和結束索引是相等的,所以如果用戶選擇了一段文本,似乎沒有辦法確定他實際上改變了什麼?或者你能從事件中得到什麼? – Nic 2010-12-09 11:44:22

+0

@Mike如果將文本字段綁定到包含文本的變量,則不必保留文本的第二個副本。然後改變文字,改變變量。並在文本字段的關鍵偵聽器中重置爲var的值。我沒有測試過,但聽起來很正確。 – 2010-12-09 20:11:23

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 2010-12-09 12:21:41

0

我想我已經想出了一個辦法: 在Flash中的preventDefault不關鍵事件工作,但他們的工作以及對 改變事件。你可以做一些類似於https://stackoverflow.com/a/8078910/1927950的事情,以避免任何修改,但仍然保留插入符號。