<option>タグ内でhrefリンクを使用する


139

次のHTMLコードがあります。

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

ホーム連絡先サイトマップの値をリンクとして作成するにはどうすればよいですか?私は次のコードを使用しましたが、期待どおりに機能しませんでした。

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

あなたは単純にhelpfollowing link stackoverflow.com/questions/12287672/をフォローすることができます… それが役立つことを願っています
Bikram Shrestha

多分これ以外JavaScriptのソリューションは役立つだろう:stackoverflow.com/questions/9953482/...
Melsi

回答:


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>

更新(2015年11月):ドロップメニューを使用する場合、このメニューを実装するための間違いなくより良い方法がたくさんあります。この回答は直接的な質問に対する直接的な回答ですが、私はこの方法を一般向けWebサイトに推奨していません。

更新(2020年5月):なぜコメントで私がこの解決策を提唱しないのかと誰かが尋ねました。それは意味論の問題だと思います。HTML要素にはセマンティックなミーティングがあり、目的を持ち、場所を取り、リストから物を選ぶことを目的としているので、ユーザーがフォームを選択するためにナビゲートし<a>て保持<select>したanchorsほうがいいです<select>

考えてみましょう、あなたはその後、「意味」やこの「意図」されたもの(非グラフィカルブラウザやスクリーンリーダーやページがプログラムへのアクセス、またはJavaScriptが無効になっている場合)非伝統的なブラウザでページを表示している場合<select>、あなたは持っていますナビゲーションに使用?それは「ページ名を選んでください」と言っているだけで、他に多くはありません。確かにナビゲートすることについては何もありません。これへの簡単な対応はこれですwell i know that my users will be using IE or whatever so shrugが、これは意味論的な重要性の点を見逃しています。

いくつかの通常のアンカーを含む適切なレイアウト要素(および一部のjs)で作成されたファンキーなドロップダウンUI要素は、レイアウト要素が失われた場合でも意図を保持しますが、「これらはリンクの束です。1つ選択して、そこに移動します」 。

の誤用と乱用<select>に関する記事を次に示します。


6
値をhome.php、contact.phpおよびsitemap.phpに変更するだけです。
Jason Rowe

16
とてもかっこいい!このコードを使用<option value="#anchor_on_my_site">...</option>してアンカーにリンクすることもできます!
pruett、2012

3
これは非常に些細なことですが、 "ONCHANGE"ではなく "onchange"である必要があります
Oliver Dixon

3
次のように短縮できますlocation = this.value;
Juan Mendes

2
リンクを実装する方法ではリンクが機能しないことを知らせるためだけに
John

18

オプションタグと一緒にhrefタグを使用することはできません。そのためにはJavaScriptが必要です。

<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

代わりに実際のドロップダウンメニューを使用してください:リスト(ulli)およびリンク。フォーム要素をリンクとして誤用しないでください。

スクリーンリーダーを備えたリーダーは通常、自動的に生成されたリンクのリストをスキャンします。これらの重要な情報を見逃してしまいます。多くのキーボードナビゲーションシステム(JAWS、Operaなど)では、リンクとフォーム要素に異なるキーボードショートカットを提供しています。

それでもアイデアを落とせselectない場合はonchange、少なくともハンドラを使用しないでください。これはキーボードユーザーにとっては本当に苦痛であり、3番目のアイテムにほとんどアクセスできなくなります。


2
toschoはもちろん正しいですが、makmourのアプリケーションはフォームフィールドの大規模な誤用です。
gingerbreadboy 2014年

そうですが、モバイルデバイスはどうですか?受け入れられた回答が、メディアクエリの「display:hidden」スイッチを含む実際のドロップダウンメニューと組み合わされている場合、懸念は依然として有効ですか?それともより良い解決策がありますか?
Skippy le Grand Gourou

1
@SkippyleGrandGourouより良い解決策は、実際のリンクが含まれているメニューを1つだけ使用することです。
fuxia

7

受け入れられたソリューションは良さそうですが、処理できないケースが1つあります。

「onchange」イベントは、同じオプションが再選択されてもトリガーされません。それで、私は次の改善を思いつきました:

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
それとも、最初に空のオプションを追加します<option value="">&nbsp;</option>
甲斐ノアック

5

(toschoの答えについてコメントするのに十分な評判がありません。)

私はスクリーンリーダーを使った経験がありませんが、あなたのポイントは有効だと思います。

ただし、キーボードを使用して選択を操作する限り、キーボードを使用してオプションを選択するのは簡単です。

コントロールへのTAB

選択リストを開くにはSPACE

上矢印または下矢印を使用して、目的のリスト項目にスクロールします。

ENTERで目的のアイテムを選択します

ENTERでのみ、onchangeまたは(JQuery .change())イベントが発生します。

私は個人的にはシンプルなメニューのフォームコントロールを使用しませんが、フォームコントロールを使用してページのプレゼンテーションを変更するWebアプリケーションがたくさんあります(たとえば、並べ替え順)。これらは、AJAXによって実装され、新しいコンテンツをページ、または古い実装では、基本的にページリンクである新しいページの読み込みをトリガーします。

これらはフォームコントロールの有効な使用法です。



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>

このコードは質問に答えることがありますが、問題を解決する方法や理由に関する追加のコンテキストを提供することで、回答の長期的な価値が向上します。
rgmt

-7

このコードを試す

<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>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.