html <input type =“ text” /> เหตุการณ์ onchange ไม่ทำงาน


88

ฉันกำลังพยายามทำการทดลองบางอย่าง สิ่งที่ฉันต้องการให้เกิดขึ้นคือทุกครั้งที่ผู้ใช้พิมพ์บางอย่างในกล่องข้อความสิ่งนั้นจะปรากฏในกล่องโต้ตอบ ฉันใช้onchangeคุณสมบัติเหตุการณ์เพื่อทำให้มันเกิดขึ้น แต่ไม่ได้ผล ฉันยังคงต้องกดปุ่มส่งเพื่อให้มันใช้งานได้ ฉันอ่านเกี่ยวกับ AJAX และฉันคิดจะเรียนรู้เกี่ยวกับเรื่องนี้ ฉันยังต้องการ AJAX เพื่อให้มันใช้งานได้หรือ JavaScript แบบธรรมดาเพียงพอหรือไม่ กรุณาช่วย.

index.php

<script type="text/javascript" src="javascript.js"> </script>

<form action="index.php" method="get">
 Integer 1: <input type="text" id="num1" name="num1" onchange="checkInput('num1');" /> <br />
 Integer 2: <input type="text" id="num2" name="num2" onchange="checkInput('num2');" /> <br />
 <input type="submit" value="Compute" />
</form>

javascript.js

function checkInput(textbox) {
 var textInput = document.getElementById(textbox).value;

 alert(textInput); 
}

4
คุณสามารถส่ง "this" แทน id ได้ดังนั้นคุณจึงไม่ต้องเรียก getElementById
remi bourgarel

ใช่ ... ขอบคุณที่ฉันทำในสิ่งที่ Ash Burlaczenko บอกฉัน ...
Newbie Coder

ด้วย JQuery โซลูชันที่ดีเสนอที่นี่: stackoverflow.com/a/8167009/2065594
Cyril Jacquart

คำตอบ:


127

onchangeจะถูกทริกเกอร์เมื่อการควบคุมเบลอเท่านั้น ลองonkeypressแทน


19
ไม่ทำงานสำหรับการตรวจจับการเปลี่ยนแปลงหลังจากที่ผู้ใช้วางจากคลิปบอร์ด
Juozas Kontvainis

19
นั่นช่วยแก้ปัญหาของฉันได้ ฉันชอบonkeyupมากกว่าเพราะมันได้รับค่าใหม่ในinput('element.value')
stealthjong

4
ฉันยังสังเกตว่า "การกดแป้นพิมพ์" ไม่ได้รับการยกขึ้นหลังจากกด backspace อย่างน้อยเมื่อใช้ jquery "keyup" จะเพิ่มขึ้นหลังจากกดและปล่อย backspace "input" ช่วยแก้ปัญหานี้และยังใช้ได้กับการคัดลอกและฉันคิดว่านี่เป็นวิธีแก้ปัญหาที่เหมาะสมที่นี่ (ตามที่ผู้ใช้ "99 ปัญหา - ไวยากรณ์ไม่ใช่หนึ่ง" ชี้ให้เห็นด้านล่าง)
Patrick Finnigan

4
'onkeypres', 'onkeyup' ฯลฯ ไม่ใช่วิธีแก้ปัญหาเมื่อต้องการเรียกใช้ฟังก์ชันก็ต่อเมื่อข้อความมีการเปลี่ยนแปลง ! เหตุการณ์สำคัญทำให้เกิดการเข้าชมที่ไม่จำเป็นในกรณีนี้ (แปลกมากที่คำตอบนี้ได้รับเลือกให้เป็นวิธีแก้ปัญหาโดยเฉพาะด้วยคะแนนโหวตที่บ้าคลั่ง !! ฉันไม่โหวตลงคะแนนเพราะฉันไม่ชอบเพียงแค่โหวตลดคะแนนฉันชอบที่จะให้เหตุผลว่าทำไมถึงเป็น ไม่ตกลง - มีประโยชน์มากกว่านี้!)
Apostolos

สำหรับ HTML ≥5หรือ jQuery ≥1.7มีโซลูชันอื่น ๆ ด้านล่างซึ่งจัดการการวางจากคลิปบอร์ด
user202729

42

ใช้.on('input'...เพื่อตรวจสอบทุกการเปลี่ยนแปลงอินพุต (วางคีย์อัพ ฯลฯ ) จาก jQuery 1.7 ขึ้นไป

สำหรับอินพุตแบบคงที่และแบบไดนามิก:

$(document).on('input', '.my-class', function(){
    alert('Input changed');
});

สำหรับอินพุตแบบคงที่เท่านั้น:

$('.my-class').on('input', function(){
    alert('Input changed');
});

JSFiddle พร้อมตัวอย่างแบบคงที่ / ไดนามิก: https://jsfiddle.net/op0zqrgy/7/


สิ่งนี้ทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน - ขอบคุณ หมายเหตุสำหรับผู้อื่น - อย่าลืมรันโค้ดด้านบนใน onLoad ของคุณหรือบางอย่างเพื่อให้ 'เริ่มการตรวจสอบ'
Robert Penridge

สายเกินไปสำหรับความคิดเห็น แต่ ... ทำไมคุณถึงแนะนำให้ใช้ jQuery หากผู้ใช้ที่ตอบรับแสดง JavaScript ธรรมดา
Andrés Morales

@ AndrésMoralesเป็นไลบรารีทั่วไปที่แอปพลิเคชันจำนวนมากสามารถเข้าถึงได้ทันทีและง่ายต่อการเพิ่มลงในแอปพลิเคชันที่ไม่มี เห็นได้ชัดว่าคำตอบนี้ใช้ไม่ได้กับแอปพลิเคชันที่ไม่สามารถ (หรือเลือกที่จะไม่) ใช้ jQuery
rybo111

@ rybo111 เป๊ะ! jQuery เป็นไลบรารีทั่วไปและใช้กันอย่างแพร่หลาย แต่มันเชื่อมโยงโดยตรงในสมองของฉันกับคำถามเกี่ยวกับ meme เกี่ยวกับ "รวมตัวเลขสองตัวโดยใช้ JavaScript" และคำตอบที่ได้รับการโหวตมากที่สุดเกี่ยวกับการใช้ jQuery ไม่ใช่กรณี แต่หลายคนไม่สามารถแยก JavaScript และ jQuery ได้
Andrés Morales

@ AndrésMoralesหมายเหตุคำตอบของฉันครอบคลุม "วางคีย์อัพ ฯลฯ " ฉันจำได้ว่าโซลูชัน jQuery สะดวกสบายเมื่อฉันตอบคำถามนี้ (7 ปีที่แล้ว!)
rybo111

30

การตรวจสอบการกดแป้นพิมพ์เป็นเพียงวิธีแก้ปัญหาบางส่วนเท่านั้นเนื่องจากสามารถเปลี่ยนเนื้อหาของช่องป้อนข้อมูลได้โดยใช้การคลิกเมาส์ หากคุณคลิกขวาในช่องข้อความคุณจะมีตัวเลือกตัดและวางที่คุณสามารถใช้เพื่อเปลี่ยนค่าได้โดยไม่ต้องกดแป้นพิมพ์ ในทำนองเดียวกันหากเปิดใช้งานการเติมข้อความอัตโนมัติคุณสามารถคลิกซ้ายในช่องและรับรายการแบบเลื่อนลงของข้อความที่ป้อนก่อนหน้านี้และคุณสามารถเลือกจากตัวเลือกต่างๆได้โดยใช้การคลิกเมาส์ การดักจับการกดแป้นพิมพ์จะไม่ตรวจพบการเปลี่ยนแปลงประเภทใดประเภทหนึ่งเหล่านี้

น่าเศร้าที่ไม่มีเหตุการณ์ "onchange" ที่รายงานการเปลี่ยนแปลงทันทีอย่างน้อยที่สุดเท่าที่ฉันรู้ แต่มีวิธีแก้ปัญหาที่ใช้ได้กับทุกกรณี: ตั้งค่าเหตุการณ์เวลาโดยใช้ setInterval ()

สมมติว่าช่องป้อนข้อมูลของคุณมีรหัสและชื่อ "เมือง":

<input type="text" name="city" id="city" />

มีตัวแปรส่วนกลางชื่อ "เมือง":

var city = "";

เพิ่มสิ่งนี้ในการเริ่มต้นเพจของคุณ:

setInterval(lookForCityChange, 100);

จากนั้นกำหนดฟังก์ชัน lookForCityChange ():

function lookForCityChange()
{
    var newCity = document.getElementById("city").value;
    if (newCity != city) {
        city = newCity;
        doSomething(city);     // do whatever you need to do
    }
}

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

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


1
หากไม่สามารถเปลี่ยนค่าของช่องป้อนข้อมูลโดยไม่ได้รับโฟกัสและภาพเบลอเกิดขึ้นเมื่อองค์ประกอบสูญเสียโฟกัสทำไมไม่ลองมองหาการเปลี่ยนแปลงใน onblur ดูล่ะ
Pakman

คุณต้องการดำเนินการเมื่อช่องป้อนข้อมูลเปลี่ยนไปหรือเมื่อสูญเสียโฟกัสหลังจากการเปลี่ยนแปลง? หากคุณต้องการดำเนินการทันทีคุณไม่สามารถรอให้ onblur ได้
Dragonfly

@ Pakman นั่นเป็นทางออกที่ดีในบางกรณี แต่ถ้าคุณต้องการค้นหาตามที่คุณพิมพ์ - ฟีเจอร์ IMO ที่ดีมาก (ทำไมผู้ใช้จึงต้องมองหาสิ่งต่างๆในเมื่อคอมพิวเตอร์สามารถทำได้เร็วขึ้นมากและไม่เบื่อ) - หรืออย่างอื่นที่เป็นเช่นนั้น จำเป็นต้องเกิดขึ้นเมื่อข้อความเปลี่ยนไปทำไมคุณถึงไม่สามารถทำได้?
The Dag

เศร้ามากที่มาถึงเรื่องนี้
Chuck Batson

1
@ChuckBatson คำตอบนี้มาจากปี 2012 ฉันสังเกตเห็นว่าคุณโพสต์ความคิดเห็นของคุณในปี 2016 ดูคำตอบของฉันหากคุณใช้ jQuery ตอนนี้มันง่ายมากอย่างไม่น่าเชื่อ
rybo111

26

HTML5กำหนดoninputเหตุการณ์เพื่อตรวจจับการเปลี่ยนแปลงโดยตรงทั้งหมด มันได้ผลสำหรับฉัน


1
ใช้งานได้กับตัวควบคุมสปินเนอร์ type = "number" ด้วย (ซึ่ง onkeypress ใช้ไม่ได้)
Bob

13

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

หากคุณต้องการให้ฟังก์ชันของคุณเริ่มทำงานทุกครั้งที่ค่าองค์ประกอบเปลี่ยนแปลงคุณควรใช้oninputเหตุการณ์นี้ดีกว่าเหตุการณ์ขึ้น / ลงของคีย์เนื่องจากสามารถเปลี่ยนค่าได้ด้วยการวางเมาส์ของผู้ใช้หรือเติมอัตโนมัติเป็นต้น

อ่านเพิ่มเติมเกี่ยวกับเหตุการณ์การเปลี่ยนแปลงที่นี่

อ่านเพิ่มเติมเกี่ยวกับเหตุการณ์การป้อนข้อมูลได้ที่นี่



6

ประการแรกอะไรที่ 'ไม่ได้ผล'? คุณไม่เห็นการแจ้งเตือน?

นอกจากนี้รหัสของคุณสามารถทำให้ง่ายขึ้นสำหรับสิ่งนี้

<input type="text" id="num1" name="num1" onkeydown="checkInput(this);" /> <br />

function checkInput(obj) {
    alert(obj.value); 
}

2

ฉันพบปัญหาที่ Safari ไม่เริ่มการทำงานของเหตุการณ์ "onchange" ในช่องป้อนข้อความ ฉันใช้ jQuery 1.7.2 "เหตุการณ์" และมันก็ใช้ไม่ได้เช่นกัน ฉันลงเอยด้วยการใช้เหตุการณ์ textchange ของ ZURB ทำงานร่วมกับ mouseevents และสามารถยิงได้โดยไม่ต้องออกจากสนาม:
http://www.zurb.com/playground/jquery-text-change-custom-event

$('.inputClassToBind').bind('textchange', function (event, previousText) {
    alert($(this).attr('id'));
});

2

ความคิดเห็นสองสามข้อที่ IMO มีความสำคัญ:

  • องค์ประกอบการป้อนข้อมูลไม่ได้เปล่ง 'เปลี่ยน' กิจกรรมจนกว่ากระทำของผู้ใช้ ENTER หรือเบลอรอคอยเป็นพฤติกรรมที่ถูกต้อง

  • เหตุการณ์ที่คุณต้องการใช้คือ"input"(" oninput ") นี่แสดงให้เห็นถึงความแตกต่างระหว่างสองอย่างนี้: https://javascript.info/events-change-input

  • เหตุการณ์ทั้งสองส่งสัญญาณท่าทาง / ช่วงเวลาของผู้ใช้ที่แตกต่างกัน 2 รายการ (เหตุการณ์ "อินพุต" หมายถึงผู้ใช้กำลังเขียนหรือนำทางตัวเลือกรายการที่เลือก แต่ยังไม่ยืนยันการเปลี่ยนแปลง "เปลี่ยน" หมายถึงผู้ใช้เปลี่ยนค่า (ด้วยการป้อนหรือเบลอ ของเรา)

  • การฟังเหตุการณ์สำคัญอย่างที่หลายคนแนะนำในที่นี้ถือเป็นแนวทางปฏิบัติที่ไม่ดีในกรณีนี้ (เหมือนคนที่ปรับเปลี่ยนพฤติกรรมเริ่มต้นของ ENTER บนอินพุต) ...

  • jQuery ไม่มีส่วนเกี่ยวข้องกับสิ่งนี้ ทั้งหมดนี้อยู่ในมาตรฐาน HTML

  • หากคุณมีปัญหาในการทำความเข้าใจว่าทำไมถึงเป็นพฤติกรรมที่ถูกต้องบางทีอาจเป็นประโยชน์ในการทดลองใช้โปรแกรมแก้ไขข้อความหรือเบราว์เซอร์ของคุณโดยไม่ต้องใช้เมาส์ / แพดเพียงแป้นพิมพ์

สองเซ็นต์ของฉัน


1

onkeyup ทำงานให้ฉัน onkeypress ไม่ทริกเกอร์เมื่อกดพื้นที่ด้านหลัง


เกิดอะไรขึ้นเมื่อวางค่า? ฉันใช้ "onpaste" เพื่อเริ่มกิจกรรมด้วย
Louis

1

มันจะดีกว่าที่จะใช้กับonchange(event) <select>ด้วย<input>คุณสามารถใช้ด้านล่างเหตุการณ์:

- onkeyup(event)
- onkeydown(event)
- onkeypress(event)

-3

ลองonpropertychange. ใช้ได้กับ IE เท่านั้น


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