Tôi có thể lồng một phần tử <button> bên trong <a> bằng HTML5 không?


145

Tôi đang làm như sau:

 <a href="www.stackoverflow.com">
   <button disabled="disabled" >ABC</button>
 </a>  

Điều này hoạt động tốt nhưng tôi gặp lỗi xác thực HTML5 có nội dung "Nút phần tử" không được lồng trong phần tử "một nút".

Bất cứ ai có thể cho tôi lời khuyên về những gì tôi nên làm?


8
Trình xác nhận đã trả lời câu hỏi của bạn cho bạn và thậm chí cho bạn biết lý do tại sao nó không hợp lệ trong thông báo lỗi đó.
Mã vô dụng

1
Nhưng có một sự thay thế nếu tôi muốn Google có thể xem đó là một liên kết. Như một ví dụ về việc sử dụng nút, tôi có các nút gọi là "<<" và ">>" cho bản ghi tiếp theo và bản ghi trước. Tôi tin rằng đây phải là các nút nhưng chức năng là chúng liên kết đến các trang mới.
Marie

3
Câu hỏi của tôi là CÓ vấn đề..nếu bạn thực hiện điều này ngoại lệ xứng đáng.
Muhammad Umer

1
Nếu tôi đặt <button> <a href="dsada.html"> Kiểm tra </a> </ button> thì nó không hoạt động trên Internet Explorer 11 hoặc Firefox.
dutraveller

Câu trả lời:


231

Không , nó không hợp lệ HTML5 theo Tài liệu Spec HTML5 từ W3C :

Mô hình nội dung: Minh bạch , nhưng không được có hậu duệ nội dung tương tác .

Phần tử có thể được bao quanh toàn bộ đoạn văn, danh sách, bảng, v.v., thậm chí toàn bộ các phần, miễn là không có nội dung tương tác trong (ví dụ: các nút hoặc các liên kết khác).

Nói cách khác, bạn có thể lồng bất kỳ phần tử nào bên trong <a>ngoại trừ các phần sau:

  • <a>

  • <audio>(nếu thuộc tính điều khiển có mặt)

  • <button>

  • <details>

  • <embed>

  • <iframe>

  • <img>(nếu thuộc tính usemap có mặt)

  • <input>(nếu thuộc tính type không ở trạng thái ẩn )

  • <keygen>

  • <label>

  • <menu>(nếu thuộc tính type ở trạng thái thanh công cụ )

  • <object>(nếu thuộc tính usemap có mặt)

  • <select>

  • <textarea>

  • <video>(nếu thuộc tính điều khiển có mặt)


Nếu bạn đang cố gắng có một nút liên kết đến một nơi nào đó, hãy bọc nút đó bên trong một <form>thẻ như sau:

<form style="display: inline" action="http://example.com/" method="get">
  <button>Visit Website</button>
</form>

Tuy nhiên, nếu <button>thẻ của bạn được tạo kiểu bằng CSS và không giống như tiện ích của hệ thống ... Hãy tạo cho mình một ưu tiên, tạo một lớp mới cho <a>thẻ của bạn và tạo kiểu giống như vậy.


1
@Andrew Moore - Có cách nào khác không. Tôi tin rằng điều này đã gây ra sự cố và đó là lý do tại sao nó được thay đổi bên trong liên kết <a>. Không chắc vấn đề là gì nhưng chúng tôi có nhiều nút như thế này trên một trang. Có thể đó là vì chúng tôi muốn cải thiện SEO bằng cách sử dụng các liên kết <a>.
Marie

2
@Marie: Không có cách nào khác ngoài việc tạo kiểu cho các liên kết của bạn trông giống như các nút.
Andrew Moore

3
user25 không tốt hơn là sử dụng phương thức = "bài đăng" vì trình duyệt yêu cầu gửi lại biểu mẫu bài đăng khi điều hướng qua lại. Vì GET là phương thức mặc định của biểu mẫu, người ta có thể bỏ phương thức = "get" để lấy ngắn gọn.
Bijan

4
@AndrewMoore: tạo kiểu cho một liên kết để trông giống như một nút tạo ra các vấn đề của riêng nó, chẳng hạn như về khả năng truy cập. Một nút sẽ thực thi khi nó có tiêu điểm và bạn nhấn phím cách. Một liên kết không. Nếu bạn quan tâm đến ADA (hoặc được yêu cầu giả vờ quan tâm) thì điều này có thể cắn bạn.
iconoclast

2
Như @jonaspas đã đề xuất, một <div>bên trong an <a>hoàn toàn hợp lệ trong HTML5: validator.w3.org/nu/iêu
Socob

43

Nếu bạn đang sử dụng Bootstrap 3 , điều này hoạt động khá tốt

<a href="#" class="btn btn-primary btn-lg active" role="button">Primary link</a>
<a href="#" class="btn btn-default btn-lg active" role="button">Link</a>

không hoạt động tốt với biểu tượng nút tròn tuyệt vời bên trong
Bộ công cụ

Sử dụng class = 'btn btn-default' khớp với các nút khác (MVC6).
crokusek

12

Không.

Giải pháp sau đây dựa vào JavaScript.

<button type="button" onclick="location.href='http://www.stackoverflow.com'">ABC</button>

Nếu nút là để được đặt bên trong một hiện <form>với method="post", sau đó đảm bảo nút có thuộc tính type="button"nếu không thì nút sẽ đệ trình các hoạt động POST. Theo cách này, bạn có thể có một <form>nút chứa hỗn hợp các nút thao tác GET và POST.


onclick sẽ không hoạt động trên giao thức tập tin, vì vậy nó không hữu ích cho việc trình bày tĩnh, ví dụ. trong trường hợp này hình thức hành động propety là cách để đi.
netalex

1
Nếu nút được liên kết đến một trang, thì đó không phải là nút, đó là mỏ neo
Capsule

@Capsule nó rất phổ biến để xem những ngày này. Chỉ cần nhìn vào trang đích cho mọi khung phát triển web đang tồn tại. Tôi thường chỉ tranh luận về chủ nghĩa thuần túy, nhưng ngay cả tôi cũng phải thừa nhận rằng một nút hình chữ nhật lớn có khả năng chi trả tốt hơn, rõ ràng hơn một liên kết, ngay cả khi nó liên kết đến một trang thay vì bắt đầu một hành động hình thức thực sự.
TheDudeAdides

Ngay bây giờ tôi có một <a>bên trong <button>(với cùng href) như một bản sao lưu nếu JS bị vô hiệu hóa, và sáu tháng kể từ bây giờ tôi chắc chắn sẽ bị xấu hổ mà tôi thừa nhận rằng.
TheDudeAdides

@TheDudeAdides Tôi không nói về khía cạnh của nó, tôi đang nói về đánh dấu bạn muốn sử dụng. Điều gì ngăn bạn tạo kiểu liên kết này như một nút hình chữ nhật lớn? Trừ khi trang web của bạn không sử dụng bất kỳ phong cách nào cả? btw câu trả lời ở trên câu chúng tôi đang bình luận là một ví dụ hoàn hảo về nó. Đó là một thẻ neo, được tạo kiểu như một nút.
Viên nang

10

Tôi vừa mới nhảy vào cùng một vấn đề và tôi đã giải quyết nó thay thế thẻ 'nút' thành thẻ 'span'. Trong trường hợp của tôi, tôi đang sử dụng bootstrap. Đây là cách nó trông như thế nào:

<a href="#register"> 
    <span class="btn btn-default btn-lg">
        Subscribe
    </span>
</a> 

4
Bạn không cần khoảng thời gian nào với bootstrap. Chỉ cần di chuyển toàn bộ phần lớp sang <a> và bạn sẽ có nút liên kết. ví dụ: <a href="#register" class="btn btn-default btn-lg"> Đăng ký </a>
Ryan Buddicom

Người đăng ban đầu hỏi liệu có thể đặt một nút bên trong thẻ neo không. Câu trả lời được chấp nhận lưu ý rằng nó đi ngược lại thông số kỹ thuật của W3C để đặt <a> bên trong <a>. Tôi nghĩ đó là lý do tại sao golbeltri thể hiện phong cách <span> như một nút.
StackOverflowUser

Điều này có ý nghĩa nếu có nội dung khác bên trong <a>, là một phần của liên kết, nhưng không được tạo kiểu như một nút. Ví dụ: bất kỳ nhấp chuột nào trong một div(hình ảnh, nền, văn bản, v.v.) đều đi đến một liên kết, nhưng chỉ spantrông giống như một nút.
Giô

7

Sẽ thực sự kỳ lạ nếu điều đó hợp lệ và tôi hy vọng nó không hợp lệ. Có nghĩa là gì khi có một yếu tố có thể nhấp bên trong một yếu tố có thể nhấp khác? Đó là cái gì - một nút, hoặc một liên kết?


Cảm ơn Steve. Đây là một phương pháp được đề xuất cho tôi bởi một nhân viên nhóm. Phương pháp không hoạt động. Có cách nào tốt hơn tôi có thể làm điều này?
Marie

1
@Marie Nếu bạn muốn làm cho một liên kết trông giống như một nút, thật dễ dàng sử dụng các kiểu CSS để làm cho nó trông giống như vậy. Thêm một kiểu viền tương tự như thế này : border: 2px outset. Nếu bạn muốn làm tròn các góc một chút, bạn cũng có thể sử dụng bán kính đường viền trên nó. Một <img>thẻ đơn giản cũng sẽ làm việc tốt.
Mã vô dụng

3

Một tùy chọn khác là sử dụng thuộc tính onclick của nút:

<button disabled="disabled" onClick="location.href='www.stackoverflow.com'" >ABC</button>

Điều này hoạt động, tuy nhiên, người dùng sẽ không thấy liên kết được hiển thị trên di chuột như họ sẽ làm nếu nó nằm trong phần tử.


2

Ngày nay, ngay cả khi thông số kỹ thuật không cho phép, nó "dường như" vẫn hoạt động để nhúng nút trong <a href...><button ...></a>thẻ, FWIW ...


2
Điều này hoạt động khi <button>không được chứa trong a <form>. Tuy nhiên, ngay sau khi nút được chứa (ví dụ <form>...<a><button>:) nút này sẽ ngừng hoạt động, trừ khi một nút vô hiệu hóa trình xử lý nhấp chuột của nút. Điều này là đủ điều hướng để đảm bảo tránh kịch bản này.
giám mục

0

Bạn có thể thêm một lớp vào nút và đặt một số tập lệnh chuyển hướng nó.

Tôi làm theo cách này:

<button class='buttonClass'>button name</button>

<script>
$(".buttonClass').click(function(){
window.location.href = "http://stackoverflow.com";
});
</script>

0

tại sao không..bạn cũng có thể nhúng hình ảnh vào nút

<FORM method = "POST" action = "https://stackoverflow.com"> 
    <button type="submit" name="Submit">
        <img src="img/Att_hack.png" alt="Text">
    </button>
</FORM> 

2
Vấn đề là <a> </a> khi OP hỏi lại có chút hạn chế về những gì nó cho phép nằm trong ranh giới của nó. Xem câu hỏi được chấp nhận ở đó.
Thomas


-1

HTML5 là bất hợp pháp khi nhúng một yếu tố nút bên trong một liên kết.

Tốt hơn để sử dụng CSS trên mặc định và: trạng thái hoạt động (đã nhấn):

body{background-color:#F0F0F0} /* JUST TO MAKE THE BORDER STAND OUT */
a.Button{padding:.1em .4em;color:#0000D0;background-color:#E0E0E0;font:normal 80% sans-serif;font-weight:700;border:2px #606060 solid;text-decoration:none}
a.Button:not(:active){border-left-color:#FFFFFF;border-top-color:#FFFFFF}
a.Button:active{border-right-color:#FFFFFF;border-bottom-color:#FFFFFF}
<p><a class="Button" href="www.stackoverflow.com">Click me<a>


-2

Tôi thử các giải pháp javascript của bạn, nhưng đối với công việc tôi cần chèn e.preventDefault();chức năng javascript của mình.

<!-- Add your HTML !-->
<a id="id_primary_link" href="my_primary_link.php">
  <button onclick="my_trick_function('my_secondary_link.php')">
</a>


<!-- Add your javascript function !-->
<script>
function my_trick_function(secondary_link){
    $('#id_primary_link').click(function(e) {
        e.preventDefault();
        window.location.replace(secondary_link);
    });
}   
</script>   

-3

Sử dụng thuộc tính định dạng bên trong nút

Tái bút Nó chỉ hoạt động nếu loại nút của bạn = "gửi"

<button type="submit" formaction="www.youraddress.com">Submit</button>

bạn cũng cần đặt nút trong thẻ <form>.
denodster

-3

<a href="index.html">
  <button type="button">Submit</button>
</a>
Hoặc bạn có thể sử dụng tập lệnh java trong nút như:

<button type="submit" onclick="myFunction()">Submit</button>
<script>
  function myFunction() {
      var w = window.open(file:///E:/Aditya%20panchal/index.html);
    }
</script>


Chỉ cần trở thành một số trình duyệt sẽ cho phép nó, không có nghĩa đó là một ý tưởng tốt.
denodster
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.