Tôi có thể tạo <button> không gửi biểu mẫu không?


516

Tôi đã có một hình thức, với 2 nút

<a href="index.html"><button>Cancel changes</button></a>

<button type="submit">Submit</button>

Tôi cũng sử dụng nút jQuery UI, chỉ đơn giản như thế này

$('button').button();

Tuy nhiên, nút đầu tiên cũng gửi biểu mẫu. Tôi đã nghĩ rằng nếu nó không có type="submit", thì nó sẽ không.

Rõ ràng tôi có thể làm điều này

$('button[type!=submit]').click(function(event) { event.stopPropagation(); });

Nhưng có cách nào để tôi có thể ngăn nút quay lại đó gửi biểu mẫu mà không cần sự can thiệp của JavaScript không?

Thành thật mà nói, tôi chỉ sử dụng một nút để tôi có thể tạo kiểu cho nó với jQuery UI. Tôi đã thử gọi button()vào liên kết và nó không hoạt động như mong đợi (trông khá xấu xí!).



2
sử dụng <button type="button">cho mẫu không gửi biểu mẫu và <input type="submit">cho mẫu khác. Sau đó bắt nó với jquery$('#formID').submit(function(e){});
Airwavezx

Câu trả lời:


1130

Giá trị mặc định cho typethuộc tính của buttoncác thành phần "trình". Đặt type="button"nút này để tạo nút không gửi biểu mẫu.

<button type="button">Submit</button>

Theo lời của Tiêu chuẩn HTML : "Không làm gì cả."


14
Theo w3schools, điều đó không đúng với IE .
R0MANARMY

53
Đó chỉ là một sự lựa chọn thiết kế tồi tệ.
octern 12/2/2015


Wow, bạn và alex đã thực sự hất nó ra trong các phiên bản. Tôi không thấy lý do tại sao một trong hai bạn quan tâm đến dấu ngoặc kép hoặc không thuộc tính.
ADJenks

228

Phần buttontử có một loại mặc định submit.

Bạn có thể làm cho nó không làm gì bằng cách đặt một loại button:

<button type="button">Cancel changes</button>

1
@ B.ClayShannon Không thực sự. Bạn có thể sử dụng mã phía máy chủ để trả về cùng một trang khi nhấp vào nút, nhưng nó vẫn sẽ tải lại trang. Cuối cùng, nút này là một phần của tài liệu và vì vậy cách duy nhất để nói cho trình duyệt biết bạn muốn nó hoạt động như thế nào là HTML và JavaScript.
s4y

17

Chỉ cần sử dụng HTML cũ tốt:

<input type="button" value="Submit" />

Gói nó làm chủ đề của một liên kết, nếu bạn mong muốn:

<a href="http://somewhere.com"><input type="button" value="Submit" /></a>

Hoặc nếu bạn quyết định bạn muốn javascript cung cấp một số chức năng khác:

<input type="button" value="Cancel" onclick="javascript: someFunctionThatCouldIncludeRedirect();"/>

7
Sử dụng điều khiển nút tiêu chuẩn với thuộc tính loại thích hợp là "html cũ tốt" và tạo đánh dấu đơn giản hơn nhiều.
R0MANARMY

Rõ ràng là không đơn giản nếu trong một số trình duyệt, nó có một kiểu gửi mặc định và trong các trình duyệt khác, nó có một loại nút mặc định. Heck, thậm chí chỉ có loại trình mặc định làm phức tạp mọi thứ nhiều hơn IMO cần thiết. Cần có đánh dấu dễ dàng cung cấp một nút mà không làm gì. Và có:<input type="button" />
Jeffrey Blake

+1 Tôi đã sử dụng kỹ thuật chính xác này rất nhiều lần và nó luôn hoạt động tốt với tôi. Một biến thể là nếu bạn cần hủy sự kiện postback cho nút phía máy chủ dựa trên một số tính toán phía máy khách, bạn có thể bao gồm window.event.returnValue = false; trong mã của bạn thực thi trong sự kiện onclick phía máy khách cho nút của bạn ... nghĩa là, nếu sử dụng điều khiển trình xác nhận tùy chỉnh không cắt mù tạt cho bạn :)
Adam McKee

1
@ JGB146: Chỉ vì không phải tất cả các trình duyệt mặc định có cùng giá trị không có nghĩa là chúng sẽ không tôn trọng đúng loại nếu nó được đặt thủ công (như được đề xuất bởi jleedev. Không đề cập đến các câu hỏi đặc biệt yêu cầu cách thực hiện mà không có JavaScript trong khi câu trả lời của bạn không tính đến điều đó.
R0MANARMY

11
@ JGB146: Buttonlà một thùng chứa trong HTML. Điều đó cho phép bạn đặt những thứ như hình ảnh hoặc bảng (không chắc tại sao bạn làm điều này, nhưng bạn có thể) vv trong khi inputkhông hỗ trợ điều đó. Có một sự khác biệt giữa hai loại và mỗi loại có trường hợp sử dụng phù hợp.
R0MANARMY


5

Thành thật mà nói, tôi thích những câu trả lời khác. Dễ dàng và không cần phải vào JS. Nhưng tôi nhận thấy rằng bạn đã hỏi về jQuery. Vì vậy, để hoàn thiện, trong jQuery nếu bạn trả về false bằng trình xử lý .click (), nó sẽ phủ nhận hành động mặc định của widget.

Xem ở đây để biết một ví dụ (và nhiều goodies nữa). Đây cũng là tài liệu .

Tóm lại, với mã mẫu của bạn, hãy làm điều này:

<script type="text/javascript">
    $('button[type!=submit]').click(function(){
        // code to cancel changes
        return false;
    });
</script>

<a href="index.html"><button>Cancel changes</button></a>
<button type="submit">Submit</button>

Là một lợi ích bổ sung, với điều này, bạn có thể thoát khỏi thẻ neo và chỉ cần sử dụng nút.


Thật kỳ lạ, thêm e.preventDefault()không có gì để ngăn chặn trình (nơi nó bắt đầu với function(e)).
Sablefoste

1

Nếu không đặt typethuộc tính, bạn cũng có thể quay lại falsetừ OnClicktrình xử lý của mình và khai báo onclickthuộc tính là onclick="return onBtnClick(event)".


0

Có, bạn có thể tạo nút không gửi biểu mẫu bằng cách thêm thuộc tính loại nút giá trị: <button type="button"><button>


-2
  <form class="form-horizontal" method="post">
        <div class="control-group">

            <input type="text" name="subject_code" id="inputEmail" placeholder="Subject Code">
        </div>
        <div class="control-group">
            <input type="text" class="span8" name="title" id="inputPassword" placeholder="Subject Title" required>
        </div>
        <div class="control-group">
            <input type="text" class="span1" name="unit" id="inputPassword" required>
        </div>
            <div class="control-group">
            <label class="control-label" for="inputPassword">Semester</label>
            <div class="controls">
                <select name="semester">
                    <option></option>
                    <option>1st</option>
                    <option>2nd</option>
                </select>
            </div>
        </div>

        <div class="control-group">
            <label class="control-label" for="inputPassword">Deskripsi</label>
            <div class="controls">
                    <textarea name="description" id="ckeditor_full"></textarea>
 <script>CKEDITOR.replace('ckeditor_full');</script>
            </div>
        </div>



        <div class="control-group">
        <div class="controls">

        <button name="save" type="submit" class="btn btn-info"><i class="icon-save"></i> Simpan</button>
        </div>
        </div>
        </form>

        <?php
        if (isset($_POST['save'])){
        $subject_code = $_POST['subject_code'];
        $title = $_POST['title'];
        $unit = $_POST['unit'];
        $description = $_POST['description'];
        $semester = $_POST['semester'];


        $query = mysql_query("select * from subject where subject_code = '$subject_code' ")or die(mysql_error());
        $count = mysql_num_rows($query);

        if ($count > 0){ ?>
        <script>
        alert('Data Sudah Ada');
        </script>
        <?php
        }else{
        mysql_query("insert into subject (subject_code,subject_title,description,unit,semester) values('$subject_code','$title','$description','$unit','$semester')")or die(mysql_error());


        mysql_query("insert into activity_log (date,username,action) values(NOW(),'$user_username','Add Subject $subject_code')")or die(mysql_error());


        ?>
        <script>
        window.location = "subjects.php";
        </script>
        <?php
        }
        }

        ?>
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.