Чи можна вкласти елемент <кнопка> всередині <a> за допомогою HTML5?


145

Я роблю наступне:

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

Це працює добре, але я отримую помилку перевірки HTML5, яка говорить, що "Кнопка" Елемент "не повинна вкладатись у елемент" кнопка ".

Хтось може дати мені поради, що мені робити?


8
Валідатор вже відповів на ваше запитання і навіть повідомив, чому це невірно в цьому повідомленні про помилку.
Марний код

1
Але чи є альтернатива, якщо я хочу, щоб Google міг бачити це як посилання. Як приклад використання кнопок у мене є кнопки під назвою "<<" та ">>" для наступного запису та попереднього запису. Я вважаю, що це повинні бути кнопки, але функціональність полягає в тому, що вони посилаються на нові сторінки.
Марі

3
моє запитання: чи це не має значення ... якщо ви зробите цей заслужений виняток.
Мухаммед Умер

1
Якщо я покладу <button> <a href="dsada.html"> Тест </a> </button>, він не працює в Internet Explorer 11 або Firefox.
dutraveller

Відповіді:


231

Ні , це недійсний HTML5 згідно зі специфікаційним документом HTML5 від W3C :

Модель вмісту: прозора , але не повинно бути інтерактивного вмісту нащадка.

Елемент може бути обгорнутий цілими абзацами, списками, таблицями тощо, навіть цілими розділами, доки в ньому немає інтерактивного вмісту (наприклад, кнопок чи інших посилань).

Іншими словами, ви можете вкласти будь-які елементи всередині, <a>крім наступного:

  • <a>

  • <audio>(якщо присутній атрибут керування )

  • <button>

  • <details>

  • <embed>

  • <iframe>

  • <img>(якщо атрибут usemap присутній)

  • <input>(якщо атрибут типу не знаходиться в прихованому стані)

  • <keygen>

  • <label>

  • <menu>(якщо атрибут типу знаходиться в режимі панелі інструментів )

  • <object>(якщо атрибут usemap присутній)

  • <select>

  • <textarea>

  • <video>(якщо присутній атрибут керування )


Якщо ви намагаєтесь мати кнопку, яка десь посилається, загорніть її в <form>тег як такий:

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

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


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

2
@Marie: Не існує іншого способу, крім стилізації ваших посилань, щоб вони виглядали як кнопки.
Ендрю Мур

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

4
@AndrewMoore: стилізація посилання на вигляд кнопки створює власний набір проблем, наприклад, щодо доступності. Кнопка повинна виконуватися, коли вона фокусується, і ви натискаєте пробіл. Посилання не робить. Якщо ви переймаєтесь АДА (або вимагаєте прикинутись до догляду), це може вас вкусити.
іконоборство

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>

не добре працює з дивовижним значком шрифту круглої кнопки всередині
Інструментарій

Використання class = 'btn btn-default' відповідає іншим кнопкам (MVC6).
крокусек

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 так часто зустрічається в ці дні. Подивіться на цільову сторінку для всіх існуючих рамок веб-розробки. Я завжди за пуристський аргумент, але навіть мені потрібно визнати, що велика прямокутна кнопка має кращу, очевиднішу доступність, ніж посилання, навіть якщо вона посилається на сторінку замість ініціювання дійсної дії форми.
TheDudeAbides

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

@TheDudeAbides Я не говорю про його аспект, я беру про розмітку, яку ви хочете використовувати. Що заважає вам стилізувати це посилання як велику прямокутну кнопку? Якщо ваш сайт взагалі не використовує ніяких стилів? btw відповідь вище того, що ми коментуємо, є ідеальним прикладом цього. Це тег прив’язки, стилізований до кнопки.
Капсула

10

Я щойно перейшов до тієї ж проблеми, і вирішив її, замінивши тег "button" на "span". У моєму випадку я використовую завантажувальний інструмент. Ось як це виглядає:

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

4
Проміжок часу вам не потрібен. Просто перемістіть всю частину класу до <a> і у вас з’явиться кнопка посилання. напр. <a href="#register" class="btn btn-default btn-lg"> Підписатися </a>
Ryan Buddicom

Оригінальний плакат запитав, чи можна розмістити кнопку всередині тега прив’язки. У прийнятій відповіді зазначається, що це стосується специфікацій W3C для розміщення <a> всередині <a>. Я думаю, що тому golbeltri демонстрував стиль <span> як кнопку.
StackOverflowUser

Це має сенс, якщо всередині вмісту є інший вміст <a>, який є частиною посилання, але не стилізований до кнопки. Наприклад, будь-який клацання в межах div(зображення, фону, тексту тощо) переходить до посилання, але лише spanвиглядає як кнопка.
Йосія

7

Було б дійсно дивно, якби це було дійсним, і я би очікував, що це буде недійсним. Що має означати наявність одного елемента, що може натискати всередині іншого елемента, що може натискати? Що це - кнопка чи посилання?


Спасибі Стів. Це був метод, запропонований мені колективом. Метод дійсно працює. Чи є якийсь кращий спосіб, як я міг би це зробити?
Марі

1
@Marie Якщо ви хочете, щоб посилання виглядала як кнопка, просто використовувати стилі CSS, щоб вона виглядала як така. Додайте стиль кордону , схоже на це: border: 2px outset. Якщо ви хочете трохи закруглити кути, ви також можете використовувати на ньому рамку-радіус . Простий <img>тег також буде добре працювати.
Марний код

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>, як тоді запитував ОП, є дещо обмежуючим у тому, що дозволяє бути в його межах. Дивіться прийняте запитання там.
Томас


-1

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


-2

Я спробую ваші рішення JavaScript, але для роботи мені потрібно вставити e.preventDefault();функцію javascript.

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

Використовуйте атрибут формації всередині кнопки

PS! Він працює лише в тому випадку, якщо ваша кнопка type = "submit"

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

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

-3

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


Просто стати деякими браузерами це дозволить, це не означає, що це гарна ідея.
Denodster
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.