2011-11-10 27 views
30

Tôi muốn chạy một hàm JavaScript khi biểu mẫu được gửi. Vấn đề là, khi biểu mẫu được gửi, trang được tải lại và các giá trị biểu mẫu được nối vào URL dưới dạng tham số GET. Tôi muốn nó ở lại trang hiện tại và chỉ chạy hàm JavaScript.Gửi biểu mẫu Thực thi tốt nhất cho JavaScript?

Tôi đã tự hỏi thực hành tốt nhất (hoặc những gì bạn làm) để tránh việc tải lại trang và các thông số được gửi đi.

+0

Để tránh các thông số được gửi? : o Bạn không có nghĩa là, để tránh các tham số để hiển thị trong thanh địa chỉ trình duyệt? Về cơ bản, việc sử dụng POST thay vì GET cũng sẽ giải quyết vấn đề này (hữu ích nếu bạn muốn hỗ trợ các ứng dụng khách JS bị vô hiệu hóa, chẳng hạn như một số người dùng điện thoại di động). – BalusC

Trả lời

57

Sử dụng sự kiện onsubmit để thực thi mã JavaScript khi biểu mẫu được gửi. Sau đó bạn có thể trả về false hoặc gọi phương thức preventDefault của sự kiện đã qua để vô hiệu hóa việc gửi biểu mẫu.

Ví dụ:

<script> 
function doSomething() { 
    alert('Form submitted!'); 
    return false; 
} 
</script> 

<form onsubmit="return doSomething();" class="my-form"> 
    <input type="submit" value="Submit"> 
</form> 

này hoạt động, nhưng tốt nhất là không để rác HTML của bạn với JavaScript, cũng giống như bạn không nên viết nhiều quy tắc inline CSS. Nhiều khung công tác Javascript tạo thuận lợi cho việc phân tách mối quan tâm này. Trong jQuery, bạn ràng buộc một sự kiện bằng cách sử dụng mã JavaScript như vậy:

<script> 
$('.my-form').on('submit', function() { 
    alert('Form submitted!'); 
    return false; 
}); 
</script> 

<form class="my-form"> 
    <input type="submit" value="Submit"> 
</form> 
+0

Cảm ơn bạn rất nhiều! – gberg927

+1

Trong khi các trình duyệt có thể xử lý chính xác nó, tôi muốn đề xuất đóng thẻ '' để có sự nhất quán tốt hơn, ví dụ: '' – Manfred

+1

Nếu bạn muốn sử dụng vanilla Javascript (theo ý kiến ​​của tôi bạn nên luôn luôn cố gắng): 'document.getElementsByClassName ('. my-form') [ 0] .addEventListener ('submit', function() {alert ('Form submit'); trả về false;}); ' –

3

Đính kèm trình xử lý sự kiện vào sự kiện gửi biểu mẫu. Đảm bảo hủy bỏ tác vụ mặc định.

Chế độ Quirks có a guide to event handlers, nhưng bạn có thể nên sử dụng thư viện để đơn giản hóa mã và giải quyết sự khác biệt giữa các trình duyệt. Tất cả những cái chính (chẳng hạn như YUIjQuery) bao gồm các tính năng xử lý sự kiện và có một bộ sưu tập lớn là tiny event libraries.

Đây là cách bạn sẽ làm điều đó trong YUI 3:

<script src="http://yui.yahooapis.com/3.4.1/build/yui/yui-min.js"></script> 
<script> 
    YUI().use('event', function (Y) { 
     Y.one('form').on('submit', function (e) { 
      // Whatever else you want to do goes here 
      e.preventDefault(); 
     }); 
    }); 
</script> 

Hãy chắc chắn rằng the server will pick up the slack nếu thất bại JavaScript vì lý do nào.

2

Tôi biết đã muộn một chút về điều này. Nhưng tôi luôn nghĩ rằng cách tốt nhất để tạo người nghe sự kiện là trực tiếp từ JavaScript. Không thích áp dụng kiểu CSS nội tuyến.

function validate(){ 
    //do stuff 
} 
function init(){ 
    document.getElementById('form').onsubmit = validate; 
} 
windows.onload = init; 

Bằng cách đó bạn không có nhiều người nghe sự kiện trong suốt HTML của mình.

+0

listeners event * – Martin

+0

Điều này đúng, nhưng tôi đã chọn sử dụng tùy chọn đơn giản nhất cho câu hỏi này. – moteutsch

+0

Điều này không hiệu quả đối với tôi. Toàn bộ hàm không được thực hiện trước khi biểu mẫu được gửi. – Sahand

Các vấn đề liên quan