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


219

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

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

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


18
绑定到键事件还不够,因为可以通过鼠标更改文本(上下文菜单中的“粘贴” /“剪切”或拖放)。
Konstantin Smolyanin

Textarea上的变化检测中也讨论了类似的问题。
dma_k 2014年

Answers:


333

实际尝试一下:

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

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

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

演示

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


5
@Senthilnathan:我也无法在Chrome和FF中使用它,因为它也不propertychange存在input
Blaster

4
请注意,当我刚刚切换时,在文本区域中按退格键时,这两个事件都不会在IE9中触发(尚未检查IE的较早版本)。
Zappa 2012年

26
这些演示使用<input type="text">,不<textarea>
本·柯林斯

5
将“输入属性更改”更改为“输入更改”,以便它也可以在IE9中使用。paulbakaus.com/2012/06/14/propertychange-on-internet-explorer-9
c0D3l0g1c 2014年

11
我看到您在DEMO中使用<input type =“ textarea” cols =“ 10” rows =“ 4” />了吗?
DrLightman '16

142

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


3
on("change", function() ....部分对我不起作用。不会触发任何警报,也不会触发控制台日志。但是,对于keyup来说,它就像一个魅力。
Sebastialonso

3
@Sebastialonso:该on("change", function() ... 当textarea的失去焦点,仅启动。请参考我先前的问题,并在此小提琴上进行尝试-更改文本区域,然后在文本区域之外单击,您将看到更改事件触发。
SNag 2014年

@SNag该代码无法在Chrome 45上运行,但可在FF 41上运行
DariusVE,2015年

但是,如果您仍然使用1.7版之前的jQuery,则此方法不适用
Code Jockey

赞成在不推荐使用的功能上使用。比.bind()好得多
Danny Harding

79

使用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+才能正常运行。
乌迪

1
此解决方案就像一个魅力。完全克服了change()和keypress()事件处理程序的局限性。感谢一吨叉子。
维卡(Vickar)

25

这个问题需要有最新的答案和资料。这是实际有效的方法(尽管您不必相信我的话):

// 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


尽管“ selectionchange”似乎仅在应用于文档时才起作用。活动元素可以通过“ document.activeElement”获得。
tfE

11

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>

4

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

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

对于过时的浏览器,您还可以添加selectionchangepropertychange(如其他答案中所述)。但是selectionchange在IE9中对我不起作用。这就是为什么我添加keyup


2

尝试通过聚焦来做到这一点

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

1

试试这个 ...

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

              // Write your code here       
 });

7
绑定到键事件还不够,因为可以通过鼠标更改文本(上下文菜单中的“粘贴” /“剪切”或拖放)。
Konstantin Smolyanin

1

.delegate是唯一对我有用jQuery JavaScript Library v2.1.1

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

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

处理对任何类型的输入和选择以及文本区域的更改,而忽略箭头键和ctrl,cmd,功能键等。

注意:我只在FF中尝试过此操作,因为它是用于FF插件的。


-11

试试这个

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

这不是完全错误的。事实上,如果一个联合收割机$("#textarea").on('change keyup paste', function() {}),并$('textarea').trigger('change');可以解决问题,防止对paste自动工作!
loretoparisi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.