我想捕获<textarea>
是否发生任何变化。就像键入任何字符(删除,退格)或鼠标单击并粘贴或剪切一样。是否有可以触发所有这些事件的jQuery事件?
我尝试了更改事件,但只有在从组件中跳出后才会触发回调。
使用:如果<textarea>
包含任何文字,我想启用按钮。
答案 0 :(得分:315)
实际尝试:
$('#textareaID').bind('input propertychange', function() {
$("#yourBtnID").hide();
if(this.value.length){
$("#yourBtnID").show();
}
});
适用于您所做的任何更改,打字,剪切,粘贴。
答案 1 :(得分:125)
bind
已弃用。使用on
:
$("#textarea").on('change keyup paste', function() {
// your code here
});
注意:上面的代码会多次触发,每个匹配的触发器类型一次。要处理这个问题,请执行以下操作:
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!");
});
答案 2 :(得分:73)
欢迎来到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();
}
});
答案 3 :(得分:23)
这个问题需要一个更新的答案,有消息来源。这就是实际上的作用(尽管你不必为此承担责任):
// 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:oninput in IE9 doesn't fire when we hit BACKSPACE / DEL / do CUT
3:https://msdn.microsoft.com/en-us/library/ms536956(v=vs.85).aspx
4:http://api.jquery.com/prop/#prop-propertyName-function
但是,对于可在整个项目中使用的更全面的解决方案,我建议您使用the textchange jQuery plugin获取新的跨浏览器兼容的textchange
事件。它是由the same person开发的,他为Facebook的ReactJS实施了相同的onChange
事件,他们几乎用于整个网站。而且我认为可以肯定地说,如果它对Facebook来说是一个足够强大的解决方案,它可能足够强大。 : - )
更新:如果您在Internet Explorer中碰巧需要拖放支持等功能,则可能需要查看pandell
's more recently updated fork of jquery-splendid-textchange
。
答案 4 :(得分:9)
问题是 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>
答案 5 :(得分:4)
这是另一个(现代)但与前面提到的版本略有不同的版本。用IE9测试:
$('#textareaID').on('input change keyup', function () {
if (this.value.length) {
// textarea has content
} else {
// textarea is empty
}
});
对于过时的浏览器,您还可以添加selectionchange
和propertychange
(如其他答案中所述)。但是selectionchange
在IE9中对我不起作用。这就是我添加keyup
。
答案 6 :(得分:2)
尝试使用focusout
$("textarea").focusout(function() {
alert('textarea focusout');
});
答案 7 :(得分:1)
试试这个......
$("#txtAreaID").bind("keyup", function(event, ui) {
// Write your code here
});
答案 8 :(得分:1)
.delegate 是唯一一个使用 jQuery JavaScript Library v2.1.1
工作的人 $(document).delegate('#textareaID','change', function() {
console.log("change!");
});
答案 9 :(得分:0)
经过一些实验,我想出了这个实现:
$('.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;
}
});
处理对任何类型输入的更改,并选择textareas忽略箭头键和ctrl,cmd,功能键等内容。
注意:我只在FF中试过这个,因为它是FF附加组件。
答案 10 :(得分:-11)
试试这个
$('textarea').trigger('change');
$("textarea").bind('cut paste', function(e) { });