如何使用javascript检测textarea上的更改事件?
我正在尝试检测您输入的剩余字符数。
我尝试使用onchange事件,但这似乎只在焦点出现时启动。
答案 0 :(得分:108)
2012年,后PC时代就在这里,我们仍然需要与基本的东西斗争。这应该是非常简单。
在梦想实现之前,这是最好的方法,跨浏览器:使用input
和onpropertychange
事件的组合,如这样:
var area = container.querySelector('textarea');
if (area.addEventListener) {
area.addEventListener('input', function() {
// event handling code for sane browsers
}, false);
} else if (area.attachEvent) {
area.attachEvent('onpropertychange', function() {
// IE-specific event handling code
});
}
input
事件负责IE9+, FF, Chrome, Opera and Safari,onpropertychange
处理IE8(它也适用于IE6和7,但有一些错误)。强>
使用input
和onpropertychange
的好处是它们不会不必要地触发(例如按下Ctrl
或Shift
键时);所以如果您希望在textarea内容发生变化时运行相对昂贵的操作,这就是了解的方法。
现在,IE一如既往地做了一个支持这个工作的半工作:当字符从input
和onpropertychange
都不会触发。因此,如果您需要处理IE中的字符删除,请使用keypress
(而不是使用keyup
/ keydown
,因为即使用户按下并按住某个键,它们也只会触发一次)。
来源:http://www.alistapart.com/articles/expanding-text-areas-made-elegant/
编辑:似乎上述解决方案并不完美,正如评论中正确指出的那样:textarea上addEventListener
属性的存在不暗示你正在使用一个理智的浏览器;类似地,attachEvent
属性的存在不暗示IE。如果您希望您的代码真的不透气,那么您应该考虑改变它。有关指示,请参阅Tim Down's comment。
答案 1 :(得分:93)
为此,您需要使用onkeyup
和 onchange
。 onchange将阻止上下文菜单粘贴,并且每次按键都会触发onkeyup。
有关代码示例,请参阅我在How to impose maxlength on textArea上的回答。
答案 2 :(得分:19)
未在Firefox上测试过。
var isIE = /*@cc_on!@*/false; // Note: This line breaks closure compiler...
function SuperDuperFunction() {
// DoSomething
}
function SuperDuperFunctionBecauseMicrosoftMakesIEsuckIntentionally() {
if(isIE) // For Chrome, oninput works as expected
SuperDuperFunction();
}
<textarea id="taSource"
class="taSplitted"
rows="4"
cols="50"
oninput="SuperDuperFunction();"
onpropertychange="SuperDuperFunctionBecauseMicrosoftMakesIEsuckIntentionally();"
onmousemove="SuperDuperFunctionBecauseMicrosoftMakesIEsuckIntentionally();"
onkeyup="SuperDuperFunctionBecauseMicrosoftMakesIEsuckIntentionally();">
Test
</textarea>
答案 3 :(得分:9)
我知道这不是你的问题,但我认为这可能有用。 对于某些应用程序,每次按下一个键时都不会触发更改功能。这可以通过以下方式实现:
var text = document.createElement('textarea');
text.rows = 10;
text.cols = 40;
document.body.appendChild(text);
text.onkeyup = function(){
var callcount = 0;
var action = function(){
alert('changed');
}
var delayAction = function(action, time){
var expectcallcount = callcount;
var delay = function(){
if(callcount == expectcallcount){
action();
}
}
setTimeout(delay, time);
}
return function(eventtrigger){
++callcount;
delayAction(action, 1200);
}
}();
这可以通过测试更近期的事件是否在某个延迟期内被解雇来发挥作用。祝你好运!
答案 4 :(得分:7)
我知道这个问题是针对JavaScript的,但是,当textarea在所有当前浏览器中发生变化时,总是没有好的,干净的方法来检测。我知道jquery已经为我们照顾了它。它甚至可以处理文本区域的上下文菜单更改。无论输入类型如何,都使用相同的语法。
$('div.lawyerList').on('change','textarea',function(){
// Change occurred so count chars...
});
或
$('textarea').on('change',function(){
// Change occurred so count chars...
});
答案 5 :(得分:3)
您可以在更改textarea时收听活动,并根据需要进行更改。这是一个例子。
(() => {
const textArea = document.getElementById('my_text_area');
textArea.addEventListener('input', () => {
let textLn = textArea.value.length;
if(textLn >= 100) {
textArea.style.fontSize = '10pt';
}
})
})()
<html>
<textarea id='my_text_area' rows="4" cols="50" style="font-size:40pt">
This text will change font after 100.
</textarea>
</html>
答案 6 :(得分:1)
Keyup应该足够了。因此,创建一个模式(正则表达式)来验证输入并对.checkValidity()状态进行操作。像下面这样的东西可以工作。在你的情况下,你会希望正则表达式匹配长度。我的解决方案正在使用/可在线演示here。
<input type="text" pattern="[a-zA-Z]+" id="my-input">
var myInput = document.getElementById = "my-input";
myInput.addEventListener("keyup", function(){
if(!this.checkValidity() || !this.value){
submitButton.disabled = true;
} else {
submitButton.disabled = false;
}
});
答案 7 :(得分:0)
代码我用于没有jquery的IE 11,只用于单个textarea:
使用Javascript:
// Impede que o comentário tenha mais de num_max caracteres
var internalChange= 0; // important, prevent reenter
function limit_char(max)
{
if (internalChange == 1)
{
internalChange= 0;
return;
}
internalChange= 1;
// <form> and <textarea> are the ID's of your form and textarea objects
<form>.<textarea>.value= <form>.<textarea>.value.substring(0,max);
}
和html:
<TEXTAREA onpropertychange='limit_char(5)' ...
答案 8 :(得分:0)
试试这个。它很简单,因为它是2016年,我相信它适用于大多数浏览器。
<textarea id="text" cols="50" rows="5" onkeyup="check()" maxlength="15"></textarea>
<div><span id="spn"></span> characters left</div>
function check(){
var string = document.getElementById("url").value
var left = 15 - string.length;
document.getElementById("spn").innerHTML = left;
}
答案 9 :(得分:-7)
您可以做的最好的事情是设置一个在给定时间内调用的函数,并使用此函数检查textarea的内容。
self.setInterval('checkTextAreaValue()', 50);