2012-09-23 74 views
1

所以我做了一個textarea中的tab鍵處理(插入一個選項卡)。在大多數情況下,它可以作爲一種魅力。textarea中的選項卡導致歌劇失去焦點

問題:歌劇:如果用戶保持按Tab鍵(標籤插入非常快),textarea元素失去焦點和處理過程不起作用。正如你在下面的例子中看到的,焦點在2個按鈕和textarea中不斷變化。

代碼:

<html> 
<head> 
<script type="text/javascript"> 
function onkd(e) { 
    var keyCode = 0; 
    if (document.selection) { 
     keyCode = e.keyCode; 
    } else { 
     keyCode = e.which; 
    } 

    if (keyCode == 9) { 
     if (e.preventDefault) { 
      e.preventDefault(); 
      e.stopPropagation(); 
     } else { 
      e.returnValue = false; 
      e.cancelBubble = true 
     } 

     var o = document.getElementById("texta"); 
     if (o.setSelectionRange) { 
      var sS = o.selectionStart; 
      var sE = o.selectionEnd; 
      o.value = o.value.substring(0, sS) + "\t" + o.value.substr(sE); 
      o.setSelectionRange(sS + 1, sS + 1); 
      o.focus(); 
     } else if (o.createTextRange) { 
      document.selection.createRange().text = "\t"; 
     } 
    } 
} 

</script> 
</head> 
<body> 
<p><button type="submit">dummy button1</button></p> 
<textarea id="texta" style="width: 400px; height: 400px; overflow: hidden; white-space: pre;" onkeydown="onkd(event);">hahaha huhuhu hohoho hihihi hehehe</textarea> 
<p><button type="submit">dummy button2</button></p> 
</body> 
</html> 

更新的jsfiddle:http://jsfiddle.net/JEzxx/2/

如果TAB鍵被按下的onkeyup事件,然後在的onblur我能趕上做:

onblur="if (bIsTabPressed) document.getElementById('texta').focus(); return false;" 

但並不能解決問題。我不明白爲什麼元素在歌劇中首先失去焦點時,連續按下Tab鍵。

問題似乎存在,因爲戲不會在keydown事件提供的preventDefault ......研究解決的辦法......

+0

我喜歡你的腳本。但是,當光標到達行尾(在添加'wrap =「off」'後)時,它會繼續在同一行中添加製表符。相反,我認爲,它應該從下一行開始。 – SachinGutte

+0

是的,我認爲它不斷添加在同一行,因爲如果你退格,它需要你花一段時間看到光標。 – MIrrorMirror

回答

1

好吧,歌劇似乎是一個錯誤的軟件和防止defaultfault只適用於按鍵事件。所以我這樣解決它:

function onkp(e) { 
    if (e.keyCode == 9 && navigator.appName == "Opera") { 
     e.preventDefault(); 
     e.stopPropagation(); 
    } 
} 

然而,不能在歌劇通過保持按下插入連續的標籤的副作用。

1
  1. 爲Chrome:文本編輯器對先前行壓縮空白,所以使用<textarea wrap="off" ...
  2. for Opera:我不知道,但你可以用相同的keyCode處理onBlur()並重新調整textarea的焦點。
+0

換掉導致各種問題,因爲它與溢出衝突:隱藏這是一個要求。我忘了添加它在第一個地方。至於歌劇..我會看看我能做些什麼... – MIrrorMirror

+0

white-space:pre;解決了鉻合金問題。 – MIrrorMirror

+0

無法捕捉onblur事件中的tab鍵。但即使有可能損壞已經完成,我不明白爲什麼歌劇改變焦點時,按Tab鍵 – MIrrorMirror