回答:
IEで同じ問題に直面しました(RJS /プロトタイプを使用してフォーカスを設定した後)。Firefoxはすでにフィールドに値がある場合、カーソルを最後に置いていました。IEはカーソルをテキストの先頭に強制していました。
私が到達した解決策は次のとおりです:
<input id="search" type="text" value="mycurrtext" size="30"
onfocus="this.value = this.value;" name="search"/>
これはIE7とFF3の両方で機能します
ほとんどのブラウザで機能させる簡単な方法があります。
this.selectionStart = this.selectionEnd = this.value.length;
ただし、いくつかのブラウザの*癖のため、より包括的な答えは次のようになります
setTimeout(function(){ that.selectionStart = that.selectionEnd = 10000; }, 0);
jQueryの使用 (リスナーを設定しますが、それ以外の場合は必要ありません)
バニラJSを使用する (この回答addEventから機能を借りる)
Chromeには奇妙な癖があり、カーソルがフィールドに移動する前にfocusイベントが発生します。これは私の簡単な解決策を台無しにします。これを修正する2つのオプション:
focusに変更できますmouseup。フォーカスを追跡し続けない限り、これはユーザーにとってかなり煩わしいことです。私はこれらのオプションのどちらにも本当に恋していません。また、@ vladkrasは、Operaの一部の古いバージョンでは、スペースがあると長さが正しく計算されないことを指摘しました。このためには、あなたの文字列よりも大きいはずの巨大な数を使うことができます。
this.selectionStart = this.selectionEnd = 0; これにより、入力ボックスの最初の文字の前にフォーカスが移動します。しかし、デバッグしたとき、selectionEndとselectionStartの値は変更されていません!また、最初のキャラクターには移動しません!!
selectionStartずlength、スペースでより少ない数を返すと報告されていました。そのため、10000代わりにthis.value.length(IE8とIE11でテスト済み)の代わりに十分な数を使用します
これを試してください、それは私のために働きました:
//input is the input element
input.focus(); //sets focus to element
var val = this.input.value; //store the value of the element
this.input.value = ''; //clear the value of the element
this.input.value = val; //set that value back.
カーソルを最後に移動するには、最初に入力にフォーカスがなければならず、次に値が変更されると最後に移動します。.valueを同じに設定しても、Chromeでは変更されません。
this.2、3、4行目の入力の前に置くのですか?これinputが入力要素であることはすでに知っています。使用thisは冗長に思われます。そうでなければ良い解決策!
$input.focus().val($input.val());
これで少しハッキングした後、私は最良の方法は setSelectionRange、ブラウザがサポートしている場合は関数。そうでない場合は、Mike Berrowの回答にあるメソッドの使用に戻ります(つまり、値をそれ自体で置き換えます)。
またscrollTop、縦方向にスクロール可能な場合に備えて、高い値に設定していますtextarea。(任意の高い値を使用する$(this).height()と、FirefoxやChrome よりも信頼性が高くなります。)
私はそれをjQueryプラグインとして作成しました。(jQueryを使用していない場合でも、要点は十分簡単に取得できます。)
IE6、IE7、IE8、Firefox 3.5.5、Google Chrome 3.0、Safari 4.0.4、Opera 10.00でテストしました。
jquery.comでPutCursorAtEndプラグインとして利用できます。便宜上、リリース1.0のコードは次のとおりです。
// jQuery plugin: PutCursorAtEnd 1.0
// http://plugins.jquery.com/project/PutCursorAtEnd
// by teedyay
//
// Puts the cursor at the end of a textbox/ textarea
// codesnippet: 691e18b1-f4f9-41b4-8fe8-bc8ee51b48d4
(function($)
{
jQuery.fn.putCursorAtEnd = function()
{
return this.each(function()
{
$(this).focus()
// If this function exists...
if (this.setSelectionRange)
{
// ... then use it
// (Doesn't work in IE)
// Double the length because Opera is inconsistent about whether a carriage return is one character or two. Sigh.
var len = $(this).val().length * 2;
this.setSelectionRange(len, len);
}
else
{
// ... otherwise replace the contents with itself
// (Doesn't work in Google Chrome)
$(this).val($(this).val());
}
// Scroll to the bottom, in case we're in a tall textarea
// (Necessary for Firefox and Google Chrome)
this.scrollTop = 999999;
});
};
})(jQuery);
<script type="text/javascript">
function SetEnd(txt) {
if (txt.createTextRange) {
//IE
var FieldRange = txt.createTextRange();
FieldRange.moveStart('character', txt.value.length);
FieldRange.collapse();
FieldRange.select();
}
else {
//Firefox and Opera
txt.focus();
var length = txt.value.length;
txt.setSelectionRange(length, length);
}
}
</script>
この機能は、IE9、Firefox 6.x、およびOpera 11.xで動作します
SCRIPT16389: Unspecified error.
私はクロムでかなりの成功を収めて以下を試しました
$("input.focus").focus(function () {
var val = this.value,
$this = $(this);
$this.val("");
setTimeout(function () {
$this.val(val);
}, 1);
});
簡単な要約:
クラスフォーカスのあるすべての入力フィールドを取得し、入力フィールドの古い値を変数に格納します。その後、空の文字列を入力フィールドに適用します。
次に、1ミリ秒待機してから、古い値を再度入力します。
それは2019年であり、上記の方法のどれも私にとってはうまくいきませんでしたが、これはhttps://css-tricks.com/snippets/javascript/move-cursor-to-end-of-input/から取られたものでした
function moveCursorToEnd(id) {
var el = document.getElementById(id)
el.focus()
if (typeof el.selectionStart == "number") {
el.selectionStart = el.selectionEnd = el.value.length;
} else if (typeof el.createTextRange != "undefined") {
var range = el.createTextRange();
range.collapse(false);
range.select();
}
}
<input id="myinput" type="text" />
<a href="#" onclick="moveCursorToEnd('myinput')">Move cursor to end</a>
el.focus()たelse ifため、一部のケースでは機能しませんでした。私はこれが現在クロムと(震動) IE で動作することを確認しました
シンプル。値を編集または変更するときは、最初にフォーカスを置き、次に値を設定します。
$("#catg_name").focus();
$("#catg_name").val(catg_name);
それでも中間変数が必要です(var val =を参照)。それ以外の場合、カーソルの動作がおかしいので、最後に必要です。
<body onload="document.getElementById('userinput').focus();">
<form>
<input id="userinput" onfocus="var val=this.value; this.value=''; this.value= val;"
class=large type="text" size="10" maxlength="50" value="beans" name="myinput">
</form>
</body>
el.setSelectionRange(-1, -1);
https://codesandbox.io/s/peaceful-bash-x2mti
このメソッドは、1回の呼び出しでHTMLInputElement.selectionStart、selectionEnd、およびselectionDirectionプロパティを更新します。
https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange
他のjsメソッドで-1は通常、(最後の)文字を意味します。これもこれに当てはまりますが、ドキュメントでこの動作の明示的な言及を見つけることができませんでした。
すべてのブラウザーのすべての場合:
function moveCursorToEnd(el) {
window.setTimeout(function () {
if (typeof el.selectionStart == "number") {
el.selectionStart = el.selectionEnd = el.value.length;
} else if (typeof el.createTextRange != "undefined") {
var range = el.createTextRange();
range.collapse(false);
range.select();
}
}, 1);
}
onFocusイベントハンドラーからカーソルを移動する必要がある場合はタイムアウトが必要
受け入れられた回答はとても気に入っていますが、Chromeでは機能しなくなりました。Chromeでは、カーソルを最後に移動するには、入力値を変更する必要があります。解決策は次のとおりです。
<input id="search" type="text" value="mycurrtext" size="30"
onfocus="var value = this.value; this.value = null; this.value = value;" name="search"/>
jQueryでは、それは
$(document).ready(function () {
$('input').focus(function () {
$(this).attr('value',$(this).attr('value'));
}
}
この問題は興味深いものです。それについて最も混乱することは、私が見つけた解決策が問題を完全に解決しなかったことです。
+++++++ソリューション+++++++
次のようなJS関数が必要です。
function moveCursorToEnd(obj) {
if (!(obj.updating)) {
obj.updating = true;
var oldValue = obj.value;
obj.value = '';
setTimeout(function(){ obj.value = oldValue; obj.updating = false; }, 100);
}
}onfocusイベントとonclickイベントでこの人を呼び出す必要があります。
<input type="text" value="Test Field" onfocus="moveCursorToEnd(this)" onclick="moveCursorToEnd(this)">それはすべてのデバイスとブラウザで動作します!!!!
var valsrch = $('#search').val();
$('#search').val('').focus().val(valsrch);
これは多くの回答がある古い質問かもしれませんが、私は同様の問題に出くわしました、そして、回答のどれも私が望んでいたものでなかったか、不十分に説明されました。selectionStartプロパティとselectionEndプロパティの問題は、入力タイプ番号には存在しないことです(テキストタイプについて質問されましたが、他の入力タイプがあり、フォーカスする必要がある他の人に役立つかもしれません)。したがって、関数がフォーカスする入力タイプがタイプ番号であるかどうかわからない場合は、そのソリューションを使用できません。
クロスブラウザーおよびすべての入力タイプに対して機能するソリューションは、かなり単純です。
このようにして、カーソルは入力要素の末尾にあります。
だからあなたがやろうとしていることはこのようなものです(フォーカスしたい要素セレクターがクリックされた要素の「data-focus-element」データ属性を介してアクセス可能であり、関数が「.foo」をクリックした後に実行される場合、jqueryを使用します素子):
$('.foo').click(function() {
element_selector = $(this).attr('data-focus-element');
$focus = $(element_selector);
value = $focus.val();
$focus.focus();
$focus.val(value);
});
なぜこれが機能するのですか?単純に、.focus()が呼び出されると、入力要素の先頭にフォーカスが追加され(ここでの中心的な問題です)、入力要素にすでに値があるという事実は無視されます。ただし、入力の値が変更されると、カーソルは入力要素内の値の末尾に自動的に置かれます。そのため、以前に入力に入力したのと同じ値で値をオーバーライドすると、値は変更されないように見えますが、カーソルは最後に移動します。
テキスト領域をクリックしたときにカーソルをテキストの最後に設定します...このコードのバリエーションは...また動作します!Firefox、IE、Safari、Chrome用。
サーバー側コード:
txtAddNoteMessage.Attributes.Add("onClick", "sendCursorToEnd('" & txtAddNoteMessage.ClientID & "');")
JavaScriptでは:
function sendCursorToEnd(obj) {
var value = $(obj).val(); //store the value of the element
var message = "";
if (value != "") {
message = value + "\n";
};
$(obj).focus().val(message);
$(obj).unbind();
}
最初に値を設定してからフォーカスを設定すると、カーソルは常に最後に表示されます。
$("#search-button").click(function (event) {
event.preventDefault();
$('#textbox').val('this');
$("#textbox").focus();
return false;
});
これがテストするフィドルです https://jsfiddle.net/5on50caf/1/
contenteditable = trueである「div」要素の末尾にカーソルを置きたかったのですが、Xeoncrossコードで解決策を得ました。
<input type="button" value="Paste HTML" onclick="document.getElementById('test').focus(); pasteHtmlAtCaret('<b>INSERTED</b>'); ">
<div id="test" contenteditable="true">
Here is some nice text
</div>
そして、この関数は魔法をかけます:
function pasteHtmlAtCaret(html) {
var sel, range;
if (window.getSelection) {
// IE9 and non-IE
sel = window.getSelection();
if (sel.getRangeAt && sel.rangeCount) {
range = sel.getRangeAt(0);
range.deleteContents();
// Range.createContextualFragment() would be useful here but is
// non-standard and not supported in all browsers (IE9, for one)
var el = document.createElement("div");
el.innerHTML = html;
var frag = document.createDocumentFragment(), node, lastNode;
while ( (node = el.firstChild) ) {
lastNode = frag.appendChild(node);
}
range.insertNode(frag);
// Preserve the selection
if (lastNode) {
range = range.cloneRange();
range.setStartAfter(lastNode);
range.collapse(true);
sel.removeAllRanges();
sel.addRange(range);
}
}
} else if (document.selection && document.selection.type != "Control") {
// IE < 9
document.selection.createRange().pasteHTML(html);
}
}
ほとんどのブラウザで問題なく動作します。確認してください。このコードはテキストを配置し、div要素(input要素ではない)のテキストの最後にフォーカスを置きます
https://jsfiddle.net/Xeoncross/4tUDk/
ありがとう、Xeoncross
私も同じ問題に直面しました。最後にこれは私のために働くつもりです:
jQuery.fn.putCursorAtEnd = = function() {
return this.each(function() {
// Cache references
var $el = $(this),
el = this;
// Only focus if input isn't already
if (!$el.is(":focus")) {
$el.focus();
}
// If this function exists... (IE 9+)
if (el.setSelectionRange) {
// Double the length because Opera is inconsistent about whether a carriage return is one character or two.
var len = $el.val().length * 2;
// Timeout seems to be required for Blink
setTimeout(function() {
el.setSelectionRange(len, len);
}, 1);
} else {
// As a fallback, replace the contents with itself
// Doesn't work in Chrome, but Chrome supports setSelectionRange
$el.val($el.val());
}
// Scroll to the bottom, in case we're in a tall textarea
// (Necessary for Firefox and Chrome)
this.scrollTop = 999999;
});
};
これは、これを呼び出す方法です。
var searchInput = $("#searchInputOrTextarea");
searchInput
.putCursorAtEnd() // should be chainable
.on("focus", function() { // could be on any event
searchInput.putCursorAtEnd()
});
サファリ、IE、Chrome、Mozillaで動作します。モバイルデバイスでは、これを試していません。
//fn setCurPosition
$.fn.setCurPosition = function(pos) {
this.focus();
this.each(function(index, elem) {
if (elem.setSelectionRange) {
elem.setSelectionRange(pos, pos);
} else if (elem.createTextRange) {
var range = elem.createTextRange();
range.collapse(true);
range.moveEnd('character', pos);
range.moveStart('character', pos);
range.select();
}
});
return this;
};
// USAGE - Set Cursor ends
$('#str1').setCurPosition($('#str1').val().length);
// USAGE - Set Cursor at 7 position
// $('#str2').setCurPosition(7);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<p>Set cursor at any position</p>
<p><input type="text" id="str1" value="my string here" /></p>
<p><input type="text" id="str2" value="my string here" /></p>
以前に提案を試しましたが、うまくいきませんでした(Chromeでテストしました)。自分でコードを記述しました。Firefox、IE、Safari、Chromeでも問題なく動作します...
Textarea:
onfocus() = sendCursorToEnd(this);
JavaScriptでは:
function sendCursorToEnd(obj) {
var value = obj.value; //store the value of the element
var message = "";
if (value != "") {
message = value + "\n";
};
$(obj).focus().val(message);}
ここに私の答えのjsFiddleデモがあります。デモではCoffeeScriptを使用していますが、必要に応じてプレーンJavaScriptに変換できます。
JavaScriptの重要な部分:
var endIndex = textField.value.length;
if (textField.setSelectionRange) {
textField.setSelectionRange(endIndex, endIndex);
}
この質問を投稿したのは、同じ質問を持つ他の人のためにすでに書いたからです。この回答は、ここでの上位の回答ほど多くのエッジケースをカバーしていませんが、私にとってはうまくいき、あなたが操作できるjsFiddleデモがあります。
jsFiddleのコードを次に示します。jsFiddleが消えても、この回答は保持されます。
moveCursorToEnd = (textField) ->
endIndex = textField.value.length
if textField.setSelectionRange
textField.setSelectionRange(endIndex, endIndex)
jQuery ->
$('.that-field').on 'click', ->
moveCursorToEnd(this)
<div class="field">
<label for="pressure">Blood pressure</label>:
<input class="that-field" type="text" name="pressure" id="pressure" value="24">
</div>
<p>
Try clicking in the text field. The cursor will always jump to the end.
</p>
body {
margin: 1em;
}
.field {
margin-bottom: 1em;
}
次のコードを試してください:
$('input').focus(function () {
$(this).val($(this).val());
}).focus()
setSelectionRangeアプローチは、サポートされている場合とサポートされている場合には、はるかに効率的です。
返答は遅すぎますが、今後の問い合わせには役立ちます。また、contenteditablediv でも機能します。
最後にフォーカスを設定する必要がある場所から。このコードを書いてください
var el = document.getElementById("your_element_id");
placeCaretAtEnd(el);
そして機能は-
function placeCaretAtEnd(el) {
el.focus();
if (typeof window.getSelection != "undefined"
&& typeof document.createRange != "undefined") {
var range = document.createRange();
range.selectNodeContents(el);
range.collapse(false);
var sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
} else if (typeof document.body.createTextRange != "undefined") {
var textRange = document.body.createTextRange();
textRange.moveToElementText(el);
textRange.collapse(false);
textRange.select();
}
}