Czy mogę zagnieździć element <button> wewnątrz <a> przy użyciu HTML5?


145

Wykonuję następujące czynności:

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

Działa to dobrze, ale pojawia się błąd walidacji HTML5, który mówi, że „przycisk elementu” nie może być zagnieżdżony w elemencie „przycisk”.

Czy ktoś może mi doradzić, co powinienem zrobić?


8
Walidator już odpowiedział na twoje pytanie, a nawet powiedział ci, dlaczego nie jest poprawne w tym komunikacie o błędzie.
Bezużyteczny kod

1
Ale czy istnieje alternatywa, jeśli chcę, aby Google mogło zobaczyć to jako link. Jako przykład użycia przycisku mam przyciski o nazwie „<<” i „>>” dla następnego i poprzedniego rekordu. Uważam, że powinny to być przyciski, ale funkcjonalność polega na tym, że prowadzą do nowych stron.
Marie

3
moje pytanie brzmi: CZY to ma znaczenie ... jeśli zrobisz ten jeden zasłużony wyjątek.
Muhammad Umer

1
Jeśli umieszczę <button> <a href="dsada.html"> Test </a> </button>, to nie działa w przeglądarce Internet Explorer 11 lub Firefox.
dutraveller

Odpowiedzi:


231

Nie , to nie jest poprawny HTML5 zgodnie z dokumentem specyfikacji HTML5 od W3C :

Model treści: przezroczysty , ale nie może istnieć żaden element podrzędny treści interaktywnej .

Element a może być zawijany wokół całych akapitów, list, tabel itp., A nawet całych sekcji, o ile nie ma w nich interaktywnej zawartości (np. Przycisków lub innych linków).

Innymi słowy, możesz zagnieżdżać dowolne elementy wewnątrz z <a>wyjątkiem następujących:

  • <a>

  • <audio>(jeśli atrybut controls jest obecny)

  • <button>

  • <details>

  • <embed>

  • <iframe>

  • <img>(jeśli atrybut usemap jest obecny)

  • <input>(jeśli atrybut typu nie jest w stanie ukrytym )

  • <keygen>

  • <label>

  • <menu>(jeśli atrybut typu jest w stanie paska narzędzi )

  • <object>(jeśli atrybut usemap jest obecny)

  • <select>

  • <textarea>

  • <video>(jeśli atrybut controls jest obecny)


Jeśli chcesz mieć przycisk, który prowadzi do jakiegoś miejsca, zawiń ten przycisk wewnątrz <form>tagu jako takiego:

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

Jeśli jednak Twój <button>tag jest stylizowany za pomocą CSS i nie wygląda jak widżet systemu ... Zrób sobie przysługę, utwórz nową klasę dla swojego <a>tagu i nadaj jej styl w ten sam sposób.


1
@Andrew Moore - Czy jest inny sposób. Uważam, że spowodowało to problemy i dlatego zostało zmienione tak, aby znajdowało się wewnątrz linku <a>. Nie jestem pewien, na czym polegał problem, ale mamy wiele takich przycisków na stronie. Może dlatego, że chcieliśmy poprawić SEO, używając linków <a>.
Marie

2
@Marie: Nie ma innego sposobu niż stylizowanie linków tak, aby wyglądały jak przyciski.
Andrew Moore

3
user25 nie nie jest lepszym rozwiązaniem, jeśli użyje metody method = "post", ponieważ przeglądarka prosi o ponowne wysłanie formularza posta podczas nawigacji tam iz powrotem. Ponieważ GET jest domyślną metodą formularza, można dla zwięzłości pozostawić metodę method = "get".
Bijan,

4
@AndrewMoore: nadanie linku stylowi wyglądu przycisku stwarza własny zestaw problemów, takich jak dostępność. Przycisk powinien działać, gdy ma fokus i naciśniesz spację. Link nie. Jeśli zależy Ci na ADA (lub musisz udawać, że Ci zależy), może Cię to ugryźć.
ikonoklast

2
Jak zasugerował @jonaspas, element <div>inside an <a>jest absolutnie poprawny w HTML5: validator.w3.org/nu/…
Socob

43

Jeśli używasz Bootstrap 3 , działa to całkiem dobrze

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

nie działa dobrze z niesamowitą ikoną czcionki okrągłego przycisku w środku
zestaw narzędzi

Użycie class = 'btn btn-default' dopasowało inne przyciski (MVC6).
crokusek

12

Nie.

Poniższe rozwiązanie opiera się na JavaScript.

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

Jeśli przycisk ma być umieszczony wewnątrz istniejącego <form>z method="post", upewnij się, że przycisk ma atrybut, w type="button"przeciwnym razie przycisk wyśle ​​operację POST. W ten sposób możesz mieć plik <form>zawierający kombinację przycisków operacji GET i POST.


onclick nie będzie działał na protokole pliku, więc nie jest przydatny na przykład do prezentacji statycznej. w tym przypadku dobra forma działania jest drogą do zrobienia.
netalex

1
Jeśli przycisk jest powiązany ze stroną, to nie jest przyciskiem, a kotwicą
Capsule

@ Kapsuła to tak powszechne w dzisiejszych czasach. Wystarczy spojrzeć na stronę docelową każdej istniejącej platformy programistycznej. Zwykle jestem zwolennikiem purystycznego argumentu, ale nawet ja muszę przyznać, że duży prostokątny przycisk ma lepszą, bardziej oczywistą afordancję niż link, nawet jeśli prowadzi do strony zamiast inicjować prawdziwe działanie formularza.
TheDudeAbides

W tej chwili mam <a>wewnątrz <button>(z tym samym href) jako kopię zapasową, jeśli JS jest wyłączony, i za sześć miesięcy od teraz na pewno będę zawstydzony, że to przyznałem.
TheDudeAbides

@TheDudeAbides Nie mówię o tym aspekcie, mówię o znacznikach, których chcesz użyć. Co powstrzymuje Cię przed stylizowaniem tego linku jako dużego prostokątnego przycisku? Chyba że Twoja witryna w ogóle nie używa stylów? btw odpowiedź powyżej tej, o której komentujemy, jest tego doskonałym przykładem. To tag kotwicy, stylizowany na przycisk.
Capsule

10

Właśnie wskoczyłem do tego samego problemu i rozwiązałem go, zastępując tag „button” tagiem „span”. W moim przypadku używam bootstrap. Tak to wygląda:

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

4
W przypadku bootstrapa w ogóle nie potrzebujesz rozpiętości. Po prostu przenieś całą część klasową do <a>, a otrzymasz przycisk łącza. np. <a href="#register" class="btn btn-default btn-lg"> Subskrybuj </a>
Ryan Buddicom

Oryginalny plakat pytał, czy można umieścić przycisk wewnątrz tagu kotwicy. Zaakceptowana odpowiedź wskazuje, że umieszczanie <a> wewnątrz <a> jest sprzeczne ze specyfikacjami W3C. Myślę, że właśnie dlatego golbeltri demonstrował stylizację <span> jako przycisku.
StackOverflowUser

Ma to sens, jeśli wewnątrz elementu znajduje się inna treść <a>, która jest częścią linku, ale nie ma stylu podobnego do przycisku. Na przykład każde kliknięcie w div(obrazie, tle, tekście itp.) Prowadzi do łącza, ale tylko element spanwygląda jak przycisk.
Josiah

7

Byłoby naprawdę dziwne, gdyby to było ważne i spodziewałbym się, że będzie nieważne. Co powinno oznaczać umieszczenie jednego klikalnego elementu wewnątrz innego klikalnego elementu? Co to jest - przycisk czy link?


Dzięki Steve. To była metoda, którą zasugerował mi pracownik zespołowy. Ta metoda działa. Czy jest lepszy sposób, abym to zrobił?
Marie

1
@Marie Jeśli chcesz, aby link wyglądał jak przycisk, możesz łatwo użyć stylów CSS, aby tak wyglądał. Dodaj styl obramowania podobny do tego: border: 2px outset. Jeśli chcesz trochę zaokrąglić rogi, możesz również użyć na nim border-radius . Prosty <img>tag też się sprawdzi.
Bezużyteczny kod

3

Inną opcją jest użycie atrybutu onclick przycisku:

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

To działa, jednak użytkownik nie zobaczy linku wyświetlanego po najechaniu kursorem, tak jak gdyby znajdował się wewnątrz elementu.


2

Obecnie, nawet jeśli specyfikacja na to nie zezwala, „wydaje się”, że nadal działa osadzanie przycisku w <a href...><button ...></a>tagu, FWIW ...


2
Działa to, gdy <button>plik nie jest zawarty w pliku <form>. Jednak gdy tylko przycisk jest zawarty (np. <form>...<a><button>), Przestaje działać, chyba że wyłącza się obsługę przycisku po kliknięciu. To wystarczy, aby uniknąć tego scenariusza.
biskup

0

Możesz dodać klasę do przycisku i umieścić skrypt przekierowujący go.

Robię to w ten sposób:

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

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

0

dlaczego nie… możesz również osadzić zdjęcie na przycisku

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

2
Problem polega na tym, że <a> </a>, o co pytał wówczas PO, jest nieco restrykcyjny w tym, co pozwala przebywać w jego granicach. Zobacz zaakceptowane pytanie.
Thomas


-1

W HTML5 osadzanie przycisku w linku jest nielegalne.

Lepiej używać CSS w stanach domyślnych i: active (wciśnięty):

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

Próbuję twoich rozwiązań javascript, ale do pracy muszę wstawić e.preventDefault();w mojej funkcji 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

Użyj atrybutu formaction wewnątrz przycisku

PS! Działa tylko wtedy, gdy typ przycisku = "wyślij"

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

musisz również umieścić przycisk w tagu <form>.
denodster

-3

<a href="index.html">
  <button type="button">Submit</button>
</a>
Lub możesz użyć skryptu java w przycisku jako:

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


Wystarczy, że niektóre przeglądarki na to pozwolą, nie oznacza to, że to dobry pomysł.
denodster
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.