Ngăn chặn mặc định trên biểu mẫu Gửi jQuery


138

Có chuyện gì với cái này vậy?

HTML:

<form action="http://localhost:8888/bevbros/index.php/test" method="post" accept-charset="utf-8" id="cpa-form" class="forms">        
      <input type="text" name="zip" value="Zip code" id="Zip" class="required valid">      
      <input type="submit" name="Next" value="Submit" class="forms" id="1">
  </form>

jQuery:

$("#cpa-form").submit(function(e){
    e.preventDefault();
  });

12
Hoạt động tốt ở đây . Bạn có thể gửi thêm thông tin trong câu hỏi của bạn? Nếu bạn alert()trong trình xử lý trình nó có được gọi không? Nếu không, thì có thể có lỗi trong tập lệnh của bạn khiến trình xử lý sự kiện không được kết nối chính xác. Bất cứ điều gì trong bảng điều khiển lỗi?
Thị trấn

3
Liên kết đó là nội bộ và không sử dụng cho chúng tôi.
Steve Robbins

Có lẽ một phiên bản cũ hơn đã được lưu trữ. Có vẻ như đang làm việc bây giờ.
djreed

1
bản sao có thể có của event.preventDefault () so với return false
Liam

2
! Đảm bảo mã javascript chạy sau khi DOM sẵn sàng.
kéo xe

Câu trả lời:


175

Thử cái này:

$("#cpa-form").submit(function(e){
    return false;
});

12
Nó hoạt động, nhưng tại sao phương thức ngăn chặn không thích hợp lại hoạt động?
MikeJ

26
Xem câu hỏi này để được giải thích rõ hơn: stackoverflow.com/questions/1357118/
Brown Brown

8
Đây là câu trả lời sai. e.preventDefault()hoạt động tốt với việc gửi biểu mẫu, vấn đề nằm ở chỗ khác trong mã của OP. Sử dụng return false có thể dẫn đến hậu quả không lường trước được.
Chuck Le Mông

58

Sử dụng cú pháp sự kiện "bật" mới.

$(document).ready(function() {
  $('form').on('submit', function(e){
    // validation code here
    if(!valid) {
      e.preventDefault();
    }
  });
});

Trích dẫn: https://api.jquery.com/on/


2
Chào. Điều này không làm việc cho tôi. (vâng, tôi đặt mã của mình vào bên trong $(document).ready()) Làm thế nào để tôi làm cho nó hoạt động?
Gui Imamura

1
@GuiImamura Cần thêm thông tin. Bạn đã đặt biến hợp lệ thành truehay false? Bạn có thể tạo lại mã của bạn trong jsfiddle.net và gửi liên kết không? Hãy thử thêm một alert()để xác nhận rằng chức năng đang bắn. Một số người đã báo cáo rằng việc thêm e.stopPropagation();sau khi e.preventDefault();dừng các sự kiện bị xiềng xích khác từ việc bắn.
Scarver2

Xin chào, tôi đang sử dụng $('#myFormID').validationEngine('validate')từ jQuery verifyEngine dưới dạng biến valid, để kiểm tra xem đầu vào có phải là địa chỉ email hợp lệ không. Tuy nhiên, tôi muốn nó ngăn chặn hành vi mặc định theo bất kỳ cách nào; không preventDefaultphải bên trong nếu khối, không phải trước đó?
Gui Imamura

@GuiImamura Vui mừng khi biết bạn đã làm việc. Phần preventDefaultbên trong khối nếu không hợp lệ để dừng việc gửi biểu mẫu. Nói cách khác, nếu hợp lệ , hãy sử dụng hành vi mặc định của biểu mẫu.
Scarver2

13

Tôi tin rằng các câu trả lời trên đều đúng, nhưng điều đó không chỉ ra lý do tại sao submitphương pháp này không hoạt động.

Chà, submitphương thức sẽ không hoạt động nếu jQuery không thể lấy formphần tử và jQuery không đưa ra bất kỳ lỗi nào về điều đó. Nếu kịch bản của bạn được đặt vào đầu của tài liệu, chắc chắn rằng mã chạy sau DOMsẵn sàng . Vì vậy, $(document).ready(function () { // your code here // });sẽ giải quyết vấn đề.

Cách thực hành tốt nhất là, luôn đặt tập lệnh của bạn ở dưới cùng của tài liệu.


11

Đây là một câu hỏi cổ xưa, nhưng câu trả lời được chấp nhận ở đây không thực sự đi đến gốc rễ của vấn đề.

Bạn có thể giải quyết hai cách này. Đầu tiên với jQuery:

$(document).ready( function() { // Wait until document is fully parsed
  $("#cpa-form").on('submit', function(e){

     e.preventDefault();

  });
}

Hoặc không có jQuery:

// Gets a reference to the form element
var form = document.getElementById('cpa-form');

// Adds a listener for the "submit" event.
form.addEventListener('submit', function(e) {

  e.preventDefault();

});

Bạn không cần phải sử dụng return falseđể giải quyết vấn đề này.


Tôi đã thay thế người nghe sự kiện js bản địa thay vì người nghe sự kiện jquery và nó hoạt động. cảm ơn vì ý tưởng
Orhan Gazi

6
$('#cpa-form input[name="Next"]').on('click', function(e){
    e.preventDefault();
});

Điều này hoạt động hoàn hảo đối với tôi trên một trang nơi tôi có biểu mẫu phía máy khách bên trong biểu mẫu phía máy chủ.
Liknes


2

Mã của bạn vẫn ổn chỉ cần bạn đặt nó bên trong chức năng sẵn sàng.

$(document).ready( function() {
  $("#cpa-form").submit(function(e){
     e.preventDefault();
  });
}

Lời khuyên này đã được cung cấp bởi các câu trả lời khác. Vui lòng xóa câu trả lời này để giảm phình trang. Bạn có thể nêu lên (các) câu trả lời khác đại diện cho cùng một tình cảm.
mickmackusa

2

ĐỔI - phần này đã lỗi thời vì vậy xin vui lòng không sử dụng nó.

Bạn cũng có thể thử mã này, nếu bạn có các biểu mẫu động sau này được thêm vào. Ví dụ: bạn đã tải một cửa sổ không đồng bộ với ajax và muốn gửi biểu mẫu này.

$('#cpa-form').live('submit' ,function(e){
    e.preventDefault();      
    // do something
});

CẬP NHẬT - bạn nên sử dụng phương thức jQuery on () để thử nghe DOM tài liệu nếu bạn muốn xử lý nội dung được thêm động.

Trường hợp 1, phiên bản tĩnh: Nếu bạn chỉ có một vài người nghe và biểu mẫu của bạn cần xử lý được mã hóa cứng, thì bạn có thể nghe trực tiếp trên "cấp độ tài liệu". Tôi sẽ không sử dụng trình nghe ở cấp độ tài liệu nhưng tôi sẽ cố gắng đi sâu hơn vào cây cam chịu vì nó có thể dẫn đến các vấn đề về hiệu suất (tùy thuộc vào kích thước của trang web và nội dung của bạn)

$('form#formToHandle').on('submit'... 

HOẶC LÀ

$('form#formToHandle').submit(function(e) {
    e.preventDefault();      
    // do something
});

Trường hợp 2, phiên bản động: Nếu bạn đã nghe tài liệu trong mã của mình, thì cách này sẽ tốt cho bạn. Điều này cũng sẽ hoạt động đối với mã được thêm sau này thông qua DOM hoặc động với AJAX.

$(document).on('submit','form#formToHandle',function(){
   // do something like e.preventDefault(); 
});

HOẶC LÀ

$(document).ready(function() {
    console.log( "Ready, Document loaded!" );

    // all your other code listening to the document to load 

    $("#formToHandle").on("submit", function(){
        // do something           
    })
});

HOẶC LÀ

$(function() { // <- this is shorthand version
   console.log( "Ready, Document loaded!" );

    // all your other code listening to the document to load 

    $("#formToHandle").on("submit", function(){
        // do something           
    })
});

7
.live()không được dùng kể từ jQuery 1.7 và bị xóa từ 1.9. Sử dụng .on()thay thế.
Hank

0

Hello đã tìm một giải pháp để làm cho biểu mẫu Ajax hoạt động với Trình quản lý thẻ của Google (GTM), việc trả về sai đã ngăn chặn việc hoàn thành và gửi kích hoạt sự kiện trong thời gian thực trên giải pháp phân tích của google là thay đổi trả về false bởi e.preventDefault () ; hoạt động chính xác theo mã:

 $("#Contact-Form").submit(function(e) {
    e.preventDefault();
   ...
});

0

e.preventDefault () chỉ hoạt động tốt nếu bạn không gặp sự cố với javascripts của mình, hãy kiểm tra javascripts của bạn nếu e.preventDefault () không hoạt động vì một số phần khác trong JS của bạn cũng không hoạt động


0

Vâng, tôi đã gặp một vấn đề tương tự. Vấn đề đối với tôi là tệp JS được tải trước khi kết xuất DOM xảy ra. Vì vậy, di chuyển của bạn<script> đến cuối<body> thẻ.

hoặc sử dụng trì hoãn.

<script defer src="">

nên yên tâm e.preventDefault()nên làm việc.

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.