2013-02-22 39 views
8

tôi muốn ngăn chặn một nút gửi với sự kiện onclick từ nộp:nút Ngăn chặn nộp cùng với sự kiện onclick từ nộp

$j('form#userForm .button').click(function(e) { 
    if ($j("#zip_field").val() > 1000){ 
     $j('form#userForm .button').attr('onclick','').unbind('click'); 
     alert('Sorry we leveren alleen inomstreken hijen!'); 
     e.preventDefault(); 
     return false; 
    } 
}); 

Đây là nút gửi:

<button class="button vm-button-correct" type="submit" 
onclick="javascript:return myValidator(userForm, 'savecartuser');">Opslaan</button> 

Nó sẽ hiển thị "cảnh báo "chức năng và cũng loại bỏ sự kiện onclick, nhưng hình thức được gửi anyway. Xóa sự kiện onclick theo cách thủ công trước khi gửi sẽ giải quyết sự cố. Tuy nhiên đây là chức năng cốt lõi của và tôi không muốn loại bỏ nó.

EDIT:

Nó chắc chắn gây ra bởi sự chọn onclick .. Làm thế nào tôi có thể buộc kịch bản jQuery tôi để ngay lập tức tải lại sự kiện onclick? thêm trước khi mã jquery: $j('form#userForm .button').attr('onclick',''); sẽ giải quyết vấn đề .. tuy nhiên xác nhận của tôi sẽ không làm việc một nữa ...

+0

Bạn thực sự nên làm điều này trong trình xử lý của mẫu .. nếu bạn nhấn enter khi biểu mẫu có tiêu điểm .. nó sẽ kích hoạt trình xử lý gửi và không bấm của bạn do đó xác nhận của bạn sẽ bị bỏ qua –

Trả lời

18

Bạn sẽ cần thêm sự kiện này như một tham số:

$j('form#userForm .button').click(function(event) { // <- goes here ! 
    if (parseInt($j("#zip_field").val(), 10) > 1000){ 
     event.preventDefault(); 
     $j('form#userForm .button').attr('onclick','').unbind('click'); 
     alert('Sorry we leveren alleen inomstreken hijen!'); 
    } 
}); 

Ngoài ra, val() luôn trả về một chuỗi, vì vậy thực hành tốt sẽ là chuyển đổi nó thành một số trước khi bạn so sánh nó với một số và tôi không chắc liệu bạn có thực sự nhắm mục tiêu tất cả các thành phần .button bên trong hàm này hay không hoặc bạn nên sử dụng this thay thế?

Nếu bạn đang sử dụng jQuery 1.7+, bạn thực sự nên xem xét sử dụng on()off() cho việc này.

+0

thx, tôi đã chỉnh sửa mã nhưng nó không hoạt động .. Tôi đoán sự kiện onclick phá vỡ prevent.default ...? –

+0

Lệnh onclick inline, sẽ luôn luôn thực thi đầu tiên, và thực tế không tốt để có cả một hàm inline như vậy, và một trình xử lý sự kiện, có lẽ bạn nên suy nghĩ lại, và chỉ cho trình xử lý sự kiện và gọi 'myvalidator() 'từ trình xử lý sự kiện bên ngoài. – adeneo

+1

nhiều thx! Tôi thấy rằng bây giờ;) Tuy nhiên tôi không muốn phá vỡ mã lõi của virtuemart .. Vì vậy, đó là lý do tại sao tôi cố gắng giải quyết như thế này! –

0

Đừng quên rằng có những chức năng/đối số sự kiện, nhưng bạn phải xác định các thông số:

$("#thing").click(function(e) { 
    e.preventDefault(); 
}); 

Bằng cách này, việc nộp phải dừng lại, và do đó bạn có thể conditionalise nó.

12

Về cơ bản, nếu bạn thay đổi loại nút từ type="submit" thành type="button", nút đó sẽ không gửi biểu mẫu và không cần giải pháp thay thế.

Hy vọng điều này sẽ hữu ích.

+0

nhiều thx ... tuy nhiên im khá chắc chắn sự kiện onclick là để đổ lỗi –

+0

Câu trả lời này giải quyết trường hợp của tôi, đối với tôi điều này nên được đánh dấu là câu trả lời đúng, vì nó là phổ quát hơn :) cảm ơn tuyệt vời! –

+0

Tôi đang sử dụng xác thực JQuery. Tôi có một nút với nút "type =" "" nhưng vẫn là hình thức postbacks khi xác thực không thành công! [Ở đây] (http://stackoverflow.com/questions/29890544/page-still-postbacks-after-jquery-validation-fail/29890940#29890940) là câu hỏi của tôi. – sohaiby

0

Cách tốt nhất là làm mọi thứ bên trong trình xử lý sự kiện gửi biểu mẫu của bạn. Tháo inline onclick và chạy nó bên trong trình chức năng

$j('#userForm').submit(function(e) { 
    if (+$j("#zip_field").val() > 1000){ 
     alert('Sorry we leveren alleen inomstreken hijen!'); 
     return false; 
    } 
    return myValidator(userForm, 'savecartuser'); 
}); 
-2

Tôi tin rằng có một cách dễ dàng hơn:

$j('form#userForm .button').click(function(event) { // <- goes here ! 
    if (parseInt($j("#zip_field").val(), 10) > 1000){ 
     event.stopPropagation(); 
    } 
});