クリック時にHTMLテキスト入力のすべてのテキストを選択する


555

HTML Webページにテキストボックスを表示する次のコードがあります。

<input type="text" id="userid" name="userid" value="Please enter the user ID" />

ページが表示されると、テキストに「ユーザーIDを入力しください」というメッセージが含まれます。ただし、すべてのテキストを選択するには、ユーザーが3回クリックする必要があることがわかりました(この場合は、ユーザーIDを入力してください)。

ワンクリックでテキスト全体を選択することは可能ですか?

編集:

すみません、言うのを忘れました:入力を使用する必要があります type="text"


6
より良いアプローチは<label>、ラベルではなくを使用することですvalue。JSとCSSを使用して同じように見せることができますが、それほどセマンティックではありません。dorward.me.uk/tmp/label-work/example.htmlには、jQueryを使用した例があります。
Quentin

12
または、最新のHTML5プロジェクトで作業している場合は、プレースホルダーを使用することもできます。
レオ・ラム

1
placeholder = "ユーザーIDを入力してください"
Marceloボーナス

回答:


910

次のJavaScriptスニペットを使用できます。

<input onClick="this.select();" value="Sample Text" />

しかし、どうやらそれはモバイルSafariでは機能しません。そのような場合、以下を使用できます。

<input onClick="this.setSelectionRange(0, this.value.length)" value="Sample Text" />

9
より一般的にするにはthis.id、クリックハンドラーの引数として使用できます。さらに良いことに、getElementById完全に排除thisして引数として渡すことができます。
Asad Saeeduddin

12
機能しないモバイルSafari。代わりにthis.setSelectionRange(0、9999)を呼び出してみてください。
Dean Radcliffe

43
@DanRadcliffeいいですね!this.setSelectionRange(0, this.value.length)代わりに使用します。
グリット2014年


8
ブラウザサポートの更新はありますか?w3schools.com/jsref/met_text_select.aspは、すべてのブラウザーでサポートされていると主張しています
Ayyash

65

以前に投稿されたソリューションには2つの癖があります。

  1. Chromeでは、.select()による選択は固執しません-わずかなタイムアウトを追加すると、この問題が解決します。
  2. フォーカス後の任意の位置にカーソルを置くことはできません。

フォーカスのあるすべてのテキストを選択し、フォーカスの後に特定のカーソルポイントを選択できる完全なソリューションを次に示します。

        $(function () {
            var focusedElement;
            $(document).on('focus', 'input', function () {
                if (focusedElement == this) return; //already focused, return so user can now place cursor at specific point in input.
                focusedElement = this;
                setTimeout(function () { focusedElement.select(); }, 100); //select all text in any field on focus for easy re-entry. Delay sightly to allow focus to "stick" before selecting.
            });
        });

7
ユーザーがフィールドから離れてクリックして戻った場合に対処するには、次を追加します.on('blur', 'input', function(){focusedElement = null;})
Tamlyn

1
0クロムとファイアフォックスの私のための作品のタイムアウト。のタイムアウト50がどこから来ているのかわからない。
thejoshwolfe 2015

1
解決策は、onFocusの代わりにonClickを使用することです。完璧に動作し、複雑なコードを必要としません。
Ismael

4
@CoryHouseタブを介したフォーカスはテキストをネイティブに選択するため、問題ではありません!JavaScriptは必要ありません。
Ismael

1
@CoryHouseは、4年経ってもコードが魅力的に機能します。男、お辞儀を。この少し汚いハックをありがとう。これが見つかるまで2〜3日探していました。:+1:
Rutvij Kothari 2017

47

HTML(ページで機能させるすべての入力にonclick属性を配置する必要があります)

 <input type="text" value="click the input to select" onclick="this.select();"/>

またはより良いオプション

jQuery(これはページ上のすべてのテキスト入力で機能し、htmlを変更する必要はありません):

<script  type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.js"></script>  
<script type="text/javascript">
    $(function(){
        $(document).on('click','input[type=text]',function(){ this.select(); });
    });
</script>

22
フォーム要素をタブで移動する人のためにクリックするよりも、おそらくフォーカスイベントにバインドする方が良いでしょう。
Andrew Ensley

7
@Andrew入力要素をタブで移動するとテキストが常に選択されるため、これは必要ありません。;-)
nietonfir 2013年

フォーカスイベントはグリッチですが、一方でぼかしイベントは、検証のトリガーやフォームの自動保存に役立ちます。
oLinkWebDevelopment 2014年

正常に動作するはずですが、jQueryの更新バージョンを使用していることを確認するか、古いバージョンでは$(document).live()を使用してください。
oLinkWebDevelopment 2014

2
ユーザーが既にjQueryを持っている場合を除き、より良いオプションはサードパーティのライブラリへの依存関係を追加することを含みません。
ロス

37

私はこれが古いことを知っていますが、最善のオプションはplaceholder、可能であれば新しいHTML属性を使用することです。

<input type="text" id="userid" name="userid" placeholder="Please enter the user ID" />

これにより、値が入力されない限りテキストが表示され、テキストを選択したり入力をクリアしたりする必要がなくなります。


2
プレースホルダーはdoctype htmlでのみ許可されていることに注意してください。
dogawaf 2014年

12

記載されている回答は、私によると部分的です。AngularとJQueryでこれを行う方法の2つの例を以下にリンクしました。

このソリューションには次の機能があります。

  • JQuery、Safari、Chrome、IE、Firefoxなどをサポートするすべてのブラウザーで動作します。
  • Phonegap / Cordovaに対応:AndroidとIO。
  • 入力がフォーカスを取得してから次のぼかしまでフォーカスを1回だけ選択してからフォーカスする
  • 複数の入力を使用でき、グリッチアウトしません。
  • Angularディレクティブは再利用に優れており、select-all-on-clickディレクティブを追加するだけです
  • jQueryは簡単に変更できます

JQuery: http ://plnkr.co/edit/VZ0o2FJQHTmOMfSPRqpH?p= preview

$("input").blur(function() {
  if ($(this).attr("data-selected-all")) {
  //Remove atribute to allow select all again on focus        
  $(this).removeAttr("data-selected-all");
  }
});

$("input").click(function() {
  if (!$(this).attr("data-selected-all")) {
    try {
      $(this).selectionStart = 0;
      $(this).selectionEnd = $(this).value.length + 1;
      //add atribute allowing normal selecting post focus
      $(this).attr("data-selected-all", true);
    } catch (err) {
      $(this).select();
      //add atribute allowing normal selecting post focus
      $(this).attr("data-selected-all", true);
    }
  }
});

Angular: http : //plnkr.co/edit/llcyAf?p=preview

var app = angular.module('app', []);
//add select-all-on-click to any input to use directive
app.directive('selectAllOnClick', [function() {
  return {
    restrict: 'A',
    link: function(scope, element, attrs) {
      var hasSelectedAll = false;
      element.on('click', function($event) {
        if (!hasSelectedAll) {
          try {
            //IOs, Safari, thows exception on Chrome etc
            this.selectionStart = 0;
            this.selectionEnd = this.value.length + 1;
            hasSelectedAll = true;
          } catch (err) {
            //Non IOs option if not supported, e.g. Chrome
            this.select();
            hasSelectedAll = true;
          }
        }
      });
      //On blur reset hasSelectedAll to allow full select
      element.on('blur', function($event) {
        hasSelectedAll = false;
      });
    }
  };
}]);

素晴らしいangularjsソリューション。THX。hasSelectedAllフラグは使用しませんが。これは、ユーザーがカーソルを配置したいことを意味する可能性がある2回目のクリックのための準備だと思います。
dewd

11

試してください:

onclick="this.select()"

それは私にとって素晴らしい働きをします。


11

いつでも使用できますdocument.execCommandすべての主要ブラウザでサポートされています

document.execCommand("selectall",null,false);

現在フォーカスされている要素のすべてのテキストを選択します。


これはエレガントなソリューションのようです。:完全なコードは次のようになります<input type="text" onclick="document.execCommand('selectall',null,false);" />
pipepiper

ええ、それはこの種のタスクを実行するための私のお気に入りの方法です、特に。それがために働くようcontenteditableにも要素。私はつまり、あなたはまた、それが少しでもよりエレガントにすることができると思う<input type="text" onfocus="document.execCommand('selectall')">-かなり確信して削除することができますnullし、falseあなたがそれらを使用しない場合。
Toastrackenigma

うん。onfocusより良いようですonclick。はい、一つはと離れて行うことができますnullfalse。ありがとう!
pipepiper 2016

これは、@ Corey Houseソリューションで言及されているタイムアウトを使用して、このクロスブラウザーを互換性のあるものにする必要があることに注意して、最良のクロスブラウザーソリューションであることに同意します。
エリックリース

1
を使用するonfocusと、Chromeで入力をクリックするとページ全体が選択されます。onclick正常に動作します。
robotik

8

onfocusイベントでの入力オートフォーカス:

<INPUT onfocus="this.select()" TYPE="TEXT" NAME="thing" autofocus>

これにより、目的の要素を選択してフォームを開くことができます。これは、オートフォーカスを使用して入力をヒットすることによって機能し、次にそれ自体にonfocusイベントを送信し、次に、テキストを選択します。


8

注:を検討するとonclick="this.select()"、最初のクリックですべての文字が選択されます。その後、入力内の何かを編集して文字間でもう一度クリックしたいのですが、すべての文字が再び選択されます。この問題を修正するonfocusには、の代わりに使用する必要がありますonclick


6

確かに使用しますonclick="this.select();"が、組み合わせないように注意してください。そのdisabled="disabled"場合は機能しません。手動で選択するか、マルチクリックして選択する必要があります。選択するコンテンツの値をロックする場合は、属性と組み合わせますreadonly


4

ショーバンの回答の再利用可能なバージョンは次のとおりです。

<input type="text" id="userid" name="userid"
 value="Please enter the user ID" onfocus="Clear(this);"
/>

function Clear(elem)
{
elem.value='';
}

そうすることで、複数の要素にクリアスクリプトを再利用できます。


4

交換できます

<input type="text" id="userid" name="userid" value="Please enter the user ID" />

と:

<input type="text" id="userid" name="userid" placeholder="Please enter the user ID" />

プレースホルダーは、何回もクリックしたり、Ctrl + Aを使用したりせずにテキストボックスに入力できるようにする方法として、値を置き換えるために使用されます。プレースホルダーは、値ではありませんが、名前がプレースホルダーを示唆しているように作成します。これは、「ここにユーザー名」または「メール」と書かれた複数のオンラインフォームで使用されているものであり、クリックすると「メール」が消え、すぐに入力を開始できます。


3

あなたが尋ねたことの正確な解決策は:

<input type="text" id="userid" name="userid" value="Please enter the user ID" onClick="this.setSelectionRange(0, this.value.length)"/>

しかし、入力のプレースホルダーまたはヒントとして「ユーザーIDを入力してください」を表示しようとしていると思います。したがって、より効率的なソリューションとして以下を使用できます。

<input type="text" id="userid" name="userid" placeholder="Please enter the user ID" />

3

以下はReactの例ですが、必要に応じてバニラJSのjQueryに変換できます。

class Num extends React.Component {

    click = ev => {
        const el = ev.currentTarget;
        if(document.activeElement !== el) {
            setTimeout(() => {
                el.select();    
            }, 0);
        }
    }

    render() {
        return <input type="number" min={0} step={15} onMouseDown={this.click} {...this.props} />
    }
}

ここでの秘訣は、「クリック」イベントが発生onMouseDownするまでに要素がすでにフォーカス受け取っいるため(そしてactiveElementチェックが失敗するため)使用することです。

このactiveElementチェックは、ユーザーが常に入力全体を再選択することなく、必要な場所にカーソルを配置できるようにするために必要です。

タイムアウトが必要なのは、そうしないとテキストが選択されてすぐに選択が解除されるためです。ブラウザがカーソル位置のチェックを後から実行していると思います。

そして最後に、Reactはイベントオブジェクトを再利用し、setTimeoutが発生するまでに合成イベントを失うため、Reactではel = ev.currentTargetが必要です。


Reactは新しいjQueryですか?
vpzomtrrfrt

@vpzomtrrfrt確かに:DJ / Kです。私はこれをReactで書いていて、SOポイントの数だけのためにReactを解除するつもりはありませんでした。取るか残すか:-)
mpen

これはどのようにReactの例ですか?これは、ネイティブJavaScriptの例です。
Cesar

2

クリックイベントをキャッチする際の問題は、テキスト内でクリックを繰り返すたびに再度選択されることですが、ユーザーはおそらくカーソルを再配置することを期待していました。

私にとってうまくいったのは、変数selectSearchTextOnClickを宣言し、デフォルトでtrueに設定することでした。クリックハンドラーは、変数がまだtrueかどうかをチェックします。trueの場合、変数をfalseに設定し、select()を実行します。次に、それをtrueに戻すblurイベントハンドラーを用意します。

これまでの結果は、私が期待する動作のようです。

(編集:誰かが提案したようにフォーカスイベントをキャッチしようとしたが、それはうまくいきませんでした。フォーカスイベントが発生した後、クリックイベントが発生し、テキストの選択がすぐに解除されます)。



2

このようなHTML <input type="text" value="click the input to select" onclick="javascript:textSelector(this)"/>

バインドなしのJavaScriptコード

function textSelector(ele){
    $(ele).select();
}

4
「javascript:」はhrefでのみ使用され、回避する必要があります。
user1133275

1

これは、TextBoxの通常のアクティビティです。

クリック1-フォーカスを設定

2/3クリック(ダブルクリック)-テキストを選択

ページが最初に読み込まれるときにTextBoxにフォーカスを設定して、「選択」を1つのダブルクリックイベントに減らすことができます。


1
また、2クリックは単語選択用、3クリックは行選択用です。
アーサー

1

入力フィールドで「値」の代わりに「プレースホルダー」を使用します。


0

AngularJSを使用している場合は、カスタムディレクティブを使用して簡単にアクセスできます。

define(['angular'], function () {
    angular.module("selectionHelper", [])
    .directive('selectOnClick', function () {
        return {
            restrict: 'A',
            link: function (scope, element, attrs) {                
                element.on('click', function () {
                    this.select();
                });
            }
        };
    });
});

これで、次のように使用できます。

<input type="text" select-on-click ... />

サンプルにはrequirejsが含まれているため、何かを使用する場合は最初と最後の行をスキップできます。


0

誰もがjQuery(検索フィールドに最適)を使用したページ読み込みでこれを実行したい場合は、ここが私の解決策です

jQuery.fn.focusAndSelect = function() {
    return this.each(function() {
        $(this).focus();
        if (this.setSelectionRange) {
            var len = $(this).val().length * 2;
            this.setSelectionRange(0, len);
        } else {
            $(this).val($(this).val());
        }
        this.scrollTop = 999999;
    });
};

(function ($) {
    $('#input').focusAndSelect();
})(jQuery);

この投稿に基づく。CSS-Tricks.comに感謝


0

ユーザーが要素を選択したときに置き換えられるプレースホルダーテキストを作成しようとしているだけの場合は、placeholder今日の属性を使用することが明らかにベストプラクティスです。ただし、フィールドがフォーカスを取得したときに現在の値をすべて選択する場合は、@ Cory Houseと@Toastrackenigmaの回答の組み合わせが最も標準的なようです。現在のフォーカス要素を設定/解放し、フォーカスされたときにすべてを選択するハンドラーを使用focusしたfocusoutイベント。angular2 / typescriptの例は次のとおりです(ただし、バニラjsに変換するのは簡単です)。

テンプレート:

<input type="text" (focus)="focus()" (focusout)="focusout()" ... >

成分:

private focused = false;

public focusout = (): void => {
    this.focused = false;
};

public focus = (): void => {
    if(this.focused) return;
    this.focused = true;

    // Timeout for cross browser compatibility (Chrome)
    setTimeout(() => { document.execCommand('selectall', null, false); });
};
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.