onKeyPress中に入力テキストボックスのテキストを取得するにはどうすればよいですか?


85

ユーザーが入力したテキストボックス(jsfiddle playground)でテキストを取得しようとしています。

function edValueKeyPress() {
    var edValue = document.getElementById("edValue");
    var s = edValue.value;

    var lblValue = document.getElementById("lblValue");
    lblValue.innerText = "The text box contains: " + s;

    //var s = $("#edValue").val();
    //$("#lblValue").text(s);    
}
<input id="edValue" type="text" onKeyPress="edValueKeyPress()"><br>
<span id="lblValue">The text box contains: </span>

ボックスの値が常に変更であることを除いて、コードはエラーなしで実行されinput textます。onKeyPress

ここに画像の説明を入力してください

質問:テキストボックスのテキストを取得するにはどうすればよいonKeyPressですか?

ボーナスチャター

HTMLDOMには「ユーザーが入力しています」に関連する3つのイベントがあります。

  • onKeyDown
  • onKeyPress
  • onKeyUp

Windowsの順序WM_Keyユーザーがキーを押したまま、キーリピートを開始したときにメッセージが重要になります:

  • WM_KEYDOWN('a')-ユーザーがAキーを押し下げました
  • WM_CHAR('a')-aユーザーからキャラクターを受け取りました
  • WM_CHAR('a')-aユーザーからキャラクターを受け取りました
  • WM_CHAR('a')-aユーザーからキャラクターを受け取りました
  • WM_CHAR('a')-aユーザーからキャラクターを受け取りました
  • WM_CHAR('a')-aユーザーからキャラクターを受け取りました
  • WM_KEYUP('a')-ユーザーがAキーを離しました

テキストコントロールに5文字が表示されます。 aaaaa

重要な点は、あなたがWM_CHARメッセージに応答すること、それが繰り返されることです。そうしないと、キーが押されたときにイベントを見逃します。

ではHTMLのものが若干異なります。

  • onKeyDown
  • onKeyPress
  • onKeyDown
  • onKeyPress
  • onKeyDown
  • onKeyPress
  • onKeyDown
  • onKeyPress
  • onKeyDown
  • onKeyPress
  • onKeyUp

HTMLは提供KeyDownし、KeyPressすべてのキーリピートを。また、KeyUpイベントは、ユーザーがキーを離したときにのみ発生します。

テイクアウト

  • 私がすることができますへの対応onKeyDownonKeyPress、しかし前に両方のはまだ提起されているinput.value更新されました
  • onKeyUpテキストボックス内のテキストが変更されても応答しないため、応答できません。

質問:テキストボックスのテキストを取得するにはどうすればよいonKeyPressですか?

ボーナスリーディング


1
値を返す前に、現在のキー押下を値に追加する必要があると思います。値はkeyUpで更新されますが、データはkeyDownで利用できます。
Mathletics 2012

キーアップは私にとってはうまくいきます。膨張を追加したいのでなければ、このようなものにはjQは必要ありません
Ryan B

あなたのタスクにはonKeyUpだけで十分です
dmytro 2014年

@mit Only処理でonKeyUpは、変更が発生したときにテキストボックスに変更が表示されません。
イアン・ボイド

キーを押したままテキストボックスで結果を取得する場合は、onKeyPressイベントとonKeyDownイベントの両方を使用する必要があります。JonathanMのフィドルですが、キーを押さずに結果を取得する場合は onKeyUp myfiddleで十分です。
dmytro 2014年

回答:


19

inputイベントの処理は一貫したソリューションです。これは、すべての最新のブラウザーでサポートさtextareaているinput要素であり、必要なときに正確に起動します。

function edValueKeyPress() {
    var edValue = document.getElementById("edValue");
    var s = edValue.value;

    var lblValue = document.getElementById("lblValue");
    lblValue.innerText = "The text box contains: " + s;
}
<input id="edValue" type="text" onInput="edValueKeyPress()"><br>
<span id="lblValue">The text box contains: </span>

ただし、これを少し書き直します。

function showCurrentValue(event)
{
    const value = event.target.value;
    document.getElementById("lblValue").innerText = value;
}
<input id="edValue" type="text" onInput="showCurrentValue(event)"><br>
The text box contains: <span id="lblValue"></span>


54

複雑にしないでおく。onKeyPress()onKeyUp():の両方を使用します

<input id="edValue" type="text" onKeyPress="edValueKeyPress()" onKeyUp="edValueKeyPress()">

これにより、(キーを押した後)最新の文字列値を取得し、ユーザーがキーを押したままにすると更新されます。

jsfiddle:http://jsfiddle.net/VDd6C/8/


arnaud576875の答えはあきらめてonKeyUp(使用する目的を破ってonKeypress)フォールバックしなければならなかったので、これは誰もが見ることになる最も単純で、最もクリーンで、最も近い答えです。最も注意深く観察しているユーザーだけが、フィードバックが入力した内容と一致しないことに気付くでしょう。
イアン・ボイド

@イアン、助けてくれてうれしい。「フィードバックが入力内容と一致しない」とはどういう意味ですか?調整が必要ですか?
ジョナサンM

私は今私が意味したことを覚えています!私が言及しているフィードバックは、<input>要素を赤または緑に色付けするか、ユーザーが入力した内容が良いか悪いかをユーザーにフィードバックすることです。あなたの受け入れ答えはまだ、常にあることの問題に苦しんでいる一方で、「オフにより-1」:文字のみ最も注意深いユーザーがフィードバックに気づくでしょうが、彼らが入力したものと一致しません「。オフ・バイいるので、実際には1 -エラーのみ(私以外の)キーリピート(彼らはキーダウンを保持しているIE)誰も中に発生が問題に気づくために起こっている。
イアン・ボイド

19

onKeyPress中の入力テキストボックスの値は、常に変更前の値です。

これは意図的なものです。これにより、イベントリスナーはキーの押下をキャンセルできます。

イベントリスナーがイベントをキャンセルした場合、値は更新されません。イベントがキャンセルされない場合、値は更新されますが、イベントリスナーが呼び出されです。

フィールド値が更新された後に値を取得するには、次のイベントループで実行する関数をスケジュールします。これを行う通常の方法はsetTimeout、タイムアウトを指定して呼び出すことです0

$('#field').keyup(function() {
    var $field = $(this);

    // this is the value before the keypress
    var beforeVal = $field.val();

    setTimeout(function() {

        // this is the value after the keypress
        var afterVal = $field.val();
    }, 0);
});

ここで試してください:http//jsfiddle.net/Q57gY/2/

編集:一部のブラウザ(Chromeなど)は、バックスペースのキー押下イベントをトリガーしません。コードでkeypressをkeyupに変更しました。


これを投稿しようとしていました。これが私がしたjsFiddleです。
kapa 2012

そうです、Chromeはバックスペースのキー押下イベントをトリガーしないようです。更新
Arnaud Le Blanc

@ Ian、OPは、キーが押されたときに更新することを望んでいますか?これが要件であるかどうかはあまりわかりませんでした。ただし、このソリューションにはその機能はありません。
ジョナサンM

明確にするために:バックスペースのキー押下イベントをトリガーしないことは標準に従っています:「文字値を生成するキー」-他のキーの場合は「キーダウン」(変更前、キャンセル可能)または「キーアップ」(変更後)を使用します
sebilasse

5

コンパクトに保ちます。
キーを押すたびに、関数edValueKeyPress()が呼び出されます。
また、その関数でいくつかの変数を宣言して初期化しました。これにより、プロセスが遅くなり、CPUとメモリも多く必要になります。
単純な置換から派生したこのコードを簡単に使用できます。

function edValueKeyPress()
{
    document.getElementById("lblValue").innerText =""+document.getElementById("edValue").value;
}

それがあなたが望むすべてであり、それはより速いです!


3
<asp:TextBox ID="txtMobile" runat="server" CssClass="form-control" style="width:92%;  margin:0px 5px 0px 5px;" onkeypress="javascript:return isNumberKey(event);" MaxLength="12"></asp:TextBox>

<script>
    function isNumberKey(evt) {
        var charCode = (evt.which) ? evt.which : event.keyCode;
        if (charCode > 31 && (charCode < 48 || charCode > 57)) {
            return false;
        }
        return true;
    }
</script>

3

これまでのところ、完全な解決策を提供する答えはありません。対処すべき問題がかなりあります。

  1. 全てのキー入力が上に渡されているわけではないkeydownkeypress(たとえば、バックスペースと削除キーは、一部のブラウザによって抑制されている)ハンドラ。
  2. 取り扱いkeydownは良い考えではありません。キーを押してもキーが押されない場合があります。
  3. setTimeout() スタイルソリューションは、ユーザーが入力を停止するまで、Google Chrome / BlinkWebブラウザーで遅延します。
  4. マウスとタッチのイベントを使用して、切り取り、コピー、貼り付けなどのアクションを実行できます。これらのイベントはキーボードイベントをトリガーしません。
  5. ブラウザは、入力方法によっては、ユーザーがフィールドから離れるまで要素が変更されたという通知を配信しない場合があります。

より正確なソリューションを処理しますkeypresskeyupinput、およびchangeイベントを。

例:

<p><input id="editvalue" type="text"></p>
<p>The text box contains: <span id="labelvalue"></span></p>

<script>
function UpdateDisplay()
{
    var inputelem = document.getElementById("editvalue");
    var s = inputelem.value;

    var labelelem = document.getElementById("labelvalue");
    labelelem.innerText = s;
}

// Initial update.
UpdateDisplay();

// Register event handlers.
var inputelem = document.getElementById("editvalue");
inputelem.addEventListener('keypress', UpdateDisplay);
inputelem.addEventListener('keyup', UpdateDisplay);
inputelem.addEventListener('input', UpdateDisplay);
inputelem.addEventListener('change', UpdateDisplay);
</script>

フィドル:

http://jsfiddle.net/VDd6C/2175/

4つのイベントすべてを処理すると、すべてのエッジケースがキャッチされます。ユーザーからの入力を処理するときは、すべてのタイプの入力方法を検討し、クロスブラウザーおよびクロスデバイスの機能を検証する必要があります。上記のコードは、デスクトップ上のFirefox、Edge、Chrome、および私が所有するモバイルデバイスでテストされています。


なぜinputイベントだけではないのですか?
YakovL

input常に発火するとは限りません。すべての状況をカバーする単一のイベントはありません。
CubicleSoft

あなたは「常にない」記述場合はあなたが指定したように、より詳細にあなたのいいだろうkeypress答えに
YakovL

1

私は通常、フィールドの値を(つまり、更新される前に)キーイベントに関連付けられたキーと連結します。以下は最近のJSを使用しているため、古いIEでのサポートを調整する必要があります。

最近のJSの例

document.querySelector('#test').addEventListener('keypress', function(evt) {
    var real_val = this.value + String.fromCharCode(evt.which);
    if (evt.which == 8) real_val = real_val.substr(0, real_val.length - 2);
    alert(real_val);
}, false);

古いIEの例のサポート

//get field
var field = document.getElementById('test');

//bind, somehow
if (window.addEventListener)
    field.addEventListener('keypress', keypress_cb, false);
else
    field.attachEvent('onkeypress', keypress_cb);

//callback
function keypress_cb(evt) {
    evt = evt || window.event;
    var code = evt.which || evt.keyCode,
        real_val = this.value + String.fromCharCode(code);
    if (code == 8) real_val = real_val.substr(0, real_val.length - 2);
}

[編集-このアプローチは、デフォルトで、バックスペース、CTRL + Aなどのキー押下を無効にします。上記のコードは前者に対応していますが、後者とその他のいくつかの不測の事態に対応するために、さらに調整する必要があります。以下のイアン・ボイドのコメントを参照してください。]


1
@bažmegakapaまたはdeleteキーを使用するか、ユーザーがコンテンツを変更しないキーを押したCtrl+A場合()、またはユーザーがテキストを選択してから押しaてサブセットを置き換える場合。Utkanosさん、それは素晴らしいアイデアですが、壊れやすいものです。
イアンボイド2012

1
同意しました。マイレージが含まれているのでそのままにしておきますが、あなたが言うように、これらの警告に対する手当を組み込む必要があります。
Mitya 2012

1

簡単...

keyPressイベントハンドラーに次のように記述します

void ValidateKeyPressHandler(object sender, KeyPressEventArgs e)
{
    var tb = sender as TextBox;
    var startPos = tb.SelectionStart;
    var selLen= tb.SelectionLength;

    var afterEditValue = tb.Text.Remove(startPos, selLen)
                .Insert(startPos, e.KeyChar.ToString()); 
    //  ... more here
}

キーがキーである場合e.KeyCharはどうなりBackspaceますか?またはDelete鍵?またはCtrl+A
イアンボイド2013年

これもJavaScriptですか?voidobject?最初の大文字の方法?
YakovL

1

したがって、各イベントには長所と短所があります。イベントonkeypressonkeydown最新の値を取得していない、とないonkeypress一部のブラウザでは印刷不可能な文字のため発生しません。onkeyupキーが複数の文字のために押していると、イベントが検出されません。

これは少しハッキーですが、次のようなことをします

function edValueKeyDown(input) {
    var s = input.value;

    var lblValue = document.getElementById("lblValue");
    lblValue.innerText = "The text box contains: "+s;

    //var s = $("#edValue").val();
    //$("#lblValue").text(s);    
}
<input id="edValue" type="text" onkeydown="setTimeout(edValueKeyDown, 0, this)" />

すべての世界で最高のものを処理しているようです。


1

event.keyを使用することにより、HTML入力テキストボックスに入力する前に値を取得できます。これがコードです。

function checkText()
{
  console.log("Value Entered which was prevented was - " + event.key);
  
  //Following will prevent displaying value on textbox
  //You need to use your validation functions here and return value true or false.
  return false;
}
<input type="text" placeholder="Enter Value" onkeypress="return checkText()" />


これ、キーを押さないもの(切り取り、貼り付け、選択したものの削除など)によってテキストが変更されると、崩壊します
Ian Boyd 2017年

@IanBoydはい同意しました。例を単純にするために、キー押下検証のみを実装しました。
vibs2006 2017年

0

イベントcharCodeを取得した値に連結してみてください。これが私のコードのサンプルです:

<input type="text" name="price" onkeypress="return (cnum(event,this))" maxlength="10">
<p id="demo"></p>

js:

function cnum(event, str) {
    var a = event.charCode;
    var ab = str.value + String.fromCharCode(a);
    document.getElementById('demo').innerHTML = ab;
}

の値はab、入力フィールドの最新の値を取得します。


申し訳ありませんが、これを投稿した後、このページでさらに優れたアプローチの別の投稿に気づきました。投稿する前にそれを見ませんでした。しかし、私はその概念を理解する方が簡単だと思います。
ラマクリシュナ

キーがdeletebackspaceCtrl + X、またはCtrl + Vの場合、またはマウスですべてのテキストを選択してSpaceを
Ian Boyd

アイデアを書いただけです。キーコードやその他の方法を使用して、要件に応じて実装できます。これは私の考えです。
Rama Krishna

1
アイデアは答えではありません。SOに関する回答は、誰もが利益を得ることができるように、OPの質問に明確に回答する簡潔なソリューションである必要があります。これは明らかにその基準を満たしていません。
CubicleSoft 2017

0

これを行うためのより良い方法があります。concatメソッドを使用します。例

グローバル変数を宣言します。これはAngular10でうまく機能し、VanillaJavaScriptに渡すだけです。例:

HTML

<input id="edValue" type="text" onKeyPress="edValueKeyPress($event)"><br>
<span id="lblValue">The text box contains: </span>

コード

emptyString = ''

edValueKeyPress ($event){
   this.emptyString = this.emptyString.concat($event.key);
   console.log(this.emptyString);
}

そして、キーがあるときDeleteCtrl+ XCtrl+ VBackspace?または、テキストを選択してから、A?を押します。
イアンボイド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.