ตรวจจับกล่องข้อความอินพุตที่เปลี่ยนแปลง


289

ฉันได้ดูคำถามอื่น ๆ อีกมากมายและพบคำตอบที่ง่ายมากรวมถึงรหัสด้านล่าง ฉันต้องการตรวจสอบเมื่อมีคนเปลี่ยนเนื้อหาของกล่องข้อความ แต่ด้วยเหตุผลบางอย่างมันไม่ทำงาน ... ฉันไม่ได้รับข้อผิดพลาดของคอนโซล เมื่อฉันตั้งเบรกพอยต์ในเบราว์เซอร์ที่change()ฟังก์ชั่นมันไม่เคยกระทบ

$('#inputDatabaseName').change(function () { 
    alert('test'); 
});
<input id="inputDatabaseName">

1
เพียงลองทำสองสิ่ง: ให้อินพุต type = "text" และทำให้เป็นองค์ประกอบซิงเกิล <input id = "inputDatabaseName" type = "text" />
szeliga

ล้างรหัสที่ไม่จำเป็นออกไปเพียง 7 ปีสายเกินไป
ผู้สนับสนุนปีศาจ

คำตอบ:


523

คุณสามารถใช้inputเหตุการณ์ Javascriptใน jQuery เช่นนี้:

$('#inputDatabaseName').on('input',function(e){
    alert('Changed!')
});

ในจาวาสคริปต์บริสุทธิ์:

document.querySelector("input").addEventListener("change",function () {
  alert("Input Changed");
})

หรือเช่นนี้

<input id="inputDatabaseName" onchange="youFunction();"
onkeyup="this.onchange();" onpaste="this.onchange();" oninput="this.onchange();"/>

1
ดูเหมือนจะไม่พบเอกสารสำหรับเหตุการณ์นี้ แต่ทำงานได้ตามที่ฉันคาดหวัง ความคิดใดที่ฉันสามารถค้นหาหน้าเอกสารได้
Jorge Pedret

3
คุณสามารถค้นหาได้ในรายการกิจกรรม HTML5: w3schools.com/tags/ref_eventattributes.aspหรือที่นี่help.dottoro.com/ljhxklln.php
Ouadie

7
วิธีแก้ปัญหานี้ดีกว่าใช้ keyup เช่น IE ช่วยให้ผู้ใช้ล้างช่องใส่โดยการคลิก X ซึ่งไม่ก่อให้เกิดการกดปุ่ม
เฟรดริก

7
วิธีการแก้ปัญหาที่ใกล้เคียงที่สุด แต่ก็ยังไม่สามารถใช้งานได้เมื่อเบราว์เซอร์ทำการป้อนอัตโนมัติในกล่องข้อความ
Saumil

3
นี่ดีกว่าคำตอบแรก Ctrl, Shift key ทั้งหมดนับเป็น keyup และส่วนที่แย่ที่สุดคือถ้าคุณพิมพ์เร็วหลายอินพุตจะลงทะเบียนเป็นเหตุการณ์คีย์อัพเดียว
octref

174

ลองเปลี่ยนเป็นปุ่มกดแทน

<script type="text/javascript">
   $(document).ready(function () {
       $('#inputDatabaseName').keyup(function () { alert('test'); });
   });
</script>

นี่เป็นเอกสารอย่างเป็นทางการสำหรับ jQuery .keyup ()


1
ถอนหายใจฉันสาบานฉันพยายามที่ (หลังจากมองไปที่คำถามนี้: stackoverflow.com/questions/1443292/... ) ... แต่เห็นได้ชัดว่าไม่ได้เพราะมันทำงานได้ในขณะนี้!
ผู้สนับสนุนของปีศาจ

27
เปลี่ยนการยิงเท่านั้นเมื่อองค์ประกอบสูญเสียการโฟกัสและปุ่มกดจะถูกยิงเมื่อปุ่มบนคีย์บอร์ดถูกปล่อยออกมา
Declan Cook

9
จะเกิดอะไรขึ้นหากผู้ใช้วางโค้ดโดยใช้ ctrl + v หรือโดยการลากข้อความที่เลือกด้วยเมาส์ไปที่ #inputDatabaseName คุณตรวจจับสิ่งนั้นได้อย่างไร
Radu Simionescu

5
ปัญหาหลักของเรื่องนี้คือมันยังคงไม่พิจารณาหากเนื้อหามีการเปลี่ยนแปลงจริง มีเพียงปุ่มที่ถูกกด
Metropolis

@ มหานครคุณเห็นคำตอบของฉันแล้วหรือยัง? stackoverflow.com/a/23266812/3160597
azerafati

103

คำตอบแต่ละข้อหายไปบางจุดดังนั้นนี่เป็นวิธีแก้ปัญหาของฉัน:

$("#input").on("input", function(e) {
  var input = $(this);
  var val = input.val();

  if (input.data("lastval") != val) {
    input.data("lastval", val);

    //your change action goes here 
    console.log(val);
  }

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="input">
<p>Try to drag the letters and copy paste</p>

Input Eventไฟบนแป้นพิมพ์ป้อนข้อมูลเมาส์ลาก , ป้อนอัตโนมัติและคัดลอกวางทดสอบบน Chrome และ Firefox การตรวจสอบค่าก่อนหน้าทำให้ตรวจพบการเปลี่ยนแปลงจริงซึ่งหมายความว่าจะไม่ยิงเมื่อวางสิ่งเดียวกันหรือพิมพ์อักขระเดียวกันหรืออื่น ๆ

ตัวอย่างการทำงาน: http://jsfiddle.net/g6pcp/473/


อัปเดต:

และหากคุณต้องการเรียกใช้change function เฉพาะเมื่อผู้ใช้พิมพ์เสร็จแล้วและป้องกันไม่ให้ดำเนินการเปลี่ยนแปลงหลายครั้งคุณสามารถลองทำสิ่งนี้:

var timerid;
$("#input").on("input", function(e) {
  var value = $(this).val();
  if ($(this).data("lastval") != value) {

    $(this).data("lastval", value);
    clearTimeout(timerid);

    timerid = setTimeout(function() {
      //your change action goes here 
      console.log(value);
    }, 500);
  };
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="input">

หากผู้ใช้เริ่มพิมพ์ (เช่น "foobar") รหัสนี้จะป้องกันไม่ให้คุณchange actionเรียกใช้สำหรับผู้ใช้ตัวอักษรทุกประเภทและจะทำงานเฉพาะเมื่อผู้ใช้หยุดพิมพ์สิ่งนี้เป็นสิ่งที่ดีเป็นพิเศษเมื่อคุณส่งอินพุตไปยังเซิร์ฟเวอร์ (เช่นอินพุตการค้นหา) ทางเซิร์ฟเวอร์ทำการค้นหาเพียงครั้งเดียวfoobarและไม่ใช่การค้นหาหกครั้งfแล้วfoจึงfooและfoobต่อ ๆ ไปเรื่อย ๆ


1
นี่เป็นครั้งแรกที่ฉันทำงานตั้งแต่ 6 ขวบฉันได้ลองแล้ว น่ากลัว ขอบคุณ
Enkode

เกือบจะใช้งานได้กับ IE9: ถ้าคุณลบตัวละครมันจะไม่ส่งเหตุการณ์ วิธีแก้ปัญหาที่ดีมาก
Soma

@Soma เป็นคนอื่นพูดว่า "หมด IE ไม่ได้เป็นข้อบกพร่องมันเป็นคุณลักษณะ";) แม้ว่า IE ยังคงไม่ได้อีกต่อไป แต่ถ้าคุณมีการแก้ไขสำหรับที่แจ้งให้เราทราบ
azerafati

ฉันรู้ แต่ฉันต้องทำเพื่อการทำงาน :( ตามความเป็นจริงฉันทำ: ใช้$("#input").focusout(function () {})เมื่อคุณคลิกนอกอินพุตเหตุการณ์จะถูกไล่ออกงานใช้ได้กับ Chrome และ Firefox เวอร์ชันปัจจุบันและ IE9
Soma

2
@ โซมาถ้าเป็นวิธีเดียวที่ IE จะทำงานคุณสามารถใช้วิธีของฉันในการเปลี่ยนบรรทัดนี้เท่านั้น$("#input").on("input focusout",function(e){
azerafati

18

การป้อนข้อความจะไม่ส่งchangeเหตุการณ์จนกว่าจะไม่ได้โฟกัส คลิกที่ด้านนอกของอินพุตและการแจ้งเตือนจะปรากฏขึ้น

หากการโทรกลับเริ่มต้นก่อนที่ตัวอักษรจะเสียโฟกัสให้ใช้.keyup()เหตุการณ์


changeกำลังทำงานที่นี่: jsfiddle.net/g6pcp ; keyupเตือนหลังจากแต่ละคีย์ซึ่งไม่ใช่วิธีที่ดี
diEcho

1
@diEcho ฉันคิดว่าการแจ้งเตือนเป็นเพียงตัวอย่างในการทำให้โค้ดทำงาน ... ไม่ใช่สิ่งที่เขาตั้งใจจะทำในตอนท้าย
Scott Harwell

@diEcho สิ่งที่ Scott พูดนั้นเป็นเพียงการทดสอบ นั่นเป็นวิธีที่ฉัน debug: D
Advocate ของ Devil

@Scott alert()กรุณาโปรดกรุณาใช้ดีบักที่เหมาะสมมากกว่า มันจะทำให้การดีบักง่ายขึ้นมาก
Matt Ball

13

onkeyup, onpaste, onchange, oninputดูเหมือนว่าจะล้มเหลวเมื่อเบราว์เซอร์ทำการป้อนอัตโนมัติในกล่องข้อความ ในการจัดการกรณีดังกล่าวให้รวม " autocomplete='off'" ในฟิลด์ข้อความของคุณเพื่อป้องกันไม่ให้เบราว์เซอร์ป้อนข้อความอัตโนมัติ

เช่น,

<input id="inputDatabaseName" autocomplete='off' onchange="check();"
 onkeyup="this.onchange();" onpaste="this.onchange();" oninput="this.onchange();" />

<script>
     function check(){
          alert("Input box changed");
          // Things to do when the textbox changes
     }
</script>

3

ในกรณีของฉันฉันมีกล่องข้อความที่ติดอยู่กับ datepicker ทางออกเดียวที่ได้ผลสำหรับฉันคือจัดการกับเหตุการณ์ใน onSelect ของ datepicker

<input type="text"  id="bookdate">

$("#bookdate").datepicker({            
     onSelect: function (selected) {
         //handle change event here
     }
});

0

ฉันคิดว่าคุณสามารถใช้keydownเช่นกัน:

$('#fieldID').on('keydown', function (e) {
  //console.log(e.which);
  if (e.which === 8) {
    //do something when pressing delete
    return true;
  } else {
    //do something else
    return false;
  }
});

-5

ที่ทำงาน:

$("#ContentPlaceHolder1_txtNombre").keyup(function () {
    var txt = $(this).val();
        $('.column').each(function () {
            $(this).show();
            if ($(this).text().toUpperCase().indexOf(txt.toUpperCase()) == -1) {
                $(this).hide();
            }
        });
    //}
});

ดูเหมือนว่ารหัสสำหรับคำถามที่แตกต่างกัน ... สิ่งที่เกี่ยวกับค่าตัวพิมพ์ใหญ่และการแสดง / ซ่อนเนื้อหาเกี่ยวกับอะไร?
Nico Haase
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.