2012-07-30 13 views
7

私はいくつかの自動補完コードを扱っています。 setSelectionRange()は、oninputイベントハンドラで完了したテキストを選択するために使用されます。少なくともFirefox 14では動作しますが、Chromeでは動作しません(6,17)。私はクロームでコードをデバッグし、そしてそれがsetSelectionRange()が実行された後のテキストが最初の右で選択されていることが判明しクロムsetSelectionRange()は、入力ハンドラでは機能しません

<input type='text' oninput='select()' /> 
function select(e){ 
    var s = this.value; 
    if (s.length) 
     this.setSelectionRange(s.length-1, s.length); 
} 

:問題を実証

簡素化されたコードスニペットは、このようなものですしかし、その選択は後で消えた。

私はこのように、onclick代わりのoninputにハンドラをバインドする場合:

<input type='text' onclick='select()' /> 

、両方のブラウザでは正常に動作。

誰でもChromeで選択作業を行うためのヒントを教えてください。

+0

それはあなたが ')setSelectionRange(への呼び出しの前に)(' this.focusを呼び出すために必要なことだったかもしれません。ここの例を参照してください。https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange#Example –

答えて

11

select()関数に渡されたパラメータが間違っている、すなわちことを、あなたのコードに問題がありますthiswindowなり、eは不定となります。また、oninput属性内の関数名としてselect()を使用すると、selectは入力自体のselect()メソッドに解決されるため、問題が発生します。より良いアプローチは、通常、イベントハンドラ属性を使用するのではなく、スクリプトでイベントハンドラを設定することです。

ただし、これらの問題を修正しても問題はあります。ブラウザーがChromeでキャレットを移動する前に、おそらくinputイベントが発生します。簡単な回避策は、タイマーを使用することですが、タイマーが起動する前に別のキャラクターを入力できる可能性があるため、これは最適ではありません。

デモ:http://jsfiddle.net/XXx5r/2/

コード:

<input type="text" oninput="selectText(this)"> 

<script type="text/javascript"> 
function selectText(input) { 
    var s = input.value; 
    if (s.length) { 
     window.setTimeout(function() { 
      input.setSelectionRange(s.length-1, s.length); 
     }, 0); 
    } 
} 
</script> 
+0

これは機能します。私はほとんどの検索エンジンの検索提案がドロップリスト内の候補を表示するだけで、ユーザーの入力を完了して完了を選択することは決してないのだろうか。たぶんそれは私の問題と関係があります。 – bigbug

+2

これは、Chromeで正しく動作しない(タイムアウトを設定しない)理由は、Chromiumのバグが3年以上続いているためです:http://code.google.com/p/chromium/issues/detail ?id = 32865 – jrajav

+0

を1年以上にわたって読んだことがあります。そのような単純な修正は...しかし、イライラする。 –

関連する問題