<option> etiketinin içindeki href bağlantılarını kullanma


139

Aşağıdaki HTML kodu var:

<select name="forma">
    <option value="Home">Home</option>
    <option value="Contact">Contact</option>
    <option value="Sitemap">Sitemap</option>
</select>

Ana Sayfa , İletişim ve Site Haritası değerlerini nasıl bağlantı olarak yapabilirim? Aşağıdaki kodu kullandım ve beklediğim gibi işe yaramadı:

<select name="forma">
    <option value="Home"><a href="home.php">Home</a></option>
    <option value="Contact"><a href="contact.php">Contact</a></option>
    <option value="Sitemap"><a href="sitemap.php">Sitemap</a></option>
</select>

Sadece helpfollowing link takip edebilirsiniz stackoverflow.com/questions/12287672/… Umarım yardımcı olabilir
Bikram Shrestha

Belki de bu javascript olmayan çözüm yardımcı olacaktır: stackoverflow.com/questions/9953482/…
Melsi

Yanıtlar:


267
<select name="forma" onchange="location = this.value;">
 <option value="Home.php">Home</option>
 <option value="Contact.php">Contact</option>
 <option value="Sitemap.php">Sitemap</option>
</select>

GÜNCELLEME (Kasım 2015): Bu gün ve yaşta bir açılan menüye sahip olmak istiyorsanız, birini uygulamak için tartışmasız daha iyi yollar vardır. Bu cevap doğrudan bir soruya doğrudan bir cevap, ancak halka açık web siteleri için bu yöntemi savunmuyorum.

GÜNCELLEME (Mayıs 2020): Birisi yorumlarda neden bu çözümü savunamayacağımı sordu. Sanırım bu bir anlambilim meselesi. HTML öğelerinin semantik toplantısı olduğu ve bir amacı olduğu, sizi götürdüğü , listelerden bir şeyler seçtikleri için kullanıcılarımın gezinme <a>ve <select>form seçimleri yapmak için saklanmasını tercih ederim .anchors<select>

Eğer (non grafiksel tarayıcı veya ekran okuyucu veya sayfa programlı erişilen veya JavaScript devre dışı) sonra ne "anlamına gelen" veya bunun "niyet" olduğunu geleneksel olmayan bir tarayıcı ile bir sayfasını görüntülerken eğer düşünün <select>sahip navigasyon için kullanılır? "Lütfen bir sayfa adı seçin" diyor ve başka bir şey değil, kesinlikle gezinmeyle ilgili hiçbir şey yok. Buna kolay cevap şudur, well i know that my users will be using IE or whatever so shrugama bu anlamsal önem noktasını kaçırmaktadır.

Bazı düzenli ankrajlar içeren uygun düzen elemanlarından (ve bazı js) oluşan korkak bir açılır arayüz öğesi, düzen öğesi kaybolsa bile yine de niyetini korurken, "bunlar bir grup bağlantıdır, birini seçin ve oraya gideceğiz" .

İşte kötüye kullanımı ve kötüye kullanımı hakkında<select> bir makale .


6
Değerleri home.php, contact.php ve sitemap.php olarak değiştirmeniz yeterlidir.
Jason Rowe

16
çok havalı! <option value="#anchor_on_my_site">...</option>bir çapa bağlamak için bu kodu kullanabilirsiniz !
pruett

3
Bu çok önemsiz olduğunu biliyorum ama "onchange" ve "ONCHANGE" değil
Oliver Dixon

3
Bunu kısaltabilirsinizlocation = this.value;
Juan Mendes

2
sadece bağlantınızı uygulamak için işe yaramadığını bildirmek için
John

18

Seçenek etiketleri ile href etiketlerini kullanamazsınız. Bunu yapmak için javascript'e ihtiyacınız olacak.

<select name="formal" onchange="javascript:handleSelect(this)">
<option value="home">Home</option>
<option value="contact">Contact</option>
</select>

<script type="text/javascript">
function handleSelect(elm)
{
window.location = elm.value+".php";
}
</script>

14

Bunun yerine gerçek bir açılır menü kullanın: bir liste ( ul, li) ve bağlantılar. Form öğelerini asla bağlantı olarak kötüye kullanmayın.

Ekran okuyuculu okuyucular genellikle otomatik olarak oluşturulan bir bağlantı listesini tarar; bu önemli bilgileri kaçırırlar. Birçok klavye navigasyon sistemi (örn. JAWS, Opera) bağlantılar ve form öğeleri için farklı klavye kısayolları sunar.

Hala bir fikrini bırakamıyorsanız en azından işleyiciyi selectkullanmayın onchange. Bu klavye kullanıcıları için gerçek bir acıdır, üçüncü öğenize neredeyse erişilemez hale getirir.


2
Tabii ki doğru, makmour uygulaması form alanlarının büyük bir kötüye kullanımı.
gingerbreadboy

Doğru, peki ya mobil cihazlar? Kabul edilen cevap, medya sorgusunda "display: hidden" anahtarıyla gerçek bir açılır menü ile birleştirilirse, endişeleriniz hala geçerli mi? Yoksa daha iyi bir çözümünüz var mı?
Skippy le Grand Gourou

1
@SkippyleGrandGourou Daha iyi bir çözüm, içinde gerçek bağlantılar bulunan tek bir menü kullanmaktır.
fuxia

7

Kabul edilen çözüm iyi görünüyor, ancak işleyemediği bir durum var:

Aynı seçenek yeniden seçildiğinde "onchange" olayı tetiklenmez. Bu yüzden aşağıdaki gelişmeyi buldum:

HTML

<select id="sampleSelect" >
  <option value="Home.php">Home</option>
  <option value="Contact.php">Contact</option>
  <option value="Sitemap.php">Sitemap</option>
</select>

jQuery

$("select").click(function() {
  var open = $(this).data("isopen");
  if(open) {
    window.location.href = $(this).val()
  }
  //set isopen to opposite so next time when use clicked select box
  //it wont trigger this event
  $(this).data("isopen", !open);
});

3
Veya başlangıçta boş bir seçenek ekleyin:<option value="">&nbsp;</option>
Kai Noack

5

(Toscho'nun cevabı hakkında yorum yapmak için yeterli itibarım yok.)

Ekran okuyucularla ilgili hiçbir deneyimim yok ve eminim puanlarınız geçerli.

Bununla birlikte, seçimleri değiştirmek için bir klavye kullanmak kadarıyla, klavyeyi kullanarak herhangi bir seçenek seçmek önemsizdir:

SEKMEDE KONTROL

Seçim listesini açmak için SPACE

İstediğiniz liste öğesine gitmek için YUKARI veya AŞAĞI oklar

İstenen öğeyi seçmek için ENTER

Yalnızca ENTER'da onchange veya (JQuery .change ()) olayı tetiklenir.

Kişisel olarak basit menüler için bir form denetimi kullanmasam da, sayfanın sunumunu değiştirmek için form denetimlerini kullanan birçok web uygulaması vardır (örneğin, sıralama düzeni). Bunlar AJAX tarafından yeni içerik yüklemek için uygulanabilir veya daha eski uygulamalarda, aslında bir sayfa bağlantısı olan yeni sayfa yüklemelerini tetikleyerek.

IMHO bunlar bir form denetiminin geçerli kullanımlarıdır.



2
    <select name="career" id="career" onchange="location = this.value;">
        <option value="resume" selected> All Applications </option>
        <option value="resume&j=14">Seo Expert</option>
        <option value="resume&j=21">Project Manager</option>
        <option value="resume&j=33">Php Developer</option>
    </select>

Bu kod soruyu cevaplayabilirken, sorunun nasıl ve / veya neden çözüldüğüne ilişkin ek bağlam sağlamak yanıtlayıcının uzun vadeli değerini artıracaktır.
rgmt

-7

Bu Kodu Deneyin

<select name="forma" onchange="location = this.options[this.selectedIndex].value;">
 <option value="Home.php">Home</option>
 <option value="Contact.php">Contact</option>
 <option value="Sitemap.php">Sitemap</option>
</select>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.