如何绑定到 jQuery 中 textarea 的更改事件?

IT技术 javascript jquery jquery-ui
2021-02-04 12:00:53

我想捕获<textarea>. 就像键入任何字符(删除、退格)或鼠标单击并粘贴或剪切。是否有可以触发所有这些事件的 jQuery 事件?

我尝试了更改事件,但它仅在从组件中退出后才触发回调。

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

6个回答

试试这个:

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

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

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

演示

这适用于您所做的任何更改、打字、剪切、粘贴。

@Senthilnathan:Chrome 和 FF 对我来说也不起作用propertychange因为它也没有input
2021-03-14 12:00:53
请注意,我刚刚发现当在 textarea 中按下退格键时,这两个事件都不会在 IE9 中触发(尚未检查旧版本的 IE)。
2021-03-21 12:00:53
我看到你在 DEMO 中使用了 <input type="textarea" cols="10" rows="4" />,是认真的吗?
2021-03-23 12:00:53
这些演示正在使用<input type="text">,而不是<textarea>
2021-03-31 12:00:53
将 'input propertychange' 更改为 'input change' 以便它也适用于 IE9。paulbakaus.com/2012/06/14/propertychange-on-internet-explorer-9
2021-04-09 12:00:53

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 演示

但是,如果您在 1.7 版之前坚持使用 jQuery,那么这不适用
2021-03-16 12:00:53
@Sebastialonso:该on("change", function() ... 当textarea的失去焦点,仅启动请参阅我之前的问题,并在这个小提琴上尝试一下——更改文本区域,然后在文本区域外单击,您应该会看到更改事件触发。
2021-03-23 12:00:53
@SNag 该代码不适用于 Chrome 45,但它适用于 FF 41
2021-03-23 12:00:53
on("change", function() ....部分对我不起作用。不会触发任何警报,也不会触发控制台日志。不过,对于 keyup 来说,它就像一种魅力。
2021-03-27 12:00:53
您可能只是使用.one("change keyup paste", function ...而不是.on. 事件one监听器只触发一次。
2021-03-30 12:00:53

使用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();
  }
});
对于 Internet Explorer,这需要 9+,甚至 10+ 才能正常运行。
2021-03-24 12:00:53
这个解决方案就像一个魅力。完美地克服了 change() 和 keypress() 事件处理程序的限制。谢谢一吨叉子。
2021-03-24 12:00:53
这似乎不适用于粘贴事件?谢谢你的帮助。
2021-03-25 12:00:53

这个问题需要一个最新的答案,有来源。这才是真正有效的(虽然你不必相信我的话):

// 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
3时,IE9 中的 oninput 不会触发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的,他们几乎将其用于整个网站。而且我认为可以肯定地说,如果它对 Facebook 来说是一个足够强大的解决方案,那么它对你来说可能也足够强大。:-)

更新:如果您碰巧需要 Internet Explorer 中的拖放支持等功能,您可能需要查看pandell最近更新的jquery-splendid-textchange.

尽管似乎“选择更改”仅在应用于文档时才有效。可以使用“document.activeElement”获取活动元素。
2021-03-29 12:00:53

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

HTML

<textarea id="textareaID"></textarea>
<button id="yourBtnID" style="display: none;">click me</div>
这似乎不适用于粘贴事件?谢谢你的帮助。
2021-03-31 12:00:53