ฉันสามารถวางองค์ประกอบ <button> ไว้ใน <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>(หากแอตทริบิวต์typeไม่อยู่ในสถานะซ่อนเร้น )

  • <keygen>

  • <label>

  • <menu>(หากแอตทริบิวต์typeอยู่ในสถานะแถบเครื่องมือ )

  • <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: ไม่มีวิธีอื่นนอกเหนือจากการออกแบบลิงก์ของคุณให้มีลักษณะเหมือนปุ่ม
Andrew Moore

3
user25 ไม่ใช่ไม่ดีกว่าที่จะใช้ method = "โพสต์" เพราะเบราว์เซอร์ขอให้ส่งแบบฟอร์มโพสต์อีกครั้งเมื่อนำทางไปมา GET เป็นวิธีการเริ่มต้นของรูปแบบหนึ่งสามารถออก method = "get" out เพื่อความกะทัดรัด
Bijan

4
@AndrewMoore: จัดทำลิงก์ให้ดูเหมือนว่าปุ่มสร้างชุดปัญหาขึ้นมาเองเช่นเพื่อการเข้าถึง ปุ่มควรทำงานเมื่อมีการโฟกัสและคุณกด spacebar ลิงก์ไม่ หากคุณสนใจเกี่ยวกับ ADA (หรือจำเป็นต้องแสร้งดูแล) นี่อาจทำให้คุณกัด
iconoclast

2
ตามที่ @ jonaspas แนะนำให้ใช้ a <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

เลขที่

โซลูชันต่อไปนี้อาศัย 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 มันเป็นเรื่องธรรมดามากที่จะได้เห็นวันนี้ เพียงดูที่หน้า Landing Page สำหรับทุก ๆ กรอบการพัฒนาเว็บที่มีอยู่ ฉันทุกคนมักจะถกเถียงกันอย่างพิถีพิถัน แต่ถึงแม้ว่าฉันต้องยอมรับว่าปุ่มสี่เหลี่ยมขนาดใหญ่นั้นมีความสามารถในการจ่ายดีกว่าและชัดเจนกว่าลิงก์แม้ว่ามันจะลิงก์ไปยังหน้าแทนที่จะเป็นการเริ่มแบบฟอร์มที่แท้จริง
TheDudeAbides

ตอนนี้ผมมี<a>ภายใน<button>(ด้วยเหมือนกันhref) ในฐานะตัวสำรองถ้า JS เป็นคนพิการและหกเดือนนับจากนี้แน่นอนฉันจะต้องอายที่ผมยอมรับว่า
TheDudeAbides

@TheDudeAbides ฉันไม่ได้พูดถึงแง่มุมของมันฉันกำลังพิจารณาเกี่ยวกับมาร์กอัปที่คุณต้องการใช้ อะไรทำให้คุณไม่สามารถจัดแต่งลิงค์นี้เป็นปุ่มสี่เหลี่ยมขนาดใหญ่ได้ หากเว็บไซต์ของคุณไม่ได้ใช้สไตล์ใด ๆ เลย? btw คำตอบเหนือคำตอบที่เราแสดงความคิดเห็นเป็นตัวอย่างที่สมบูรณ์แบบของมัน มันเป็นแท็กจุดยึดสไตล์เป็นปุ่ม
แคปซูล

10

ฉันได้เพิ่มเข้าไปในปัญหาเดียวกันและฉันแก้ไขมันแทนแท็ก 'button' เพื่อ 'ขยาย' แท็ก ในกรณีของฉันฉันใช้ bootstrap นี่คือลักษณะ:

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

4
คุณไม่จำเป็นต้องมีการขยายเลยด้วย bootstrap เพียงแค่ย้ายส่วนของคลาสทั้งหมดไปยัง <a> แล้วคุณจะมีปุ่มลิงก์ เช่น <a href="#register" class="btn btn-default btn-lg"> สมัครรับ </a>
Ryan Buddicom

โปสเตอร์ต้นฉบับถามว่าเป็นไปได้หรือไม่ที่จะวางปุ่มภายในแท็กจุดยึด คำตอบที่ได้รับการยอมรับนั้นเป็นไปตามข้อกำหนดของ W3C เพื่อวาง <a> ไว้ใน <a> ฉันคิดว่านั่นเป็นเหตุผลที่ golbeltri แสดงให้เห็นถึงการออกแบบสไตล์ <span> เป็นปุ่ม
StackOverflowUser

วิธีนี้เหมาะสมถ้ามีเนื้อหาอื่นอยู่ภายใน<a>ซึ่งเป็นส่วนหนึ่งของลิงก์ แต่ไม่ได้มีสไตล์เหมือนปุ่ม ตัวอย่างเช่นการคลิกใด ๆ ภายในdiv(รูปภาพพื้นหลังข้อความ ฯลฯ ) จะไปที่ลิงก์ แต่มีเพียงปุ่มที่spanดูเหมือน
Josiah

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> ตามที่ OP ถามกลับมาแล้วนั้นเป็นข้อ จำกัด เล็กน้อยในสิ่งที่อนุญาตให้อยู่ภายในขอบเขตของมัน ดูคำถามที่ยอมรับได้ที่นั่น
โทมัส


-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

ฉันลองใช้จาวาสคริปต์ของคุณ แต่สำหรับการทำงานฉันต้องใส่e.preventDefault();ฟังก์ชันจาวาสคริปต์ของฉัน

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

ใช้แอตทริบิวต์ formaction ภายในปุ่ม

PS! ใช้งานได้เฉพาะเมื่อปุ่มของคุณพิมพ์ = "ส่ง"

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

คุณต้องใส่ปุ่มในแท็ก <form>
denodster

-3

<a href="index.html">
  <button type="button">Submit</button>
</a>
หรือคุณสามารถใช้จาวาสคริปต์ในปุ่มเป็น:

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


เพียงแค่กลายเป็นเบราว์เซอร์บางตัวจะอนุญาตไม่ได้หมายความว่าเป็นความคิดที่ดี
denodster
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.