web-dev-qa-db-ja.com

jQueryでテキストエリアのchangeイベントにバインドするにはどうすればいいですか?

<textarea>に何らかの変更があったかどうかを把握したいです。任意の文字の入力(削除、バックスペース)やマウスクリック、貼り付け、切り取りなどができます。これらすべてのイベントに対してトリガーできるjQueryイベントはありますか?

Change eventを試しましたが、コンポーネントからタブアウトした後に限りコールバックをトリガーします。

使用する<textarea>にテキストが含まれている場合にボタンを有効にします。

205
Mojoy

実際に試してみてください。

$('#textareaID').bind('input propertychange', function() {

      $("#yourBtnID").hide();

      if(this.value.length){
        $("#yourBtnID").show();
      }
});

デモ

それはあなたが行うあらゆる変更、タイピング、カット、ペーストに有効です。

315
Blaster

bindは非推奨です。 onを使う:

$("#textarea").on('change keyup paste', function() {
    // your code here
});

注:上記のコードは、一致するトリガータイプごとに1回、複数回起動されます。それを処理するには、次のようにします。

var oldVal = "";
$("#textarea").on("change keyup paste", function() {
    var currentVal = $(this).val();
    if(currentVal == oldVal) {
        return; //check to prevent multiple simultaneous triggers
    }

    oldVal = currentVal;
    //action to be performed on textarea changed
    alert("changed!");
});

jsFiddleデモ

125
SNag

2015年にようこそ。新しい input イベントがあります。

var button = $("#buttonId");
$("#textareaID").on('input',function(e){
  if(e.target.value === ''){
    // Textarea has no value
    button.hide();
  } else {
    // Textarea has a value
    button.show();
  }
});
73
Steel Brain

この質問には、情報源とともにより最新の回答が必要でした。これは実際にが機能するものです(ただし、私のWordを使用する必要はありません)。

// Storing this jQuery object outside of the event callback 
// prevents jQuery from having to search the DOM for it again
// every time an event is fired.
var $myButton = $("#buttonID")

// input           :: for all modern browsers [1]
// selectionchange :: for IE9 [2]
// propertychange  :: for <IE9 [3]
$('#textareaID').on('input selectionchange propertychange', function() {

  // This is the correct way to enable/disabled a button in jQuery [4]
  $myButton.prop('disabled', this.value.length === 0)

}

1: https://developer.mozilla.org/en-US/docs/Web/Events/input#Browser_compatibility
2: BACKSPACE/DEL/do CUTを押してもIE9のoninputが起動しない
3: https://msdn.Microsoft.com/ja-jp/library/ms536956(v=vs.85).aspx
4: http://api.jquery.com/prop/#prop-propertyName-function

しかし、プロジェクト全体で使うことができるもっとグローバルな解決策のために、 テキスト交換jQueryプラグイン を使って、クロスブラウザ互換の新しいtextchangeイベントを得ることをお勧めします。それは 同一人物 彼らはほぼ彼らのほぼ全ウェブサイトのために使用するFacebookのReactJSのための同等のonChangeイベントを実装した/によって開発されました。そして、Facebookにとって十分に堅牢なソリューションであれば、おそらくあなたにとって十分に堅牢であると言えるでしょう。 :-)

更新:Internet Explorerでのドラッグアンドドロップのサポートのような機能が必要な場合は、代わりに pandellの最近更新されたjquery-splendid-textchange のフォークを調べてください。

23
Chris Fritz

2018、JQUERYなし

質問はJQueryです、それはちょうどFYIです。

JS

let textareaID = document.getElementById('textareaID');
let yourBtnID = document.getElementById('yourBtnID');
textareaID.addEventListener('input', function() {
    yourBtnID.style.display = 'none';
    if (textareaID.value.length) {
        yourBtnID.style.display = 'inline-block';
    }
});

HTML

<textarea id="textareaID"></textarea>
<button id="yourBtnID" style="display: none;">click me</div>
9
rap-2-h

これは別の(現代の)しかし前に述べたものとはわずかに異なるバージョンです。 IE9でテスト済み:

$('#textareaID').on('input change keyup', function () {
  if (this.value.length) {
    // textarea has content
  } else {
    // textarea is empty
  }
});

古くなったブラウザでは、selectionchangepropertychangeを追加することもできます(他の回答で述べたように)。しかし、IE9ではselectionchangeは私にとってうまくいきませんでした。それが私がkeyupを追加した理由です。

4
kevinweber

フォーカスアウトでやってみる

$("textarea").focusout(function() {
   alert('textarea focusout');
});
2
llioor

。デリゲートだけが私に働きかけている唯一のものです。jQuery JavaScript Library v2.1.1

 $(document).delegate('#textareaID','change', function() {
          console.log("change!");
    });
1
eeadev

これを試して ...

$("#txtAreaID").bind("keyup", function(event, ui) {                          

              // Write your code here       
 });
1
stay_hungry

いくつかの実験の後、私はこの実装を思いつきました:

$('.detect-change')
    .on('change cut paste', function(e) {
        console.log("Change detected.");
        contentModified = true;
    })
    .keypress(function(e) {
        if (e.which !== 0 && e.altKey == false && e.ctrlKey == false && e.metaKey == false) {
            console.log("Change detected.");
            contentModified = true;
        }
    });

矢印キーやctrl、cmd、ファンクションキーなどを無視して、任意の種類の入力や選択、テキストエリアへの変更を処理します。

注:これはFFアドオン用なので、FFで試しただけです。

0
Rooster242