Bisakah saya membuat sarang elemen <button> di dalam <a> menggunakan HTML5?

145

Saya melakukan hal berikut:

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

Ini berfungsi baik tetapi saya mendapatkan kesalahan validasi HTML5 yang mengatakan "Elemen 'tombol' tidak boleh bersarang di dalam elemen 'tombol'.

Adakah yang bisa memberi saya nasihat tentang apa yang harus saya lakukan?

Marie
sumber
8
Validator sudah menjawab pertanyaan Anda untuk Anda, dan bahkan memberi tahu Anda mengapa itu tidak valid dalam pesan kesalahan itu.
Kode Tidak Berguna
1
Tetapi apakah ada alternatif lain jika saya ingin Google dapat melihatnya sebagai tautan. Sebagai contoh penggunaan tombol saya memiliki tombol yang disebut "<<" dan ">>" untuk catatan berikutnya dan catatan sebelumnya. Saya percaya ini harus tombol tetapi fungsinya adalah mereka terhubung ke halaman baru.
Marie
3
pertanyaan saya adalah APAKAH itu penting .. jika Anda membuat pengecualian yang memang layak ini.
Muhammad Umer
1
Jika saya meletakkan <button> <a href="dsada.html"> Uji </a> </button> itu tidak berfungsi di Internet Explorer 11 atau Firefox.
dutraveller

Jawaban:

231

Tidak , itu bukan HTML5 yang valid menurut Dokumen Spesifikasi HTML5 dari W3C :

Model konten: Transparan , tetapi tidak boleh ada keturunan konten interaktif .

Elemen a dapat melingkari seluruh paragraf, daftar, tabel, dan sebagainya, bahkan seluruh bagian, selama tidak ada konten interaktif di dalamnya (mis. Tombol atau tautan lain).

Dengan kata lain, Anda dapat membuat sarang elemen apa pun di dalam <a>kecuali yang berikut:

  • <a>

  • <audio>(jika atribut kontrol hadir)

  • <button>

  • <details>

  • <embed>

  • <iframe>

  • <img>(jika atribut usemap ada)

  • <input>(jika atribut type tidak dalam keadaan tersembunyi )

  • <keygen>

  • <label>

  • <menu>(jika atribut type dalam status toolbar )

  • <object>(jika atribut usemap ada)

  • <select>

  • <textarea>

  • <video>(jika atribut kontrol hadir)


Jika Anda mencoba memiliki tombol yang tertaut ke suatu tempat, bungkus tombol itu di dalam <form>tag sebagai berikut:

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

Namun, jika <button>tag Anda ditata menggunakan CSS dan tidak terlihat seperti widget sistem ... Bantu diri Anda sendiri, buat kelas baru untuk <a>tag Anda dan gaya dengan cara yang sama.

Andrew Moore
sumber
1
@ Andrew Moore - Apakah ada cara lain. Saya percaya ini memberikan masalah dan itulah mengapa itu diubah menjadi di dalam tautan <a>. Tidak yakin apa masalahnya, tetapi kami memiliki banyak tombol seperti ini di halaman. Mungkin itu karena kami ingin meningkatkan SEO dengan menggunakan tautan <a>.
Marie
2
@Marie: Tidak ada cara lain selain menata tautan Anda agar terlihat seperti tombol.
Andrew Moore
3
user25 not is tidak lebih baik menggunakan metode = "post" karena browser meminta untuk mengirim ulang form posting ketika menavigasi bolak-balik. Karena GET adalah metode default suatu formulir, seseorang dapat membiarkan metode = "keluar" untuk singkatnya.
Bijan
4
@AndrewMoore: menata tautan agar terlihat seperti tombol menciptakan masalah tersendiri, seperti untuk aksesibilitas. Sebuah tombol harus dijalankan ketika fokus dan Anda menekan bilah spasi. Tautan tidak. Jika Anda peduli tentang ADA (atau diharuskan untuk berpura-pura peduli) maka ini mungkin menggigit Anda.
iconoclast
2
Seperti yang disarankan @jonaspas, bagian <div>dalam <a>benar-benar valid dalam HTML5: validator.w3.org/nu/…
Socob
43

Jika Anda menggunakan Bootstrap 3 , ini berfungsi dengan baik

<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>
pengguna2197018
sumber
tidak berfungsi dengan baik dengan ikon tombol bulat, ikon luar biasa di dalamnya
Toolkit
Menggunakan class = 'btn btn-default' cocok dengan tombol lainnya (MVC6).
crokusek
12

Tidak.

Solusi berikut bergantung pada JavaScript.

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

Jika tombol tersebut akan ditempatkan di dalam yang ada <form>dengan method="post", kemudian memastikan tombol memiliki atribut type="button"sebaliknya tombol akan menyerahkan operasi POST. Dengan cara ini Anda dapat memiliki <form>yang berisi campuran tombol operasi GET dan POST.

Peter Wilson
sumber
onclick tidak akan berfungsi pada protokol file, jadi itu tidak berguna untuk presentasi statis, misalnya. dalam hal ini bentuk tindakan propety adalah jalan yang harus ditempuh.
netalex
1
Jika tombolnya ditautkan ke sebuah halaman, maka itu bukan sebuah tombol, itu adalah jangkar
Capsule
@Capsule sangat umum untuk melihat hari ini. Lihat saja halaman arahan untuk setiap kerangka pengembangan web yang ada. Biasanya saya setuju dengan argumen purist, tetapi bahkan saya harus mengakui bahwa tombol persegi panjang besar memiliki keterjangkauan yang lebih jelas daripada tautan, bahkan jika tautannya ke laman alih-alih memulai tindakan bentuk yang sebenarnya.
TheDudeAbides
Saat ini saya memiliki bagian <a>dalam <button>(dengan yang sama href) sebagai cadangan jika JS dinonaktifkan, dan enam bulan dari sekarang saya pasti akan malu bahwa saya mengakuinya.
TheDudeAbides
@TheDudeAbides Saya tidak berbicara tentang aspek itu, saya mengambil tentang markup yang ingin Anda gunakan. Apa yang mencegah Anda dari menata tautan ini sebagai tombol persegi panjang besar? Kecuali situs Anda tidak menggunakan gaya sama sekali? tapi jawaban di atas yang kami komentari adalah contoh yang sempurna. Ini tag jangkar, ditata sebagai tombol.
Capsule
10

Saya baru saja melompat ke masalah yang sama dan saya menyelesaikannya dengan mengganti tag 'tombol' ke tag 'span'. Dalam kasus saya, saya menggunakan bootstrap. Begini tampilannya:

<a href="#register"> 
    <span class="btn btn-default btn-lg">
        Subscribe
    </span>
</a> 
gobeltri
sumber
4
Anda tidak perlu rentang sama sekali dengan bootstrap. Pindahkan seluruh bagian kelas ke <a> dan Anda akan memiliki tombol tautan. mis. <a href="#register" class="btn btn-default btn-lg"> Berlangganan </a>
Ryan Buddicom
Poster asli bertanya apakah mungkin untuk menempatkan tombol di dalam tag jangkar. Jawaban yang diterima mencatat bahwa itu bertentangan dengan spesifikasi W3C untuk menempatkan <a> di dalam <a>. Saya pikir itu sebabnya golbeltri menunjukkan styling <span> sebagai tombol.
StackOverflowUser
Ini masuk akal jika ada konten lain di dalamnya <a>, yang merupakan bagian dari tautan, tetapi tidak ditata seperti tombol. Misalnya, klik apa pun dalam div(gambar, latar belakang, teks, dll) menuju ke tautan, tetapi hanya yang spantampak seperti tombol.
Josiah
7

Akan sangat aneh jika itu valid, dan saya berharap itu tidak valid. Apa artinya memiliki satu elemen yang dapat diklik di dalam elemen yang dapat diklik lainnya? Yang mana itu - tombol, atau tautan?

Steve Jorgensen
sumber
Terima kasih Steve. Ini adalah metode yang disarankan kepada saya oleh seorang pekerja tim. Metode ini berhasil. Adakah cara yang lebih baik untuk melakukan ini?
Marie
1
@Marie Jika Anda ingin membuat tautan terlihat seperti tombol, mudah menggunakan gaya CSS untuk membuatnya terlihat seperti itu. Menambahkan gaya perbatasan seperti ini: border: 2px outset. Jika Anda ingin sedikit berbelok di tikungan, Anda bisa menggunakan batas-radius juga. <img>Tag sederhana juga akan berfungsi dengan baik.
Kode Tidak Berguna
3

Pilihan lain adalah menggunakan atribut onclick tombol:

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

Ini berfungsi, namun, pengguna tidak akan melihat tautan yang ditampilkan di hover seperti yang akan mereka lakukan jika berada di dalam elemen.

LaserCat
sumber
2

Saat ini bahkan jika spek tidak mengizinkannya, "sepertinya" masih berfungsi untuk menyematkan tombol di dalam <a href...><button ...></a>tag, FWIW ...

rogerdpack
sumber
2
Ini berfungsi ketika <button>tidak terkandung dalam a <form>. Namun, segera setelah tombol terkandung (mis. <form>...<a><button>) Ini berhenti berfungsi, kecuali ada yang menonaktifkan handler klik-tombol. Ini cukup rotasi untuk menjamin menghindari skenario ini.
Uskup
0

Anda dapat menambahkan kelas ke tombol dan menempatkan beberapa skrip mengarahkannya.

Saya melakukannya dengan cara ini:

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

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

kenapa tidak..kamu juga bisa menanamkan gambar pada tombol juga

<FORM method = "POST" action = "https://stackoverflow.com"> 
    <button type="submit" name="Submit">
        <img src="img/Att_hack.png" alt="Text">
    </button>
</FORM> 
Tapasit Suesasiton
sumber
2
Masalahnya adalah <a> </a> seperti yang diminta OP saat itu agak membatasi apa yang diizinkan berada dalam batas-batasnya. Lihat pertanyaan yang diterima di sana.
Thomas
-1

Adalah ilegal di HTML5 untuk menyematkan elemen tombol di dalam tautan.

Lebih baik menggunakan CSS pada status default dan: aktif (ditekan):

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>

Patanjali
sumber
-2

Saya mencoba solusi javascript Anda, tetapi untuk pekerjaan saya harus memasukkan e.preventDefault();fungsi javascript saya.

<!-- 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>   
Paolo Ferraris
sumber
-3

Gunakan atribut formaction di dalam tombol

PS! Ini hanya berfungsi jika tombol Anda ketik "kirim"

<button type="submit" formaction="www.youraddress.com">Submit</button>
Moonfly
sumber
Anda juga perlu meletakkan tombol di tag <form>.
denodster
-3

<a href="index.html">
  <button type="button">Submit</button>
</a>
Atau Anda dapat menggunakan tombol java script di sebagai:

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

aditya panchal
sumber
Hanya menjadi beberapa browser akan memungkinkannya, bukan berarti itu ide yang baik.
denodster