ฉันจะฟังแบบฟอร์มส่งเหตุการณ์ในจาวาสคริปต์ได้อย่างไร


124

ฉันต้องการเขียนไลบรารี javascript ตรวจสอบความถูกต้องของฟอร์มของตัวเองและฉันกำลังค้นหาวิธีตรวจสอบว่ามีการคลิกปุ่มส่งใน Google แต่ทั้งหมดที่ฉันพบคือรหัสที่คุณต้องใช้ onClick on onSubmit="function()"ใน html

ฉันต้องการสร้างจาวาสคริปต์นี้เพื่อที่ฉันจะได้ไม่ต้องสัมผัสโค้ด html ใด ๆ เช่นการเพิ่ม onSubmit หรือ onClick javascript


8
ทำไมไม่document.forms['yourForm'].onsubmit = function(){}? หรือaddEventListener?
Joseph Silber

3
คุณต้องการตรวจสอบว่ามีการคลิกปุ่มส่งหรือไม่หรือคุณต้องการตรวจสอบเมื่อผู้ใช้ส่งแบบฟอร์ม (ซึ่งสามารถทำได้โดยคลิกปุ่มหรือกด Enter จากฟิลด์ใดฟิลด์หนึ่ง)
nnnnnn

คำตอบ:


506

ทำไมคนถึงใช้ jQuery อยู่เสมอเมื่อไม่จำเป็น?
ทำไมผู้คนถึงใช้ JavaScript ธรรมดา ๆ ไม่ได้?

var ele = /*Your Form Element*/;
if(ele.addEventListener){
    ele.addEventListener("submit", callback, false);  //Modern browsers
}else if(ele.attachEvent){
    ele.attachEvent('onsubmit', callback);            //Old IE
}

callback เป็นฟังก์ชันที่คุณต้องการเรียกใช้เมื่อมีการส่งแบบฟอร์ม

เกี่ยวกับEventTarget.addEventListenerตรวจสอบเอกสารเกี่ยวกับเรื่องนี้ MDN

หากต้องการยกเลิกsubmitเหตุการณ์ดั้งเดิม(ป้องกันไม่ให้ส่งแบบฟอร์ม) ให้ใช้.preventDefault()ในฟังก์ชันเรียกกลับของคุณ

document.querySelector("#myForm").addEventListener("submit", function(e){
    if(!isValid){
        e.preventDefault();    //stop form from submitting
    }
});

ฟังsubmitเหตุการณ์ด้วยห้องสมุด

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

  1. jQuery

    $(ele).submit(callback);

    eleการอ้างอิงองค์ประกอบของฟอร์มอยู่ที่ไหนและcallbackเป็นการอ้างอิงฟังก์ชันการเรียกกลับ การอ้างอิง

  1. AngularJS (1.x)

    <form ng-submit="callback()">
    
    $scope.callback = function(){ /*...*/ };

    ตรงไปตรงมามาก$scopeขอบเขตที่กำหนดโดยกรอบงานภายในคอนโทรลเลอร์ของคุณอยู่ที่ไหน การอ้างอิง

  2. เกิดปฏิกิริยา

    <form onSubmit={this.handleSubmit}>
    
    class YourComponent extends Component {
        // stuff
    
        handleSubmit(event) {
            // do whatever you need here
    
            // if you need to stop the submit event and 
            // perform/dispatch your own actions
            event.preventDefault();
        }
    
        // more stuff
    }

    เพียงแค่ส่งตัวจัดการไปที่onSubmitเสา การอ้างอิง

  3. เฟรมเวิร์ก / ไลบรารีอื่น ๆ

    อ้างถึงเอกสารของกรอบงานของคุณ


การตรวจสอบ

คุณสามารถตรวจสอบความถูกต้องของคุณใน JavaScript ได้ตลอดเวลา แต่ด้วย HTML5 เรายังมีการตรวจสอบความถูกต้องดั้งเดิม

<!-- Must be a 5 digit number -->
<input type="number" required pattern="\d{5}">

คุณไม่จำเป็นต้องใช้ JavaScript! เมื่อใดก็ตามที่ไม่รองรับการตรวจสอบความถูกต้องแบบเนทีฟคุณสามารถเปลี่ยนกลับไปใช้โปรแกรมตรวจสอบ JavaScript ได้

การสาธิต: http://jsfiddle.net/DerekL/L23wmo1L/


106
โค้ด "น่ากลัว ... น่าเกลียด" 5 บรรทัดนั้นจะแทนที่ฟังก์ชันที่จำเป็นที่มีให้โดย jQuery 4,000 บรรทัดซึ่งต้องเป็นโค้ด "น่ากลัว ... น่าเกลียด" ด้วย
RobG

45
ฉันไม่ได้ต่อต้าน jQuery มากนักมีเพียงผู้ที่ใช้มันเป็นคาถาเวทมนตร์โดยไม่ทราบว่าพวกเขาสามารถแทนที่สิ่งทั้งหมดด้วยรหัสสองสามบรรทัด ทำไมไม่ใช้เวลาในการค้นหาว่าเบราว์เซอร์ทำงานอย่างไร มันไม่ยากเลยจริงๆ
RobG

4
@ เบ็น - และเพียงเพราะคุณสามารถทำบางอย่างกับห้องสมุดไม่ได้หมายความว่าคุณควรทำเช่นกันและคนอื่น ๆ ก็ไม่ควรได้รับการสนับสนุนจากการเรียนรู้พื้นฐานโดยการตอบกลับของ "just use library x" เมื่อมีคนถามคำถามเฉพาะเกี่ยวกับจาวาสคริปต์คุณควรตอบคำถามโดยใช้จาวาสคริปต์ธรรมดาอย่างสุภาพ โดยทั้งหมดแนะนำบางสิ่งจากห้องสมุดที่คุณเลือก แต่การตอบคำถามควรเป็นสิ่งสำคัญอันดับแรก
RobG

4
โดยส่วนตัวผมเชื่อว่าบุคคลควรรู้พื้นฐานก่อน
Derek 朕會功夫

7
ด้วยจิตวิญญาณเดียวกันเราควรลองเขียนภาษาแอสเซมบลีเพิ่มเติม ครึ่งล้อเล่น (ผมค่อนข้างชอบการแก้ปัญหา jQuery และคิดว่ามันเป็นหลุมกระต่ายไม่มีที่สิ้นสุดถ้าคุณจริงๆต้องการที่จะเข้าใจสิ่งที่เกิดขึ้นภายใต้ประทุน) แต่ใช่ฉันดีใจที่ฉันจะรู้ภาษาประกอบบางและรู้วิธีการ TCP มีการสร้างการเชื่อมต่อ ฯลฯ ฉันยังคงไม่มอบโซลูชันระดับล่างให้ใครเพียงเพื่อสอนพวกเขาถึงความมหัศจรรย์ของสิ่งที่อยู่ภายใต้ประทุน
Josh Sutterfield

6

นี่เป็นวิธีที่ง่ายที่สุดที่คุณสามารถเรียกใช้ฟังก์ชันจาวาสคริปต์ของคุณเองได้เมื่อonSubmitเกิดเหตุการณ์

HTML

<form>
    <input type="text" name="name">
    <input type="submit" name="submit">
</form>

JavaScript

window.onload = function() {
    var form = document.querySelector("form");
    form.onsubmit = submitted.bind(form);
}

function submitted(event) {
    event.preventDefault();
}

3
เหตุใดคุณจึงตัดสินใจผูกฟังก์ชัน "ส่งแล้ว" ไม่มีการใช้ 'this' ในฟังก์ชันนี้
Lior

bindไม่จำเป็นจริงๆ
pstadler

3

ตามความต้องการของคุณคุณสามารถทำสิ่งต่อไปนี้ได้โดยไม่ต้องใช้ไลบรารีเช่น jQuery:

เพิ่มสิ่งนี้ลงในหัวของคุณ:

window.onload = function () {
    document.getElementById("frmSubmit").onsubmit = function onSubmit(form) {
        var isValid = true;
        //validate your elems here
        isValid = false;

        if (!isValid) {
            alert("Please check your fields!");
            return false;
        }
        else {
            //you are good to go
            return true;
        }
    }
}

และแบบฟอร์มของคุณอาจมีลักษณะดังนี้:

    <form id="frmSubmit" action="/Submit">
        <input type="submit" value="Submit" />
    </form>

9
ใช้addEventListenerแทน onsubmit หรือ onload เสมอเพื่อให้นักพัฒนารายอื่นเพิ่มผู้ฟังของตนเองได้
beytarovski

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