Могу ли я вложить элемент <button> в <a> с помощью HTML5?


153

Я делаю следующее:

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

Это работает хорошо, но я получаю сообщение об ошибке проверки HTML5, в котором говорится: «Элемент« кнопка »не должен быть вложен в элемент« кнопка ».

Может ли кто-нибудь дать мне совет, что мне делать?


8
Валидатор уже ответил на ваш вопрос и даже сказал вам, почему он недействителен в этом сообщении об ошибке.
Useless Code

1
Но есть ли альтернатива, если я хочу, чтобы Google мог видеть это как ссылку. В качестве примера использования кнопки у меня есть кнопки «<<» и «>>» для следующей и предыдущей записи. Я считаю, что это должны быть кнопки, но функциональность такова, что они ссылаются на новые страницы.
Мари

3
у меня вопрос, имеет ли это значение ... если вы сделаете это заслуженное исключение.
Мухаммад Умер

1
Если я поставлю <button> <a href="dsada.html"> Тест </a> </button>, он не будет работать в Internet Explorer 11 или Firefox.
dutraveller

Ответы:


239

Нет , это недопустимый HTML5 в соответствии со спецификацией HTML5 Spec Document от W3C :

Модель содержимого: прозрачная , но не должно быть потомков интерактивного содержимого .

Элемент a может быть обернут вокруг целых абзацев, списков, таблиц и так далее, даже целых разделов, если внутри нет интерактивного содержимого (например, кнопок или других ссылок).

Другими словами, вы можете вкладывать любые элементы внутрь, <a>кроме следующих:

  • <a>

  • <audio>(если присутствует атрибут controls )

  • <button>

  • <details>

  • <embed>

  • <iframe>

  • <img>(если присутствует атрибут usemap )

  • <input>(если атрибут типа не находится в скрытом состоянии)

  • <keygen>

  • <label>

  • <menu>(если атрибут типа находится в состоянии панели инструментов )

  • <object>(если присутствует атрибут usemap )

  • <select>

  • <textarea>

  • <video>(если присутствует атрибут controls )


Если вы пытаетесь создать кнопку, которая ссылается куда-нибудь, оберните эту кнопку внутри <form>тега как такового:

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

Однако, если ваш <button>тег оформлен с использованием CSS и не похож на виджет системы ... Сделайте себе одолжение, создайте новый класс для своего <a>тега и задайте ему такой же стиль.


1
@ Эндрю Мур - Есть другой способ. Я считаю, что это дало проблемы, и поэтому его изменили так, чтобы он находился внутри ссылки <a>. Не уверен, в чем проблема, но у нас на странице есть много таких кнопок. Возможно, это произошло потому, что мы хотели улучшить SEO с помощью ссылок <a>.
Мари

2
@Marie: Нет другого способа, кроме стилизации ваших ссылок, чтобы они выглядели как кнопки.
Эндрю Мур

3
user25 not - не лучше использовать method = "post", потому что браузер запрашивает повторную отправку формы сообщения при перемещении вперед и назад. Поскольку GET является методом формы по умолчанию, для краткости можно оставить method = "get".
Биджан

4
@AndrewMoore: оформление ссылки так, чтобы она выглядела как кнопка, создает собственный набор проблем, например, для доступности. Кнопка должна сработать, когда она находится в фокусе и вы нажимаете клавишу пробела. Ссылки нет. Если вам небезразлична ADA (или вы должны делать вид, что заботитесь), это может вас укусить.
иконоборчество

2
Как было предложено @jonaspas, <div>внутри <a>абсолютно справедливо в HTML5: validator.w3.org/nu/...
Socob

43

Если вы используете Bootstrap 3 , это работает довольно хорошо

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

не работает с круглой кнопкой, шрифт потрясающий значок внутри
Toolkit

Использование class = 'btn btn-default' соответствует другим кнопкам (MVC6).
crokusek

12

Я только что столкнулся с той же проблемой, и я решил ее, заменив тег «button» на тег «span». В моем случае я использую бутстрап. Вот как это выглядит:

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

5
Вам вообще не нужен диапазон с начальной загрузкой. Просто переместите часть класса в <a>, и у вас будет кнопка ссылки. например, <a href="#register" class="btn btn-default btn-lg"> Подписаться </a>
Райан Баддиком,

На оригинальном плакате спрашивалось, можно ли разместить кнопку внутри тега привязки. В принятом ответе отмечается, что размещение <a> внутри <a> противоречит спецификациям W3C. Думаю, именно поэтому golbeltri продемонстрировал стилизацию <span> как кнопки.
StackOverflowUser

Это имеет смысл, если внутри есть другой контент <a>, который является частью ссылки, но не оформлен как кнопка. Например, любой щелчок внутри div(изображения, фона, текста и т. Д.) Ведет к ссылке, но только spanкнопка выглядит как кнопка.
Иосия

12

Нет.

Следующее решение основано на JavaScript.

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

Если кнопка должна быть помещена внутри существующего <form>с method="post", тогда убедитесь, что кнопка имеет атрибут, type="button"иначе кнопка отправит операцию POST. Таким образом, вы можете получить, <form>который содержит сочетание кнопок операций GET и POST.


onclick не будет работать с файловым протоколом, поэтому, например, он бесполезен для статической презентации. В этом случае правильное решение - это форма действия.
netalex

1
Если кнопка связана со страницей, то это не кнопка, это якорь
Capsule

@Capsule в наши дни так часто можно увидеть. Просто посмотрите на целевую страницу всех существующих фреймворков для веб-разработки. Обычно я сторонник пуристического аргумента, но даже я должен признать, что большая прямоугольная кнопка имеет более очевидную возможность, чем ссылка, даже если она ссылается на страницу, а не инициирует истинное действие формы.
TheDudeAbides

Прямо сейчас у меня есть <a>внутренняя часть <button>(с тем же href) в качестве резервной копии, если JS отключен, и через шесть месяцев я определенно буду смущен, что признал это.
TheDudeAbides

@TheDudeAbides Я не говорю о его аспекте, я говорю о разметке, которую вы хотите использовать. Что мешает вам оформить эту ссылку как большую прямоугольную кнопку? Разве что на вашем сайте вообще не используются стили? Кстати, ответ над тем, который мы комментируем, является прекрасным примером этого. Это тег привязки, стилизованный под кнопку.
Капсула

7

Было бы действительно странно, если бы это было правильно, и я ожидал бы, что это недействительно. Что значит иметь один интерактивный элемент внутри другого интерактивного элемента? Что это - кнопка или ссылка?


Спасибо, Стив. Этот метод мне предложил один сотрудник. Метод действительно работает. Есть ли лучший способ сделать это?
Мари

1
@Marie. Если вы хотите, чтобы ссылка выглядела как кнопка, легко использовать стили CSS, чтобы она выглядела так же. Добавьте стиль границы , похожее на это: border: 2px outset. Если вы хотите немного скруглить углы, вы также можете использовать на нем радиус границы . Подойдет и простой <img>тег.
Useless Code

3

Другой вариант - использовать атрибут кнопки onclick:

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

Это работает, однако пользователь не увидит ссылку, отображаемую при наведении курсора, как если бы она находилась внутри элемента.


2

В наши дни, даже если спецификация не позволяет этого, "кажется" все еще работает, чтобы встроить кнопку в <a href...><button ...></a>тег, FWIW ...


2
Это работает, когда <button>не содержится в <form>. Однако, как только кнопка содержится (например <form>...<a><button>), она перестает работать, если только не отключен обработчик нажатия кнопки. Этого достаточно, чтобы избежать этого сценария.
епископ

0

Вы можете добавить класс к кнопке и поместить какой-нибудь скрипт, перенаправляющий его.

Я так делаю:

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

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

0

почему бы и нет ... вы также можете встроить картинку на кнопку

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

2
Проблема в том, что <a> </a>, как тогда спросил ОП, немного ограничивает то, что он позволяет находиться в своих границах. См. Принятый вопрос там.
Thomas


-2

В HTML5 запрещено встраивать элемент кнопки в ссылку.

Лучше использовать CSS по умолчанию и: активные (нажатые) состояния:

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>


Для предъявления по месту требования. Два человека отметили это без каких-либо объяснений. Это лень в социальных сетях. Как люди будут учиться, если не будут объяснены? Одно из возможных возражений заключается в том, что отображение не будет должным образом соответствовать естественно отображаемым кнопкам каждого браузера.
Патанджали

-4

Используйте атрибут formaction внутри кнопки

PS! Это работает, только если ваша кнопка type = "submit"

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

вам также необходимо поместить кнопку в тег <form>.
denodster

-4

<a href="index.html">
  <button type="button">Submit</button>
</a>
Или вы можете использовать java-скрипт в кнопке как:

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


1
Просто стать некоторыми браузерами, которые позволят это, не значит, что это хорошая идея.
denodster
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.