Làm cách nào tôi có thể nghe biểu mẫu gửi sự kiện trong javascript?


124

Tôi muốn viết thư viện javascript xác thực mẫu của riêng tôi và tôi đã tìm trên google cách phát hiện nếu nhấp vào nút gửi nhưng tất cả những gì tôi tìm thấy là mã nơi bạn phải sử dụng onClick trên onSubmit="function()"html.

Tôi muốn tạo javascript này để tôi không phải chạm vào bất kỳ mã html nào như thêm onSubmit hoặc onClick javascript.


8
Tại sao không document.forms['yourForm'].onsubmit = function(){}? Hay là addEventListener?
Joseph Silber

3
Bạn có thực sự muốn kiểm tra xem nút gửi đã được nhấp hay bạn muốn kiểm tra khi người dùng gửi biểu mẫu (họ có thể làm gì bằng cách nhấp vào nút hoặc bằng cách nhấn Enter từ một trong các trường)?
nnnnnn

Câu trả lời:


505

Tại sao mọi người luôn sử dụng jQuery khi không cần thiết?
Tại sao mọi người không thể sử dụng JavaScript đơn giản?

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 là một chức năng mà bạn muốn gọi khi biểu mẫu đang được gửi.

Giới thiệu EventTarget.addEventListener, hãy xem tài liệu này trên MDN .

Để hủy submitsự kiện gốc (ngăn không cho biểu mẫu được gửi), hãy sử dụng .preventDefault()chức năng gọi lại của bạn,

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

Lắng nghe submitsự kiện với các thư viện

Nếu vì một lý do nào đó mà bạn quyết định thư viện là cần thiết (bạn đã sử dụng một hoặc bạn không muốn giải quyết các vấn đề trên trình duyệt chéo), thì đây là danh sách các cách để nghe sự kiện gửi trong các thư viện phổ biến:

  1. jQuery

    $(ele).submit(callback);

    eleTham chiếu phần tử biểu mẫu ở đâu và callbacklà tham chiếu hàm gọi lại. Tài liệu tham khảo

  1. AngularJS (1.x)

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

    Rất đơn giản, đâu $scopelà phạm vi được cung cấp bởi khung bên trong bộ điều khiển của bạn . Tài liệu tham khảo

  2. Phản ứng

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

    Đơn giản chỉ cần vượt qua trong một xử lý để onSubmitchống đỡ. Tài liệu tham khảo

  3. Các khung / thư viện khác

    Tham khảo tài liệu của khung của bạn.


Thẩm định

Bạn luôn có thể thực hiện xác thực bằng JavaScript, nhưng với HTML5, chúng tôi cũng có xác thực gốc.

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

Bạn thậm chí không cần bất kỳ JavaScript! Bất cứ khi nào xác thực bản địa không được hỗ trợ, bạn có thể dự phòng trình xác thực JavaScript.

Bản trình diễn: http://jsfiddle.net/DerekL/L23wmo1L/


106
Đó là 5 dòng mã "ghê gớm ... xấu xí" thay thế chức năng cần thiết được cung cấp bởi 4.000 dòng jQuery, cũng phải là mã "ghê gớm ... xấu xí".
RobG

45
Tôi không có nhiều chống lại jQuery, chỉ những người sử dụng nó như một loại phép thuật mà không nhận ra rằng họ có thể thay thế toàn bộ bằng một vài dòng mã. Tại sao không dành thời gian để tìm hiểu làm thế nào các trình duyệt thực sự hoạt động? Nó thực sự không khó lắm.
RobG

4
@Ben - và chỉ vì bạn có thể làm gì đó với thư viện không có nghĩa là bạn cũng không nên từ chối việc học những điều cơ bản bằng cách trả lời "chỉ sử dụng thư viện x". Khi ai đó hỏi một câu hỏi cụ thể về javascript, thật lịch sự khi trả lời câu hỏi bằng cách sử dụng javascript đơn giản. Bằng mọi cách hãy đề xuất một cái gì đó từ thư viện của bạn, nhưng trả lời câu hỏi nên là ưu tiên hàng đầu.
RobG

4
Cá nhân tôi tin rằng một người đầu tiên nên biết những điều cơ bản.
Derek 朕 會

7
trong cùng một tinh thần, chúng ta thực sự nên thử viết thêm ngôn ngữ lắp ráp. Đùa nửa đùa nửa thật (Tôi khá thích một giải pháp vui nhộn và nghĩ rằng đó là một lỗ thỏ vô tận nếu bạn thực sự muốn hiểu những gì đang diễn ra dưới mui xe), nhưng vâng, tôi rất vui vì tôi biết một số ngôn ngữ lắp ráp và biết cách TCP các kết nối được tạo ra, v.v. Tôi vẫn sẽ không trao cho ai một giải pháp cấp thấp hơn chỉ vì mục đích dạy cho họ những điều kỳ diệu của những gì đang diễn ra.
Josh Sutterfield

6

Đây là cách đơn giản nhất bạn có thể gọi hàm javascript của riêng mình khi onSubmitxảy ra.

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
Tại sao bạn quyết định ràng buộc chức năng 'đã gửi'? Không có sử dụng 'cái này' trong chức năng.
Lior

bindthực sự không cần thiết
pstadler

3

Dựa trên yêu cầu của bạn, bạn cũng có thể thực hiện các thao tác sau mà không cần các thư viện như jQuery:

Thêm cái này vào đầu bạn:

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

Và hình thức của bạn vẫn có thể trông giống như:

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

9
luôn luôn sử dụng addEventListenerthay vì onsubmit hoặc onload để cho phép các nhà phát triển khác thêm trình nghe của riêng họ.
beyt Swarovski

1

Với jQuery:

$('form').submit(function () {
    // Validate here

    if (pass)
        return true;
    else
        return false;
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.