に変更があったかどうかをキャプチャし<textarea>
ます。文字の入力(削除、バックスペース)またはマウスのクリックアンドペーストまたはカットと同様です。これらすべてのイベントをトリガーできるjQueryイベントはありますか?
変更イベントを試しましたが、コンポーネントからタブアウトした後でのみコールバックがトリガーされます。
使用:に<textarea>
テキストが含まれている場合にボタンを有効にしたい。
に変更があったかどうかをキャプチャし<textarea>
ます。文字の入力(削除、バックスペース)またはマウスのクリックアンドペーストまたはカットと同様です。これらすべてのイベントをトリガーできるjQueryイベントはありますか?
変更イベントを試しましたが、コンポーネントからタブアウトした後でのみコールバックがトリガーされます。
使用:に<textarea>
テキストが含まれている場合にボタンを有効にしたい。
回答:
これを実際に試してください:
$('#textareaID').bind('input propertychange', function() {
$("#yourBtnID").hide();
if(this.value.length){
$("#yourBtnID").show();
}
});
これは、変更、入力、切り取り、貼り付けのすべての変更で機能します。
propertychange
存在しないためですinput
<input type="text">
、ではなくを使用しています<textarea>
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!");
});
on("change", function() ....
一部は私のために働いていません。アラートもコンソールログもトリガーしません。ただし、キーアップは魅力的です。
on("change", function() ...
は、textarea がフォーカスを失ったときにのみ発生します。これについては、以前の質問を参照して、このフィドルで試してみてください。textareaを変更してから、textareaの外側をクリックすると、changeイベントが発生するのがわかります。
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();
}
});
この質問には、出典とともに、より最新の回答が必要でした。これは実際に機能するものです(ただし、私の言葉を使う必要はありません)。
// 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 / CUTを押すとIE9のoninputが起動しません
3:https:// msdn .microsoft.com / en-us / library / ms536956(v = vs.85).aspx
4:http : //api.jquery.com/prop/#prop-propertyName-function
ただし、プロジェクト全体で使用できるよりグローバルなソリューションの場合は、textchange jQueryプラグインを使用して、ブラウザー間の互換性のある新しいtextchange
イベントを取得することをお勧めします。FacebookのReactJS と同等のイベントを実装したのと同じ人が開発したonChange
もので、ほぼWebサイト全体で使用されています。そして、それがFacebookにとって十分に堅牢なソリューションであれば、おそらくあなたにとっても十分堅牢であると言っても安全だと思います。:-)
更新: Internet Explorerでのドラッグアンドドロップサポートなどの機能が必要な場合は、代わりにのpandell
最近更新されたのフォークjquery-splendid-textchange
をチェックしてください。
問題はJQuery に関するもので、FYIだけです。
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';
}
});
<textarea id="textareaID"></textarea>
<button id="yourBtnID" style="display: none;">click me</div>
これは別の(最新の)バージョンですが、前述のバージョンとは少し異なります。IE9でテスト済み:
$('#textareaID').on('input change keyup', function () {
if (this.value.length) {
// textarea has content
} else {
// textarea is empty
}
});
古くなったブラウザについてはselectionchange
、propertychange
(他の回答で述べたように)andを追加することもできます。しかしselectionchange
、IE9では動作しませんでした。それが私が追加しkeyup
た理由です。
これを試して ...
$("#txtAreaID").bind("keyup", function(event, ui) {
// Write your code here
});
いくつかの実験の後、私はこの実装を思いつきました:
$('.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でのみこれを試しました。
これを試して
$('textarea').trigger('change');
$("textarea").bind('cut paste', function(e) { });
$("#textarea").on('change keyup paste', function() {})
と、自動的に$('textarea').trigger('change');
機能するのpaste
を妨げる問題に対処できる場合は、!