Làm thế nào để gửi biểu mẫu bằng JavaScript bằng cách nhấp vào liên kết?


123

Thay vì nút gửi, tôi có một liên kết:

<form>

  <a href="#"> submit </a>

</form>

Tôi có thể làm cho nó gửi biểu mẫu khi nó được nhấp vào không?


Tôi sử dụng điều này để tích hợp một biểu mẫu hoàn toàn ẩn vào một trang. Nhưng có những ngắt dòng trước và sau liên kết. Chúng đến từ phần tử hình thức? Và tôi muốn mở liên kết trong một tab / trang mới, target="_blank"dường như không hoạt động.
JPT

1
tl; dr <a role="button" aria-label="submit form" href="javascript:void(0)" onclick="document.querySelector('form').submit()">Submit</a>
Josh Habdas

Câu trả lời:


210

Cách tốt nhất

Cách tốt nhất là chèn một thẻ đầu vào thích hợp:

<input type="submit" value="submit" />

Cách JS tốt nhất

<form id="form-id">
  <button id="your-id">submit</button>
</form>
var form = document.getElementById("form-id");

document.getElementById("your-id").addEventListener("click", function () {
  form.submit();
});

Đính kèm mã JavaScript thứ hai bằng một DOMContentLoadedsự kiện (chỉ chọn loadcho khả năng tương thích ngược ) nếu bạn chưa làm như vậy:

window.addEventListener("DOMContentLoaded", function () {
  var form = document.... // copy the last code block!
});

Cách dễ dàng, không đáng chê trách (câu trả lời trước đây)

Thêm onclickthuộc tính vào liên kết và một thuộc tính vào idbiểu mẫu:

<form id="form-id">

  <a href="#" onclick="document.getElementById('form-id').submit();"> submit </a>

</form>

Tất cả các cách

Dù bạn chọn cách nào thì formObject.submit()cuối cùng bạn cũng có lệnh gọi ( formObjectđối tượng DOM của <form>thẻ ở đâu).

Bạn cũng phải ràng buộc một trình xử lý sự kiện formObject.submit()như vậy, nó sẽ gọi, vì vậy nó sẽ được gọi khi người dùng nhấp vào một liên kết hoặc nút cụ thể. Có hai cách:

  • Khuyến nghị: Liên kết trình nghe sự kiện với đối tượng DOM.

    // 1. Acquire a reference to our <form>.
    //    This can also be done by setting <form name="blub">:
    //       var form = document.forms.blub;
    
    var form = document.getElementById("form-id");
    
    
    // 2. Get a reference to our preferred element (link/button, see below) and
    //    add an event listener for the "click" event.
    document.getElementById("your-id").addEventListener("click", function () {
      form.submit();
    });
  • Không nên: Chèn JavaScript nội tuyến. Có một số lý do tại sao kỹ thuật này không được khuyến khích. Một lập luận chính là bạn kết hợp đánh dấu (HTML) với tập lệnh (JS). Mã trở nên vô tổ chức và không thể hiểu được.

    <a href="#" onclick="document.getElementById('form-id').submit();">submit</a>
    
    <button onclick="document.getElementById('form-id').submit();">submit</button>

Bây giờ, chúng ta đã đến thời điểm mà bạn phải quyết định phần tử giao diện người dùng sẽ kích hoạt lệnh gọi submit ().

  1. Một nut bâm

    <button>submit</button>
  2. Đường dẫn

    <a href="#">submit</a>

Áp dụng các kỹ thuật đã nói ở trên để thêm trình nghe sự kiện.


Tôi đã muốn áp dụng điều này nhưng nó có vẻ không hiệu quả với phía tôi. Đây là một trò đùa, jsfiddle.net/rbhr9wt2
user1149244

@ user1149244 Trong ngăn JavaScript trên jsFiddle, nhấp vào "JavaScript" và sau đó đặt "Loại tải" thành "Không bọc - trong <body>" (hoặc <head>). Theo mặc định, nó được đặt thành "onLoad", sau đó DOMContentReady không kích hoạt nữa.
ComFreek

3
Lưu ý: Nếu biểu mẫu của bạn có một nút với attr name="submit", thì submit()phương thức của biểu mẫu của bạn sẽ không thể truy cập được.
2540625

Tại sao phương pháp onclick không được khuyến khích?
nu everest

@nueverest An <input type="submit">có nhiều ý nghĩa ngữ nghĩa hơn là, nói <a href="#" onclick="...">,. Điều này đặc biệt quan trọng đối với trình đọc màn hình. Nếu bạn phải sử dụng cái sau, tôi khuyên bạn nên sử dụng ARIA .
ComFreek

65

Nếu bạn sử dụng jQuery và cần một giải pháp nội tuyến, điều này sẽ hoạt động rất tốt;

<a href="#" onclick="$(this).closest('form').submit();">submit form</a>

Ngoài ra, bạn có thể muốn thay thế

<a href="#">text</a>

với

<a href="javascript:void(0);">text</a>

vì vậy người dùng không cuộn lên đầu trang của bạn khi nhấp vào liên kết.


1
Tôi tin rằng sẽ thích hợp hơn nếu viết dưới dạng <span> văn bản </span>. Nó không phải là một liên kết và href: javascript không tốt. (sẽ sớm trở nên tồi tệ với những lý do bảo mật tiếp theo ... javascript nội dòng sẽ bị cấm vào một ngày nào đó.
Milche Patern

Tôi đồng ý. Đánh giá bản chất của câu hỏi, tôi đã đi tìm câu trả lời đơn giản. Những gì cá nhân tôi làm là sử dụng href="#"và sau đó chọn tất cả các liên kết đó bằng jquery và gọi e.preventDefault()trong clicktrình xử lý sự kiện để trình duyệt không cuộn.
Maurice

3
Cá nhân tôi thích câu trả lời này hơn. Đơn giản, gọn gàng và dễ thực hiện nếu trang của bạn đang sử dụng JQuery. Rất linh hoạt, vì tôi có một trang với nhiều biểu mẫu trên đó và nó hoạt động hoàn hảo.
John Contarino

Người ta có thể sử dụng href = "#" nếu người ta thêm vào cuối lệnh gọi javascript onClick "return false"
Lumis

23

Bạn có thể cung cấp cho biểu mẫu và liên kết một số id và sau đó đăng ký onclicksự kiện của liên kết và submitbiểu mẫu:

<form id="myform" action="" method="POST">
    <a href="#" id="mylink"> submit </a>
</form>

và sau đó:

window.onload = function() {
    document.getElementById('mylink').onclick = function() {
        document.getElementById('myform').submit();
        return false;
    };
};

Tôi khuyên bạn nên sử dụng nút gửi để gửi biểu mẫu vì nó tôn trọng ngữ nghĩa đánh dấu và nó sẽ hoạt động ngay cả với những người dùng bị vô hiệu hóa javascript.


4

HTML & CSS - Không có giải pháp Javascript

Làm cho nút của bạn xuất hiện giống như một liên kết Bootstrap

HTML:

<form>
    <button class="btn-link">Submit</button>
</form>

CSS:

.btn-link {

    background: none;
    border: none;
    padding: 0px;
    color: #3097D1;
    font: inherit;

}

.btn-link:hover {

    color: #216a94;
    text-decoration: underline;

}

Tuyệt vời, tại sao lại làm cho nó phức tạp trong khi nó có thể đơn giản. Tuy nhiên, tôi nghĩ rằng nó trông sẽ tốt hơn nếu bạn cũng thêm "cursor: pointer;" trong lớp di chuột, do đó con trỏ biến thành bàn tay.
Lumis

3

điều này hoạt động tốt mà không cần bất kỳ chức năng đặc biệt nào. Viết với php cũng dễ dàng hơn nhiều.<input onclick="this.form.submit()"/>


OP đã nêu bằng cách nhấp vào liên kết không phải phần tử đầu vào.
Rahil Wazir

Có thể làm việc này bằng cách thực hiện một cái gì đó giống như<input onclick="this.form.submit()"> Some Text</input>
CodyBugstein

2
<form id="mailajob" method="post" action="emailthijob.php">
    <input type="hidden" name="action" value="emailjob" />
    <input type="hidden" name="jid" value="<?php echo $jobid; ?>" />
</form>

<a class="emailjob" onclick="document.getElementById('mailajob').submit();">Email this job</a>

3
Bạn có thể giải thích câu trả lời của bạn thực sự trả lời câu hỏi như thế nào không? Vui lòng thêm ngữ cảnh vào nó.

1
document.getElementById("theForm").submit();

Nó hoạt động hoàn hảo trong trường hợp của tôi.

bạn cũng có thể sử dụng nó trong chức năng như,

function submitForm()
{
     document.getElementById("theForm").submit();
} 

Đặt "theForm" làm ID biểu mẫu của bạn. Xong rôi.


0

đây là giải pháp tốt nhất cho câu hỏi của bạn: bên trong biểu mẫu, bạn có mã sau:

<li><a href="#">Singup</a></li>
<button type="submit" id="haha"></button>

trong tệp CSS, hãy làm như sau:

button{
  display: none;
}

trong JS, bạn làm điều này:

$("a").click(function(){
   $("button").trigger("click");
})

Của bạn đây.

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.