我想捕获是否发生任何更改 <textarea>
。就像键入任何字符(删除,退格键)或鼠标单击并粘贴或剪切一样。是否有可以触发所有这些事件的jQuery事件?
我尝试了更改事件,但仅在从组件中跳出后才触发回调。
使用:如果一个<textarea>
包含任何文本,我想启用一个按钮。
我想捕获是否发生任何更改 <textarea>
。就像键入任何字符(删除,退格键)或鼠标单击并粘贴或剪切一样。是否有可以触发所有这些事件的jQuery事件?
我尝试了更改事件,但仅在从组件中跳出后才触发回调。
使用:如果一个<textarea>
包含任何文本,我想启用一个按钮。
Answers:
实际尝试一下:
$('#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
});
注意:上面的代码将触发多次,每种匹配的触发器类型触发一次。要处理此问题,请执行以下操作:
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() ....
部分对我不起作用。不会触发任何警报,也不会触发控制台日志。但是,对于keyup来说,它就像一个魅力。
on("change", function() ...
是当textarea的失去焦点,仅启动。请参考我先前的问题,并在此小提琴上进行尝试-更改文本区域,然后在文本区域之外单击,您将看到更改事件触发。
使用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/zh-CN/docs/Web/Events/input#Browser_compatibility
2:当我们按下BACKSPACE / DEL / CUT时,IE9中的oninput不会触发
3:https:// msdn .microsoft.com / zh-CN / library / ms536956(v = vs.85).aspx
4:http://api.jquery.com/prop/#prop-propertyName-function
但是,对于可以在整个项目中使用的更全局的解决方案,我建议使用textchange jQuery插件来获得一个新的,跨浏览器兼容的textchange
事件。它是由为Facebook的ReactJS 实现等效事件的同一人开发onChange
的,他们几乎将其用于整个网站。我认为可以肯定地说,如果它对Facebook来说足够健壮,那么对您来说可能足够健壮。:-)
更新:如果您碰巧需要Internet Explorer中的拖放支持等功能,则可能需要查看pandell
的最近更新的jquery-splendid-textchange
。
现在的问题是与 JQuery的,它只是供参考。
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>
试试这个 ...
$("#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
自动工作!