ฉันจะเชื่อมโยงกับเหตุการณ์การเปลี่ยนแปลงของ textarea ใน jQuery ได้อย่างไร


220

ฉันต้องการที่จะจับภาพหากมีการเปลี่ยนแปลงใด ๆ <textarea>ที่เกิดขึ้นกับ เช่นเดียวกับการพิมพ์อักขระใด ๆ (การลบ Backspace) หรือการคลิกเมาส์แล้ววางหรือตัด มีเหตุการณ์ jQuery ที่สามารถทริกเกอร์เหตุการณ์เหล่านั้นทั้งหมดได้หรือไม่

ฉันลองเปลี่ยนเหตุการณ์ แต่มันเป็นต้นเหตุของการติดต่อกลับหลังจากแท็บออกจากองค์ประกอบ

ใช้ : ฉันต้องการเปิดใช้งานปุ่มถ้า<textarea>มีข้อความใด ๆ


18
การเชื่อมโยงกับเหตุการณ์สำคัญไม่เพียงพอเนื่องจากสามารถเปลี่ยนข้อความด้วยเมาส์ ("วาง" / "ตัด" จากเมนูบริบทหรือลากและวาง)
Konstantin Smolyanin

คำถามที่คล้ายกันจะกล่าวถึงในการตรวจสอบ textarea onChange
dma_k

คำตอบ:


334

ลองสิ่งนี้จริง ๆ :

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

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

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

การสาธิต

ใช้งานได้กับการเปลี่ยนแปลงใด ๆ ที่คุณทำพิมพ์ตัดวาง


5
@Senthilnathan: ไม่มีการทำงานใน Chrome และ FF เช่นกันสำหรับฉันเพราะมันไม่ได้propertychangeมีอยู่ด้วยinput
Blaster

4
ระวังเพราะฉันเพิ่งบอกว่าทั้งสองเหตุการณ์ไม่ทำงานใน IE9 (ยังไม่ได้ตรวจสอบเวอร์ชั่นเก่ากว่าของ IE) เมื่อกดปุ่ม Backspace ใน textarea
Zappa

26
การสาธิตเหล่านี้กำลังใช้<input type="text">ไม่ใช่<textarea>
Ben Collins

5
เปลี่ยน 'การเปลี่ยนแปลงคุณสมบัติการป้อนข้อมูล' เป็น 'การเปลี่ยนแปลงการป้อนข้อมูล' เพื่อให้ทำงานได้ใน IE9 เช่นกัน paulbakaus.com/2012/06/14/propertychange-on-internet-explorer-9
c0D3l0g1c

11
ฉันเห็นว่าคุณใช้ <input type = "textarea" cols = "10" rows = "4" /> ใน DEMO จริงหรือไม่
DrLightman

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 สูญเสียโฟกัส อ้างถึงคำถามก่อนหน้าของฉันสำหรับสิ่งนี้และลองใช้ซอนี้ - เปลี่ยน textarea จากนั้นคลิกนอก textarea และคุณควรเห็นเหตุการณ์การเปลี่ยนแปลงเกิดขึ้น
SNag

@SNag รหัสนั้นใช้ไม่ได้กับ Chrome 45 แต่ทำงานบน FF 41
DariusVE

หากคุณติดขัดกับการใช้ jQuery ก่อนหน้ารุ่น 1.7 แล้วสิ่งนี้จะไม่สามารถใช้ได้
Code Jockey

upvoting สำหรับการใช้งานในฟังก์ชั่นที่ไม่สนับสนุน ดีกว่า. ผูก ()
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+ เพื่อให้ทำงานได้อย่างถูกต้อง
Udi

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/en-US/docs/Web/Events/input#Browser_compatibility
2: oninput ใน IE9 ไม่ทำงานเมื่อเรากด BACKSPACE / DEL / do CUT
3: https: // msdn .microsoft.com / en-us / library / ms536956 (v = vs.85) .aspx
4: http://api.jquery.com/prop/#prop-propertyName-function

แต่สำหรับการแก้ปัญหามากขึ้นทั่วโลกที่คุณสามารถใช้ตลอดทั้งโครงการของคุณผมขอแนะนำให้ใช้textchange jQuery ปลั๊กอินที่จะได้รับใหม่เบราว์เซอร์ที่รองรับtextchangeเหตุการณ์ ได้รับการพัฒนาโดยบุคคลเดียวกันที่ใช้งานonChangeกิจกรรมที่เทียบเท่ากับ ReactJS ของ Facebook ซึ่งพวกเขาใช้เกือบทั้งเว็บไซต์ และฉันคิดว่ามันปลอดภัยที่จะบอกว่าถ้ามันเป็นโซลูชั่นที่แข็งแกร่งเพียงพอสำหรับ Facebook มันอาจจะแข็งแกร่งพอสำหรับคุณ :-)

UPDATE:หากคุณเกิดขึ้นคุณลักษณะความจำเป็นเช่นการลากและการสนับสนุนลดลงใน Internet Explorer คุณอาจแทนต้องการตรวจสอบpandell's jquery-splendid-textchangeส้อมปรับปรุงเพิ่มเติมเมื่อเร็ว


แม้ว่าดูเหมือนว่า "selectionchange" จะทำงานเฉพาะเมื่อนำไปใช้กับเอกสาร องค์ประกอบที่ใช้งานอาจได้รับด้วย "document.activeElement"
2559

11

2561 โดยไม่มี JQUERY

คำถามอยู่กับ JQuery เป็นเพียง FYI

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

สำหรับเบราว์เซอร์ที่ล้าสมัยคุณอาจเพิ่มselectionchangeและpropertychange(ตามที่ระบุไว้ในคำตอบอื่น ๆ ) แต่selectionchangeไม่ได้ผลสำหรับฉันใน IE9 keyupว่าทำไมฉันเพิ่ม



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

จัดการการเปลี่ยนแปลงในการป้อนข้อมูลทุกประเภทและเลือกรวมทั้ง textareas โดยไม่สนใจปุ่มลูกศรและสิ่งต่าง ๆ เช่น 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.