Nhiều nút gửi trong một biểu mẫu HTML


263

Giả sử bạn tạo một trình hướng dẫn ở dạng HTML. Một nút quay lại, và một nút đi về phía trước. Vì nút quay lại xuất hiện đầu tiên trong đánh dấu khi bạn nhấn Enter, nên nó sẽ sử dụng nút đó để gửi biểu mẫu.

Thí dụ:

<form>
  <!-- Put your cursor in this field and press Enter -->
  <input type="text" name="field1" />

  <!-- This is the button that will submit -->
  <input type="submit" name="prev" value="Previous Page" />

  <!-- But this is the button that I WANT to submit -->
  <input type="submit" name="next" value="Next Page" />
</form>

Tôi muốn nhận quyết định nút nào được sử dụng để gửi biểu mẫu khi người dùng nhấn Enter. Bằng cách đó, khi bạn nhấn Entertrình hướng dẫn sẽ chuyển sang trang tiếp theo, không phải trang trước. Bạn có phải sử dụng tabindexđể làm điều này?

Câu trả lời:


142

Tôi hi vọng cái này giúp được. Tôi chỉ đang thực hiện thủ thuật floating các nút bên phải.

Bằng cách này, Prevnút bên trái của Nextnút, nhưng Nextxuất hiện đầu tiên trong cấu trúc HTML:

.f {
  float: right;
}
.clr {
  clear: both;
}
<form action="action" method="get">
  <input type="text" name="abc">
  <div id="buttons">
    <input type="submit" class="f" name="next" value="Next">
    <input type="submit" class="f" name="prev" value="Prev">
    <div class="clr"></div><!-- This div prevents later elements from floating with the buttons. Keeps them 'inside' div#buttons -->
  </div>
</form>

Lợi ích so với các đề xuất khác: không có mã JavaScript, có thể truy cập và cả hai nút vẫn còn type="submit".


23
Vui lòng không làm điều này mà không thay đổi thứ tự tab, để nhấn nút tab sẽ quay vòng qua các nút khi chúng xuất hiện trên màn hình.
Steve

61

Thay đổi loại nút trước thành một nút như thế này:

<input type="button" name="prev" value="Previous Page" />

Bây giờ nút Tiếp theo sẽ là mặc định, ngoài ra bạn cũng có thể thêm defaultthuộc tính vào nó để trình duyệt của bạn sẽ làm nổi bật nó như sau:

<input type="submit" name="next" value="Next Page" default />

39
Bạn defaultđang nói về thuộc tính nào? Không có thuộc tính "mặc định", sẽ hợp lệ: w3.org/html/wg/dcraft/html/master/, (không có trong HTML5, HTML 4.01 Chuyển tiếp / Nghiêm, XHTML 1.0 Strict). Và tôi không thấy lý do tại sao thay đổi kiểu đầu vào từ submitđể buttonsẽ tốt hơn. Bạn có thể có nhiều yếu tố đầu vào kiểu gửi trong một hình thức mà không có vấn đề. Tôi thực sự không hiểu tại sao câu trả lời này lại được đánh giá cao như vậy.
Sk8erPeter

3
Có đầu vào kiểu "nút" không thực hiện hành động biểu mẫu. Bạn có thể có một onclick hoặc một cái gì đó, do đó thực thi một chức năng khác ngoài hành động biểu mẫu "mặc định" (được thực thi bằng cách nhấn nút "gửi" -type). Đó là những gì tôi đang tìm kiếm và đó là lý do tại sao tôi nâng cao nó. Không thể nói cho thuộc tính "mặc định", mặc dù không phải là một phần của vấn đề của tôi;) cảm ơn bạn đã làm rõ.
Jonas

2
@ Sk8erPeter, @Jonas .... hmm .. Tôi nghi ngờ defaultthuộc tính này là thuộc tính Toàn cầu; thuộc tính liệt kê .. có liên quan đến trạng thái liệt kê: w3.org/html/wg/dcraft/html/master/ ,. ngoài điểm đó .. khía cạnh nút của câu trả lời này không phải là câu trả lời .. đó là ' gợi ý có điều kiện ' hoặc truy vấn ( chính câu hỏi ).
Brett Caswell

3
@Jonas: có, type="button"không gửi biểu mẫu, type="submit"nhưng thay đổi loại nút này chắc chắn không phải là giải pháp, vì về cơ bản các nút này sẽ hoạt động theo cùng một cách - câu hỏi của OP là làm thế nào để tạo nút "Tiếp theo" mặc định để nhấn phím Enter. Và có một giải pháp khả thi trong câu trả lời được chấp nhận.
Sk8erPeter 8/2/2015

4
@BrettCaswell: thay đổi loại nút này là một cách giải quyết không tốt (xem nhận xét trước đây của tôi). Không có defaultthuộc tính hợp lệ cho inputcác thẻ (như tôi đã nói trước đó) trong HTML và các trình duyệt (phổ biến) sẽ KHÔNG làm nổi bật nút có thuộc tính này, điều đó có nghĩa là không có triển khai phi tiêu chuẩn của thuộc tính này - vì vậy tôi vẫn không biết những gì @Wally Lawless đã nói, và tại sao câu trả lời này được đánh giá quá cao. Chỉ có một defaultthuộc tính hợp lệ được giới thiệu trong HTML5, NHƯNG chỉ dành cho <track>thẻ: developer.mozilla.org/en-US/docs/Web/HTML/Euity/track
Sk8erPeter 8/215

56

Đặt các nút gửi của bạn cùng tên như thế này:

<input type="submit" name="submitButton" value="Previous Page" />
<input type="submit" name="submitButton" value="Next Page" />

Khi người dùng nhấn Enteryêu cầu đến máy chủ, bạn có thể kiểm tra giá trị submitButtontrên mã phía máy chủ của bạn có chứa một tập hợp các name/valuecặp biểu mẫu . Ví dụ: trong ASP Classic :

If Request.Form("submitButton") = "Previous Page" Then
    ' Code for the previous page
ElseIf Request.Form("submitButton") = "Next Page" Then
    ' Code for the next page
End If

Tham khảo: Sử dụng nhiều nút gửi trên một biểu mẫu


26
Đây không phải là những gì người dùng yêu cầu. Người dùng muốn biết cách kiểm soát nút gửi trong biểu mẫu được kích hoạt khi nhấn Enter. đó là nút mặc định.
kosoant

20
không hoạt động trong ứng dụng I18n mà bạn thậm chí không biết nhãn của nút.
Chris

Trong hệ thống hoặc giải pháp công nghệ nào, bản thân máy chủ sẽ không biết nhãn được sử dụng cho nút tiếp theo và quay lại là gì? Không phải máy chủ đã tạo nút tiếp theo và quay lại ở vị trí đầu tiên sao? (Nếu việc bản địa hóa được xử lý ở phía máy khách, tôi tưởng tượng máy chủ có thể không biết, nhưng tôi chưa bao giờ nghe về điều này cho HTML)
Jacob

Câu trả lời này hoàn toàn bỏ lỡ câu hỏi, có khả năng nó là cho một câu hỏi khác. Tại sao rất nhiều upvote ??? Chưa kể rằng người ta không bao giờ nên kiểm tra nhãn của nút ... gọi cho rất nhiều rắc rối. Ngay cả trường hợp đơn giản: "chúng ta nên viết tắt chuỗi thành 'Trang trước'" sẽ làm hỏng chức năng trang web của bạn.
Tylla

30

Nếu thực tế là nút đầu tiên được sử dụng theo mặc định là nhất quán trên các trình duyệt, hãy đặt chúng đúng cách trong mã nguồn, sau đó sử dụng CSS để chuyển đổi vị trí rõ ràng của chúng.

float họ trái và phải để chuyển đổi chúng một cách trực quan, ví dụ.


18

Đôi khi giải pháp được cung cấp bởi @palotasb là không đủ. Có những trường hợp sử dụng, ví dụ nút gửi "Bộ lọc" được đặt phía trên các nút như "Tiếp theo và Trước đó". Tôi đã tìm thấy một cách giải quyết cho vấn đề này: sao chép nút gửi cần đóng vai trò là nút gửi mặc định trong một div ẩn và đặt nó bên trong biểu mẫu bên trên bất kỳ nút gửi nào khác. Về mặt kỹ thuật, nó sẽ được gửi bằng một nút khác khi nhấn Enter so với khi nhấp vào nút Tiếp theo hiển thị. Nhưng vì tên và giá trị là như nhau, kết quả không có sự khác biệt.

<html>
<head>
    <style>
        div.defaultsubmitbutton {
            display: none;
        }
    </style>
</head>
<body>
    <form action="action" method="get">
        <div class="defaultsubmitbutton">
            <input type="submit" name="next" value="Next">
        </div>
        <p><input type="text" name="filter"><input type="submit" value="Filter"></p>
        <p>Filtered results</p>
        <input type="radio" name="choice" value="1">Filtered result 1
        <input type="radio" name="choice" value="2">Filtered result 2
        <input type="radio" name="choice" value="3">Filtered result 3
        <div>                
            <input type="submit" name="prev" value="Prev">
            <input type="submit" name="next" value="Next">
        </div>
    </form>
</body>
</html>

17

Tôi sẽ sử dụng JavaScript để gửi biểu mẫu. Hàm sẽ được kích hoạt bởi sự kiện OnKeyPress của phần tử biểu mẫu và sẽ phát hiện xemEnter khóa có được chọn hay không. Nếu đây là trường hợp, nó sẽ gửi mẫu.

Đây là hai trang cung cấp các kỹ thuật về cách thực hiện việc này: 1 , 2 . Dựa trên những điều này, đây là một ví dụ về việc sử dụng (dựa trên đây ):

<SCRIPT TYPE="text/javascript">//<!--
function submitenter(myfield,e) {
  var keycode;
  if (window.event) {
    keycode = window.event.keyCode;
  } else if (e) {
    keycode = e.which;
  } else {
    return true;
  }

  if (keycode == 13) {
    myfield.form.submit();
    return false;
  } else {
    return true;
  }
}
//--></SCRIPT>

<INPUT NAME="MyText" TYPE="Text" onKeyPress="return submitenter(this,event)" />

2
Điều gì xảy ra nếu javascript bị vô hiệu hóa?
Jon Winstanley

2
Bạn không nên sử dụng <! - và -> để nhận xét về JS, các thẻ này không phải là mã thông báo ngôn ngữ Javascript
Marecky

2
@Marecky Họ không bình luận về JS. Chúng bị bỏ qua khi phân tích nội dung của <script> trong trình duyệt hỗ trợ <script>. Hôm nay họ thực sự không cần thiết. Nhưng trong các trình duyệt rất cổ xưa, đây là một hack tương thích để tránh tập lệnh được in dưới dạng văn bản thuần túy.
leeme

17

Nếu bạn thực sự chỉ muốn nó hoạt động như một hộp thoại cài đặt, chỉ cần tập trung vào nút "Tiếp theo" OnLoad.

Theo cách đó, nếu người dùng nhấn Return, biểu mẫu sẽ được gửi và đi tiếp. Nếu họ muốn quay lại, họ có thể nhấn Tabhoặc nhấp vào nút.


2
Chúng có nghĩa là ai đó điền vào biểu mẫu và truy cập trở lại khi ở trong trường văn bản.
Jordan Reiter

17

Điều này không thể được thực hiện với HTML thuần túy. Bạn phải dựa vào JavaScript cho thủ thuật này.

Tuy nhiên, nếu bạn đặt hai biểu mẫu trên trang HTML, bạn có thể thực hiện việc này.

Form1 sẽ có nút trước đó.

Form2 sẽ có bất kỳ đầu vào người dùng + nút tiếp theo.

Khi người dùng nhấn Entervào Form2, nút gửi tiếp theo sẽ kích hoạt.


16

Bạn có thể làm điều đó với CSS.

Đặt các nút trong đánh dấu bằng Nextnút trước, sau đó chọnPrev nút sau.

Sau đó sử dụng CSS để định vị chúng để xuất hiện theo cách bạn muốn.


14

Điều này hoạt động mà không có JavaScript hoặc CSS trong hầu hết các trình duyệt:

<form>
    <p><input type="text" name="field1" /></p>
    <p><a href="previous.html">
    <button type="button">Previous Page</button></a>
    <button type="submit">Next Page</button></p>
</form>

Firefox, Opera, Safari và Google Chrome đều hoạt động.
Như mọi khi, Internet Explorer là vấn đề.

Phiên bản này hoạt động khi JavaScript được bật:

<form>
    <p><input type="text" name="field1" /></p>
    <p><a href="previous.html">
    <button type="button" onclick="window.location='previous.html'">Previous Page</button></a>
    <button type="submit">Next Page</button></p>
</form>

Vì vậy, lỗ hổng trong giải pháp này là:

Trang trước không hoạt động nếu bạn sử dụng Internet Explorer khi tắt JavaScript.

Tâm trí bạn, nút quay lại vẫn hoạt động!


1
Nếu không có javascript, bạn sẽ không thể kích hoạt nút "trang trước", vì loại = "nút"!
risop

Vấn đề với đề xuất của bạn là một loại nút = "nút" sẽ không đăng biểu mẫu, vì vậy về cơ bản, nó không làm gì cả, trong khi phiên bản thứ hai có neo sẽ tạo ra một GET thay vì POST.
Tylla

12

Nếu bạn có nhiều nút hoạt động trên một trang thì bạn có thể làm một cái gì đó như thế này:

Đánh dấu nút đầu tiên bạn muốn kích hoạt trên Enterphím nhấn là nút mặc định trên biểu mẫu. Đối với nút thứ hai, liên kết nó với Backspacenút trên bàn phím. Mã sự Backspacekiện là 8.

$(document).on("keydown", function(event) {
  if (event.which.toString() == "8") {
    var findActiveElementsClosestForm = $(document.activeElement).closest("form");

    if (findActiveElementsClosestForm && findActiveElementsClosestForm.length) {
      $("form#" + findActiveElementsClosestForm[0].id + " .secondary_button").trigger("click");
    }
  }
});
<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.2.1.min.js"></script>

<form action="action" method="get" defaultbutton="TriggerOnEnter">
  <input type="submit" id="PreviousButton" name="prev" value="Prev" class="secondary_button" />
  <input type="submit" id='TriggerOnEnter' name="next" value="Next" class="primary_button" />
</form>


11

Thay đổi thứ tự tab nên là tất cả những gì cần thiết để thực hiện điều này. Giữ cho nó đơn giản.

Một tùy chọn đơn giản khác là đặt nút quay lại sau nút gửi trong mã HTML nhưng thả nó sang bên trái để nó xuất hiện trên trang trước nút gửi.


10
<input type="submit" name="perv" value="Previous Page"> 
<input type="submit" name="prev" value="Next Page"> 

Giữ tên của tất cả các nút gửi giống nhau - "trước".

Sự khác biệt duy nhất là value thuộc tính với các giá trị duy nhất. Khi chúng ta tạo tập lệnh, các giá trị duy nhất này sẽ giúp chúng ta tìm ra nút nào được gửi.

Và viết mã sau đây:

    btnID = ""
if Request.Form("prev") = "Previous Page" then
    btnID = "1"
else if Request.Form("prev") = "Next Page" then
    btnID = "2"
end if

Vấn đề là việc nhấn enter trên trường văn bản sẽ gửi biểu mẫu bằng nút gửi đầu tiên, không phải với mục đích dự định (ví dụ thứ hai trong ví dụ). Tìm ra nút gửi nào được sử dụng để gửi biểu mẫu thật dễ dàng và đó không phải là câu hỏi!
risop

Tại sao name="perv"?
Peter Mortensen

10

Một tùy chọn đơn giản khác là đặt nút quay lại sau nút gửi trong mã HTML, nhưng thả nó sang bên trái, để nó xuất hiện trên trang trước nút gửi.

Thay đổi thứ tự tab nên là tất cả những gì cần thiết để thực hiện điều này. Giữ cho nó đơn giản.


10

Lần đầu tiên tôi nghĩ ra điều này, tôi đã nghĩ ra một hack onclick () / JavaScript khi các lựa chọn không phổ biến / tiếp theo mà tôi vẫn thích vì sự đơn giản của nó. Nó như thế này:

@model myApp.Models.myModel

<script type="text/javascript">
    function doOperation(op) {
        document.getElementById("OperationId").innerText = op;
        // you could also use Ajax to reference the element.
    }
</script>

<form>
  <input type="text" id = "TextFieldId" name="TextField" value="" />
  <input type="hidden" id="OperationId" name="Operation" value="" />
  <input type="submit" name="write" value="Write" onclick='doOperation("Write")'/>
  <input type="submit" name="read" value="Read" onclick='doOperation("Read")'/>
</form>

Khi nhấp vào nút gửi, nó sẽ lưu hoạt động mong muốn trong trường ẩn (là trường chuỗi có trong mô hình mà biểu mẫu được liên kết) và gửi biểu mẫu cho Trình điều khiển, tất cả quyết định. Trong Trình điều khiển, bạn chỉ cần viết:

// Do operation according to which submit button was clicked
// based on the contents of the hidden Operation field.
if (myModel.Operation == "Read")
{
     // Do read logic
}
else if (myModel.Operation == "Write")
{
     // Do write logic
}
else
{
     // Do error logic
}

Bạn cũng có thể thắt chặt điều này một chút bằng cách sử dụng mã thao tác số để tránh phân tích chuỗi, nhưng trừ khi bạn chơi với bảng liệt kê, mã này ít đọc, có thể sửa đổi và tự viết tài liệu và phân tích cú pháp là không đáng kể.


9

Từ https://html.spec.whatwg.org/multipage/forms.html#implicit-submission

Nút mặc định của thành phần biểu mẫu là nút gửi đầu tiên theo thứ tự cây có chủ sở hữu biểu mẫu là thành phần biểu mẫu đó.

Nếu tác nhân người dùng hỗ trợ cho phép người dùng gửi biểu mẫu hoàn toàn (ví dụ: trên một số nền tảng nhấn phím "enter" trong khi trường văn bản được tập trung hoàn toàn gửi biểu mẫu) ...

Có đầu vào tiếp theo là type = "submit" và thay đổi đầu vào trước đó thành type = "nút" sẽ cho hành vi mặc định mong muốn.

<form>
   <input type="text" name="field1" /> <!-- put your cursor in this field and press Enter -->

   <input type="button" name="prev" value="Previous Page" /> <!-- This is the button that will submit -->
   <input type="submit" name="next" value="Next Page" /> <!-- But this is the button that I WANT to submit -->
</form>

9

Đây là những gì tôi đã thử:

  1. Bạn cần chắc chắn rằng bạn đặt cho các nút của bạn các tên khác nhau
  2. Viết một iftuyên bố sẽ thực hiện hành động cần thiết nếu một trong hai nút được nhấp.

 

<form>
    <input type="text" name="field1" /> <!-- Put your cursor in this field and press Enter -->

    <input type="submit" name="prev" value="Previous Page" /> <!-- This is the button that will submit -->
    <input type="submit" name="next" value="Next Page" /> <!-- But this is the button that I WANT to submit -->
</form>

Trong PHP,

if(isset($_POST['prev']))
{
    header("Location: previous.html");
    die();
}

if(isset($_POST['next']))
{
    header("Location: next.html");
    die();
}

Vấn đề là việc nhấn enter trên trường văn bản sẽ gửi biểu mẫu bằng nút gửi đầu tiên, không phải với mục đích dự định (ví dụ thứ hai trong ví dụ). Tìm ra nút gửi nào được sử dụng để gửi biểu mẫu thật dễ dàng và đó không phải là câu hỏi!
risop

7

Tôi đã gặp câu hỏi này khi cố gắng tìm một câu trả lời về cơ bản giống như vậy, chỉ với các điều khiển ASP.NET, khi tôi phát hiện ra rằng nút ASP có một thuộc tính được gọi là UseSubmitBehaviorcho phép bạn đặt cái nào thực hiện việc gửi.

<asp:Button runat="server" ID="SumbitButton" UseSubmitBehavior="False" Text="Submit" />

Chỉ trong trường hợp ai đó đang tìm kiếm nút ASP.NET để làm điều đó.


6

Với JavaScript (ở đây là jQuery), bạn có thể tắt nút trước khi gửi biểu mẫu.

$('form').on('keypress', function(event) {
    if (event.which == 13) {
        $('input[name="prev"]').prop('type', 'button');
    }
});

1

Thử cái này..!

<form>
  <input type="text" name="Name" />
  <!-- Enter the value -->

  <input type="button" name="prev" value="Previous Page" />
  <!-- This is the button that will submit -->
  <input type="submit" name="next" value="Next Page" />
  <!-- But this is the button that I WANT to submit -->
</form>


1

Tôi đã giải quyết một vấn đề rất giống theo cách này:

  1. Nếu JavaScript được bật (trong hầu hết các trường hợp hiện nay) thì tất cả các nút gửi được " xuống cấp " thành các nút khi tải trang thông qua JavaScript (jQuery). Nhấp vào các sự kiện trên nút " xuống cấp " cũng được xử lý thông qua JavaScript.

  2. Nếu JavaScript không được bật thì biểu mẫu sẽ được cung cấp cho trình duyệt với nhiều nút gửi. Trong trường hợp này, nhấn Entervào textfieldbên trong biểu mẫu sẽ gửi biểu mẫu bằng nút đầu tiên thay vì mặc định dự định , nhưng ít nhất biểu mẫu vẫn có thể sử dụng được: bạn có thể gửi bằng cả hai nút trước và nút tiếp theo .

Ví dụ làm việc:

<html>
    <head>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    </head>

    <body>
        <form action="http://httpbin.org/post" method="post">
            If JavaScript  is disabled, then you CAN submit the form
            with button1, button2 or button3.

            If you press enter on a text field, then the form is
            submitted with the first submit button.

            If JavaScript is enabled, then the submit typed buttons
            without the 'defaultSubmitButton' style are converted
            to button typed buttons.

            If you press Enter on a text field, then the form is
            submitted with the only submit button
            (the one with class defaultSubmitButton)

            If you click on any other button in the form, then the
            form is submitted with that button's value.

            <br />

            <input type="text" name="text1" ></input>
            <button type="submit" name="action" value="button1" >button 1</button>
            <br />

            <input type="text" name="text2" ></input>
            <button type="submit" name="action" value="button2" >button 2</button>
            <br />

            <input type="text" name="text3" ></input>
            <button class="defaultSubmitButton" type="submit" name="action" value="button3" >default button</button>
        </form>

        <script>
            $(document).ready(function(){

                /* Change submit typed buttons without the 'defaultSubmitButton'
                   style to button typed buttons */
                $('form button[type=submit]').not('.defaultSubmitButton').each(function(){
                    $(this).attr('type', 'button');
                });

                /* Clicking on button typed buttons results in:
                   1. Setting the form's submit button's value to
                      the clicked button's value,
                   2. Clicking on the form's submit button */
                $('form button[type=button]').click(function( event ){
                    var form = event.target.closest('form');
                    var submit = $("button[type='submit']",form).first();
                    submit.val(event.target.value);
                    submit.click();
                });
            });
        </script>
    </body>
</html>


0

Bạn có thể sử dụng Tabindexđể giải quyết vấn đề này. Ngoài ra thay đổi thứ tự của các nút sẽ là một cách hiệu quả hơn để đạt được điều này.

Thay đổi thứ tự của các nút và thêm floatgiá trị để gán cho chúng vị trí mong muốn bạn muốn hiển thị trong HTMLchế độ xem của mình .


-4

Sử dụng ví dụ bạn đã đưa ra:

<form>
    <input type="text" name="field1" /><!-- Put your cursor in this field and press Enter -->
    <input type="submit" name="prev" value="Previous Page" /> <!-- This is the button that will submit -->
    <input type="submit" name="next" value="Next Page" /> <!-- But this is the button that I WANT to submit -->
</form>

Nếu bạn nhấp vào "Trang trước", chỉ có giá trị của "trước" sẽ được gửi. Nếu bạn nhấp vào "Trang tiếp theo", giá trị của "tiếp theo" sẽ được gửi.

Tuy nhiên, nếu bạn nhấn Entervào đâu đó trên biểu mẫu, không phải "trước" hay "tiếp theo" sẽ được gửi.

Vì vậy, sử dụng mã giả bạn có thể làm như sau:

If "prev" submitted then
    Previous Page was click
Else If "next" submitted then
    Next Page was click
Else
    No button was click

1
Không bao giờ có tình huống (không sử dụng js) khi không có nút nào được kích hoạt. Nếu bạn nhấn ENTER, nút đầu tiên trong mã sẽ bắt sự kiện. Trong ví dụ html, nó là nút trước.
SimonSimCity
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.