我如何绑定到一个文本区域在jQuery的变化事件?

我想捕捉<textarea>是否发生了任何变化。比如输入任何字符(删除,退格)或鼠标点击粘贴或剪切。是否有一个jQuery事件可以触发所有这些事件?

我尝试了更改事件,但它只在从组件tab out后触发回调。

使用:我想启用一个按钮,如果<textarea>包含任何文本。

308763 次浏览

试试这个吧:

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


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


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

DEMO

这适用于你所做的任何更改,输入,剪切,粘贴。

试试这个

 $('textarea').trigger('change');
$("textarea").bind('cut paste', function(e) { });

试试这个…

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


// Write your code here
});

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!");
});

< >强jsFiddle演示< / >强

使用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();
}
});

.delegate是唯一一个对我工作的jQuery JavaScript库v2.1.1

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

经过一些实验,我想出了这个实现:

$('.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插件。

这个问题需要一个更新的答案。这就是实际上的工作原理(尽管你不必相信我的话):

// 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/en-us/library/ms536956 (v = vs.85) . aspx
4: http://api.jquery.com/prop/#prop-propertyName-function < / p >

但是,您可以在整个项目中使用更全面的解决方案,我建议使用jQuery的textchange插件来获得一个新的、跨浏览器兼容的textchange事件。它是由同一个人开发的,他们为Facebook的ReactJS实现了等效的onChange事件,他们几乎在整个网站上使用。我认为可以肯定地说,如果它对Facebook来说是一个足够强大的解决方案,它可能对你来说也足够强大。: -)

更新:如果你碰巧需要Internet Explorer中的拖放支持等特性,你可能会想要查看__ABC0最近更新的jquery-splendid-textchange的分支

试着集中精力做这件事

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

这是另一个(现代的)版本,但与之前提到的略有不同。经IE9测试:

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

对于过时的浏览器,你也可以添加selectionchangepropertychange(在其他答案中提到过)。但是selectionchange在IE9中不能为我工作。这就是为什么我添加了keyup

2018,没有JQUERY

问题是 JQuery,这只是供参考。

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';
}
});

超文本标记语言

<textarea id="textareaID"></textarea>
<button id="yourBtnID" style="display: none;">click me</div>