Nút HTML để KHÔNG gửi biểu mẫu


370

Tôi có một hình thức. Bên ngoài hình thức đó, tôi có một nút. Một nút đơn giản, như thế này:

<button>My Button</button>

Tuy nhiên, khi tôi nhấp vào nó, nó sẽ gửi biểu mẫu. Đây là mã:

<form id="myform">
    <input />
</form>
<button>My Button</button>

Tất cả nút này nên làm là một số JavaScript. Nhưng ngay cả khi nó trông giống như trong đoạn mã trên, nó vẫn gửi biểu mẫu. Khi tôi thay đổi nút tag thành span, nó hoạt động hoàn hảo. Nhưng thật không may, nó cần phải là một nút. Có cách nào để chặn nút đó gửi biểu mẫu không? Ví dụ như

<button onclick="document.getElementById('myform').doNotSubmit();">My Button</button>

3
Vấn đề này không thể tái tạo trong các trình duyệt hiện đại và vấn đề ban đầu có thể xuất phát từ sự hiểu lầm. Mặc dù mặc định buttontype=submit, không có biểu mẫu nào được gửi khi buttonphần tử nằm ngoài bất kỳ biểu mẫu nào. Trừ khi một bản trình diễn thực tế (một tài liệu mẫu, nhận dạng trình duyệt và mô tả các quan sát cho thấy một số mẫu được gửi) có thể được đưa ra, câu hỏi này nên được đóng lại là không thể lặp lại. Sử dụng type=buttonlà thực hành tốt, nhưng điều này không làm cho vấn đề thực sự.
Jukka K. Korpela

Câu trả lời:


894

Tôi nghĩ rằng đây là đặc thù nhỏ khó chịu nhất của HTML ... Nút đó cần phải là loại "nút" để không gửi.

<button type="button">My Button</button>

Cập nhật ngày 5 tháng 2 năm 2019: Theo Tiêu chuẩn sống HTML (và cả thông số kỹ thuật HTML 5 ):

Các thiếu mặc định giá trịgiá trị mặc định không hợp lệ là những trạng thái Gửi Button.


9
@Powerslave bất kỳ lý do để khôngto use <button>
Sandip Pingle

4
@SandipPingle Không có lý do để sử dụng nó, trừ khi bạn cần một số kiểu dáng thực sự phức tạp. Ngoài ra, IE6 và IE7 (may mắn bị loại bỏ) xử lý <button>s không chính xác trong một số trường hợp. Ngoài ra, <button>không tương thích với nhiều trình duyệt 100% trong các trình duyệt khác nhau có thể gửi các giá trị khác nhau cho cùng một <button>khi được sử dụng trong một biểu mẫu.
Powerslave

35
Đây là một câu trả lời tuyệt vời, nhưng nó không phải là một đặc thù . Giá trị mặc định của typethuộc tính trong <button>thẻ là submit. Khi thay đổi thành type=button, <button>không có hành vi mặc định. Xem typethuộc tính tại đây: developer.mozilla.org/en-US/docs/Web/HTML/Euity/button
Michael Benjamin

1
Vậy ý tưởng về <button type='submit'>điều đó quá khó đối với tôi haha. Dù sao câu trả lời của bạn hoạt động tuyệt vời!
divHelper11

2
Hành vi mặc định (và do đó ngầm) của một yếu tố không phải là biểu mẫu cụ thể là để kích hoạt chức năng cụ thể của biểu mẫu có khả năng phá hủy. Làm thế nào mà đó không phải là một quyết định thiết kế đặc biệt cho thông số HTML được đưa ra?
HonourMule

36

return false;vào cuối trình xử lý onclick sẽ thực hiện công việc. Tuy nhiên, tốt hơn hết là chỉ cần thêm type="button"vào <button>- theo cách nó hoạt động đúng ngay cả khi không có bất kỳ JavaScript nào.


1
Các nút không gửi biểu mẫu chỉ hữu ích khi bật JavaScript ... Tôi đồng ý rằng loại = "nút" mặc dù sạch hơn.
ThiefMaster

2
return false;không hoạt động trong tất cả các kịch bản, trong khi type="Button"đó. Ngay cả với JavaScript được kích hoạt.
brejoc

15

Dave Markle là chính xác. Từ trang web của W3School :

Luôn chỉ định thuộc tính loại cho nút. Loại mặc định cho Internet Explorer là "nút", trong khi trong các trình duyệt khác (và trong đặc tả W3C), nó là "trình".

Nói cách khác, trình duyệt bạn đang sử dụng đang tuân theo thông số kỹ thuật của W3C.


15

Theo mặc định, các nút html gửi biểu mẫu.

Điều này là do thực tế là các nút thậm chí nằm bên ngoài biểu mẫu đóng vai trò là người gửi (xem trang web của W3Schools: http://www.w3schools.com/tags/att_button_form.asp )

Nói cách khác, loại nút là "gửi" theo mặc định

<button type="submit">Button Text</button>

Do đó, một cách dễ dàng để khắc phục điều này là sử dụng loại nút .

<button type="button">Button Text</button>

Các tùy chọn khác bao gồm trả về false ở cuối onclick hoặc bất kỳ trình xử lý nào khác khi nhấp vào nút hoặc để sử dụng thẻ <input> thay vào đó

Để tìm hiểu thêm, hãy xem thông tin của Mozilla Developer Network trên các nút: https://developer.mozilla.org/en/docs/Web/HTML/Euity/button


3

Không nên sử dụng <Button>thẻ. Sử dụng <Input type='Button' onclick='return false;'>thẻ thay thế. (Sử dụng "return false" thực sự không nên gửi biểu mẫu.)

Một số tài liệu tham khảo


2
Nó đủ để sử dụng <input type="button" />, và nó đủ để return false;- không cần phải làm cả hai.
Tom

Tôi không đồng ý rằng không nên sử dụng thẻ nút. Nếu bạn không sử dụng nó, bạn sẽ mất một số tính năng trợ năng mà bạn sẽ tự động nhận được bằng thẻ nút. Tôi muốn nói rằng thẻ nút thực sự được khuyến nghị cho các yếu tố hoạt động như các nút.
CookieMonster

theo ghi chú trong tài liệu tham khảo mà bạn đã liên kết: "Trong khi các phần tử <input> của nút loại vẫn là HTML hoàn toàn hợp lệ, thì phần tử <button> mới hơn bây giờ là cách được ưa thích để tạo các nút." Vì vậy, nó hoàn toàn ngược lại bạn đã nêu.
jedzej

1

Vì lý do tiếp cận, tôi không thể kéo nó ra bằng nhiều type=submitnút. Cách duy nhất để làm việc tự nhiên với một formnút có nhiều nút nhưng CHỈ một người có thể gửi biểu mẫu khi nhấn Enterphím là đảm bảo rằng chỉ một trong số đó là type=submittrong khi các nút khác thuộc loại khác type=button. Bằng cách này, bạn có thể hưởng lợi từ trải nghiệm người dùng tốt hơn trong việc xử lý biểu mẫu trên trình duyệt về mặt hỗ trợ bàn phím.


0

Một tùy chọn khác phù hợp với tôi là thêm onsubmit = "return false;" vào thẻ mẫu.

<form onsubmit="return false;">

Về mặt ngữ nghĩa có lẽ không phải là một giải pháp tốt như các phương pháp thay đổi loại nút ở trên, nhưng dường như là một tùy chọn nếu bạn chỉ muốn một phần tử biểu mẫu sẽ không gửi.

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.