jquery入力フォーカス上のすべてを選択


327

このコードを使用して、ユーザーがフィールドにフォーカスしたときにフィールド内のすべてのテキストを選択しようとします。何が起こるかというと、1秒間すべてを選択してから、選択を解除し、クリックしたところに入力カーソルが残っている...

$("input[type=text]").focus(function() {
   $(this).select();
});

すべてを選択したままにしておきたい。


どのブラウザですか、FFで私には問題なく動作しているようです。
R0MANARMY

8
Chromeは=このいずれかの失敗
wowo_999

1
私はChromeを使用していましたが、.click()が問題を解決します:)
Tim

4
注:ここで受け入れられた答えは問題の半分しか解決しません。選択は機能しますが、その後のクリックで選択を解除することが難しくなります。よりよい解決策はここで見つけることができます:stackoverflow.com/questions/3380458/...
SDC

回答:


481

click代わりに使用してみてくださいfocus。マウスイベントとキーイベントの両方で機能するようです(少なくともChrome / Macでは)。

jQuery <バージョン1.7:

$("input[type='text']").click(function () {
   $(this).select();
});

jQueryバージョン1.7以降:

$("input[type='text']").on("click", function () {
   $(this).select();
});

ここにデモがあります


62
問題は、マウスでテキストの一部を選択できないことです。クリックすると、テキスト全体が選択されます。
Helin Wang 2013

6
私にとって実行可能な解決策ではありません。これにより、Wang氏が説明した問題が発生します。
マルケス

1
マウスのテキスト選択でも機能するNianpengによる以下の解決策があります。
Philibert Perusse 2013年

4
@AwQiruiGuo $ .fn.on( 'click'、..)は、より少ないメモリを使用し、動的に追加された子要素を処理できます。
リッキー・ボイス、

7
これは、タブでフィールドをフォーカスする場合には機能しません。
Colin Breame 2013

65

私はこれが起こると思います:

focus()
   UI tasks related to pre-focus
   callbacks
       select()
   UI tasks related to focus (which unselect again)

回避策はselect()を非同期に呼び出すことで、focus()の後に完全に実行されるようにすることができます。

$("input[type=text]").focus(function() { 
    var save_this = $(this);
    window.setTimeout (function(){ 
       save_this.select(); 
    },100);
});

3
$( "input [type = text]")。focus(function(){var save_this = $(this); window.setTimeout(function(){save_this.select();}、100);});
etienne

@etienne:ああ、良い点:の処理はthisそのようなスコープでは少し予想外です。コードを更新します。
Piskvorが建物を去った

3
タイムアウト値0も問題ないようで、 "focusin()"関数もこのメソッドで機能します。
タンギー2013年

4
はい、期間を設定する必要すらありません。タイムアウトは現在の呼び出しスタックの最後で実行されるため、0で問題ありません。これは、フォーカスイベントとクリックイベントがすべて発生し、関数が実行されることを意味します
Joshua Bambrick 2013

1
タイムアウト0には、後のフレームで「クリック」イベントが発生し、ボックスを再び選択解除するという問題があるようです。目立った遅延が、より信頼性の高い0より-そのタイムアウト10はかなりよく働くようでない私を見つける
philh

57

これはより良い解決策だと思います。onclickイベントで単に選択するのとは異なり、マウスでテキストを選択/編集することはできます。IE8を含む主要なレンダリングエンジンで動作します。

$('input').on('focus', function (e) {
    $(this)
        .one('mouseup', function () {
            $(this).select();
            return false;
        })
        .select();
});

http://jsfiddle.net/25Mab/9/


4
これは既存のフィールドでのみ機能します。これは、新しい入力フィールドにバインドするための更新です:jsfiddle.net
adriaan

時々クリックせずにフォーカスを与えることができ、これはそれをうまく処理します。そのため、これは私にとって最も明確な答えです。クリックするのではなく、入力がフォーカスされるたびにぶら下がるイベントリスナーが存在する可能性がありますが... setTimeoutよりはるかに優れています
ilovett

これにより、数値入力内で2回目のクリックを行って、マウスでテキストの別の部分を選択することはできません。2番目を削除しても機能するselect()ようです。
dperish

さらに追加$('input[autofocus]').select();
Daniel Bleisteiner

38

ここには適切な回答がいくつかあり、@ user2072367が私のお気に入りですが、クリックではなくタブでフォーカスすると予期しない結果になります。(予期しない結果:タブを介してフォーカスした後にテキストを通常選択するには、もう一度クリックする必要があります)

このフィドルはその小さなバグを修正し、追加の$(this)を変数に格納して、冗長なDOM選択を回避します。見てみな!(:

IEでテスト済み> 8

$('input').on('focus', function() {
    var $this = $(this)
        .one('mouseup.mouseupSelect', function() {
            $this.select();
            return false;
        })
        .one('mousedown', function() {
            // compensate for untriggered 'mouseup' caused by focus via tab
            $this.off('mouseup.mouseupSelect');
        })
        .select();
});

2
+1 your'sと@ user2072367'sのソリューションは、このスレッド全体で最もクリーンであり、より早くトップに到達する方法があったらいいのにと思います。
KyleMit 14

1
ユーザーが自分ですべてのテキストを選択しようとした場合でも機能します。
Vitani 2014

私にとって、これはWindows 8.1のie11では機能しません。Windows 7およびWindows 10のie11で機能します
Lars Thomas Bredland

1
@LarsThomasBredland勝利8.1 + ie11を試したところ、期待どおりに動作しました。あなたにとってそれについて何が「うまくいかない」のですか?
animatedgif

何も選択しません。(私は別のwin8でテストしましたが、そこで動作します-同じosレベルとieバージョン)
Lars Thomas Bredland

21

慎重に検討した後、このスレッド内のはるかにクリーンなソリューションとしてこれを提案します。

$("input").focus(function(){
    $(this).on("click.a keyup.a", function(e){      
        $(this).off("click.a keyup.a").select();
    });
});

jsFiddleのデモ

問題:

ここに少し説明があります:

まず、フィールドにマウスまたはタブで移動したときのイベントの順序を見てみましょう。
次のように、関連するすべてのイベントをログに記録できます。

$("input").on("mousedown focus mouseup click blur keydown keypress keyup change",
              function(e) { console.log(e.type); });

フォーカスイベント

:私はこのソリューションを後でイベントパイプラインで発生するのclickではなく使用するように変更mouseupし、@ Jocieのコメントに従ってFirefoxでいくつかの問題を引き起こしているようです

一部のブラウザは、mouseupまたはclickイベント中にカーソルを配置しようとします。キャレットを1つの位置から開始し、ドラッグしてテキストを強調表示する場合があるので、これは理にかなっています。実際にマウスを持ち上げるまで、キャレットの位置を指定することはできません。そのため、処理focusする関数は応答が早すぎて、ブラウザがあなたの位置を上書きするようにしておきます。

しかし、問題は、フォーカスイベントを本当に処理したいということです。これは、誰かがフィールドに初めて入ったときに知らせます。その後は、ユーザーの選択動作をオーバーライドし続けたくありません。

ソリューション:

代わりに、focusイベントハンドラー内で、発生するclick(クリックkeyupイン)イベントと(タブイン)イベントのリスナーをすばやくアタッチできます。

:タブイベントのキーアップは、実際には前のフィールドではなく、新しい入力フィールドで発生します

イベントを1回だけ起動します。を使用することもできます.one("click keyup)が、これにより、イベントタイプごとにイベントハンドラが1回呼び出されます。代わりに、マウスアップまたはキーアップが押されるとすぐに、関数を呼び出します。まず最初に、両方のハンドラーを削除します。そうすれば、タブで移動したか、マウスで移動したかは関係ありません。関数は1回だけ実行する必要があります。

:ほとんどのブラウザはタブイベント中にすべてのテキストを自然に選択しますが、animatedgifが指摘したように、keyupイベントを処理する必要があります。そうしないと、mouseupタブを挿入したときにいつでもイベントが残ります。両方をリッスンして、選択を処理したらすぐにリスナーをオフにします。

これでselect()、ブラウザが選択を行った後に呼び出すことができるため、デフォルトの動作を確実にオーバーライドします。

最後に、保護を強化するために、および関数にイベントの名前空間を追加して、メソッドが他のリスナーを削除しないようにすることができます。mouseupkeyup.off()


IE 10以降、FF 28以降、Chrome 35以降でテスト済み


または、jQueryを、呼び出されonce関数で拡張したい場合は、任意の数のイベントに対して1回だけ実行されます

$.fn.once = function (events, callback) {
    return this.each(function () {
        var myCallback = function (e) {
            callback.call(this, e);
            $(this).off(events, myCallback);
        };
        $(this).on(events, myCallback);
    });
};

次に、次のようにコードをさらに簡略化できます。

$("input").focus(function(){
    $(this).once("click keyup", function(e){      
        $(this).select();
    });
});

フィドルのデモ


Windows上のFirefox 31では、2つのテキストボックスの間をクリックすると、コードは1回おきのクリックでのみテキストを選択します
Vitani

1
@Jocie、なぜそれが交互になっているのかはわかりませんが、FFはclick、パイプラインのさらに下のイベントでテキスト選択を処理するようですmouseup。ブラウザをオーバーライドする可能性が最も高くなるように、選択の終わりをできるだけ遅く処理したいので、mouseupの代わりにclickを使用するとうまくいきます。FF、Chrome、IEでテスト済み。
KyleMit 2014年

1
ありがとうございました!最後に、すべてのブラウザーで実際に機能するソリューション!
Vincent

1
はい!これも私にとってはうまくいきました!ありがとうございました。これが公式の答えであるはずです
Fandango68 '16

1
@RiZKiTは、one「ハンドラーはイベントタイプごとに要素ごとに1回実行されます。それにより、発生したイベントを自動的にオフにしますが、他のハンドラーは引き続き残りoff、いずれにせよ両方を処理します。質問:任意の数のイベントに対して1回だけ実行される関数
KyleMit 2016年

13

これにより作業が行われ、テキストの一部をマウスで選択できなくなるという問題が回避されます。

$("input[type=text]").click(function() {
    if(!$(this).hasClass("selected")) {
        $(this).select();
        $(this).addClass("selected");
    }
});
$("input[type=text]").blur(function() {
    if($(this).hasClass("selected")) {
        $(this).removeClass("selected");
    }
});

1
マウスでテキストの一部を選択する機能を維持することが重要です。私はこれとそのA1を使用しています
Philibert Perusse 2013年

2
ここであまりにも多くのことを行うには、user2072367のフォーカス/マウスソリューションを
George

@George user2072367はかなり良いですが、いくつか重大な欠陥があります。私の解決策をチェックしてください(:
animatedgif

6

このバージョンはiOSで動作し、Windows Chromeでの標準のドラッグによる選択を修正します

var srcEvent = null;

$("input[type=text],input[type=number]")

    .mousedown(function (event) {
        srcEvent = event;
    })

    .mouseup(function (event) {
        var delta = Math.abs(event.clientX - srcEvent.clientX) 
                  + Math.abs(event.clientY - srcEvent.clientY);

        var threshold = 2;
        if (delta <= threshold) {
                   try {
                        // ios likes this but windows-chrome does not on number fields
                        $(this)[0].selectionStart = 0;
                        $(this)[0].selectionEnd = 1000;
                    } catch (e) {
                        // windows-chrome likes this
                        $(this).select();
                    }
        }
    });

http://jsfiddle.net/Zx2sc/2/


ブラウザーを緩和するために醜いtry / catchを追加するために編集
anihilnine

5

これらのソリューションのほとんどの問題は、入力フィールド内のカーソル位置を変更すると、正しく機能しないことです。

このonmouseupイベントは、フィールド内のカーソル位置を変更します。フィールドはその後に発生しますonfocus(少なくともChromeとFF内で)。無条件に破棄するmouseupと、ユーザーはマウスでカーソル位置を変更できなくなります。

function selectOnFocus(input) {
    input.each(function (index, elem) {
        var jelem = $(elem);
        var ignoreNextMouseUp = false;

        jelem.mousedown(function () {
            if (document.activeElement !== elem) {
                ignoreNextMouseUp = true;
            }
        });
        jelem.mouseup(function (ev) {
            if (ignoreNextMouseUp) {
                ev.preventDefault();
                ignoreNextMouseUp = false;
            }
        });
        jelem.focus(function () {
            jelem.select();
        });
    });
}
selectOnFocus($("#myInputElement"));

mouseupフィールドに現在フォーカスがない場合、コードは条件付きでデフォルトの動作を防止します。次の場合に機能します。

  • フィールドがフォーカスされていないときにクリック
  • フィールドにフォーカスがあるときにクリック
  • フィールドにタブで移動する

私はこれをChrome 31、FF 26、IE 11でテストしました。


これはクリックイベントに対して完全に機能しますが、タブを使用して次の入力フィールドに移動すると、コンテンツがすぐに選択および選択
解除されることがわかります

4

このスレッドを読んで素晴らしいソリューションを見つけました

$(function(){

    jQuery.selectText('input:text');
    jQuery.selectText('input:password');

});

jQuery.extend( {
    selectText: function(s) { 
        $(s).live('focus',function() {
            var self = $(this);
            setTimeout(function() {self.select();}, 0);
        });
    }
});

...これは本質的にPiskvorの答えと同じです。
オリバー

他のすべてのHTML5テキストタイプを忘れないでください。たとえば、「input [type = email]」
jamiebarrow

3

私は2016年後半から来て、このコードは最近のバージョンのjquery(この場合はjquery-2.1.3.js)で動作します。

if ($(element).is("input")) {
    $(element).focus(function () {
        $(element).select();
    });
}

2

私はFF 16.0.2とjquery 1.8.3を使用していますが、回答のすべてのコードが機能しませんでした。
私はこのようなコードを使用して動作します。

$("input[type=text]").focus().select();

4
これは、ユーザーがフィールドにフォーカスしたときに入力ボックスの内容を選択する方法であるという質問には答えません。これにより、ユーザーの入力なしで、コードがすぐにフォーカスおよび選択されます。
ソース

@saluce意味がわからない?質問者がフィールドを選択すると、現在のテキストがすべて選択されます。そして私のコードはそれをするべきです。私がこの答えを書くときのように、それを私のプロジェクトにも使用します。
GusDeCooL

1
このコードは実行時にすべてにフォーカスして選択しますが、コード自体は、テキストボックスのクリックなどのユーザー生成イベントに関連付けられていません。たとえば$("input[type=text]").on('click', function () { $(this).focus.select(); })、ユーザーがボックスをクリックしたときに実行されるため、ユーザーがボックスをクリックしたときにフォーカスと選択が発生します。イベントハンドラーがないと、コードは質問に答えないため、反対票とコメントが返されます。基本的に、「現在のテキストがすべて選択されている」部分は取得できますが、「フィールドを選択したとき」の部分は取得できません。
saluce

1
@GusDeCooLはおかしなことに十分です(これは彼が尋ねたとおりではありませんが)私はこれについて同じ結果を出したいと思っていました:)
Robbie Averill 2013年

2
var timeOutSelect;
$("input[type=text]").focus(function() { 
        var save_this = $(this);
        clearTimeout(timeOutSelect);
        timeOutSelect = window.setTimeout (function(){ 
                save_this.select(); 
        }, 100);
});

2つの入力をすばやく切り替える場合は、セキュリティを強化するためにclearTimeoutを使用します。clearTimeout古いタイムアウトを消去します...


詳細を編集してください。コードのみと「これを試す」の回答は、検索可能なコンテンツが含まれておらず、誰かが「これを試す」必要がある理由を説明していないため、お勧めしません。ここでは、知識のリソースとなるよう努力しています。
ブライアントンプセット-汤莱恩

2

ネイティブJavaScriptとうまく連携しますselect()

$("input[type=text]").focus(function(event) {
   event.currentTarget.select();
});

または一般的に:

$("input[type=text]")[0].select()

1

または、<input onclick="select()">Worksパーフェクトを使用することもできます。


いいえ、そうではありません。それは全体を選択するために機能します。ただし、テキストの一部を手動で選択しようとすると、選択できなくなります。
Sujay Phadke


0
<script>$.ready( $("input[type=text]").attr("onclick" , "this.select()"));<script>

何が起こっているかについての説明がないため、これはおそらく低品質の回答としてマークされます。
tumultous_rooster

あなた$.readyは正しくありません。attrドキュメントの準備ができるまでを遅延させるには、関数に関数を渡す必要があります。すぐにそれを行ってから、要素コレクションをに渡し$.readyます。
doug65536

また、「onclick」、特にこの方法は避けてください。を使用しaddEventListenerます。
doug65536

0

私は常にrequestAnimationFrame()内部のイベント後のメカニズムを飛び越えて使用しますが、これはFirefoxで完全に機能します。Chromeではテストしていません。

$("input[type=text]").on('focus', function() {
    requestAnimationFrame(() => $(this).select());
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.