Respostas:
Eu enfrentei esse mesmo problema (depois de definir o foco através do RJS / protótipo) no IE. O Firefox já estava deixando o cursor no final quando já existe um valor para o campo. O IE estava forçando o cursor para o início do texto.
A solução que cheguei é a seguinte:
<input id="search" type="text" value="mycurrtext" size="30"
onfocus="this.value = this.value;" name="search"/>
Isso funciona no IE7 e no FF3
Existe uma maneira simples de fazê-lo funcionar na maioria dos navegadores.
this.selectionStart = this.selectionEnd = this.value.length;
No entanto, devido às peculiaridades * de alguns navegadores, uma resposta mais abrangente se parece mais com esta
setTimeout(function(){ that.selectionStart = that.selectionEnd = 10000; }, 0);
Usando jQuery (para definir o ouvinte, mas não é necessário caso contrário)
Usando o Vanilla JS ( addEvent
função de empréstimo desta resposta )
O Chrome possui uma peculiaridade ímpar, na qual o evento de foco é acionado antes que o cursor seja movido para o campo; que estraga minha solução simples. Duas opções para corrigir isso:
focus
para mouseup
. Isso seria muito chato para o usuário, a menos que você ainda acompanhasse o foco. Eu realmente não estou apaixonado por nenhuma dessas opções.Além disso, @vladkras apontou que algumas versões mais antigas do Opera calculam incorretamente o comprimento quando há espaços. Para isso, você pode usar um número enorme que deve ser maior que sua string.
this.selectionStart = this.selectionEnd = 0;
isso deve mover o foco antes da primeira letra da caixa de entrada. Mas, quando depurei, nem mudava o valor de selectionEnd e selectionStart! E também não movê-lo para o primeiro personagem !!
selectionStart
e length
retornando um número menor nos espaços. É por isso que eu uso 10000
ou qualquer outro número grande o suficiente, em vez de this.value.length
(testado no IE8 e IE11)
Tente isso, funcionou para mim:
//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.
Para que o cursor seja movido para o final, a entrada deve ter o foco primeiro e, quando o valor for alterado, ele será finalizado. Se você definir .value para o mesmo, não será alterado no chrome.
this.
na frente da entrada nas linhas 2, 3 e 4? Já sabemos que esse input
é o elemento de entrada. O uso this
parece redundante. Boa solução caso contrário!
$input.focus().val($input.val());
Depois de mexer um pouco com isso, achei a melhor maneira de usar a setSelectionRange
função se o navegador suportar; caso contrário, volte a usar o método na resposta de Mike Berrow (ou seja, substitua o valor por ele mesmo).
Também estou definindo scrollTop
um valor alto no caso de estarmos em uma rolagem vertical textarea
. (Usar um valor alto arbitrário parece mais confiável do que $(this).height()
no Firefox e Chrome.)
Eu fiz isso como um plugin jQuery. (Se você não estiver usando o jQuery, confio em que você ainda consiga entender o conteúdo com facilidade).
Eu testei no IE6, IE7, IE8, Firefox 3.5.5, Google Chrome 3.0, Safari 4.0.4, Opera 10.00.
Está disponível no jquery.com como o plug-in PutCursorAtEnd . Para sua conveniência, o código da versão 1.0 é o seguinte:
// 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>
Essa função funciona para mim no IE9, Firefox 6.xe Opera 11.x
SCRIPT16389: Unspecified error.
Eu tentei o seguinte com muito sucesso no chrome
$("input.focus").focus(function () {
var val = this.value,
$this = $(this);
$this.val("");
setTimeout(function () {
$this.val(val);
}, 1);
});
Resumo rápido:
Ele pega todos os campos de entrada com o foco da classe e, em seguida, armazena o valor antigo do campo de entrada em uma variável, depois aplica a string vazia ao campo de entrada.
Então ele espera 1 milissegundo e coloca o valor antigo novamente.
É 2019 e nenhum dos métodos acima funcionou para mim, mas este funcionou, retirado de 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()
no, else if
então não estava funcionando em alguns casos. Eu verifiquei que isso funciona agora no chrome e no (shudder) IE
Simples. Ao editar ou alterar valores, primeiro coloque o foco e depois defina o valor.
$("#catg_name").focus();
$("#catg_name").val(catg_name);
Ainda é necessária a variável intermediária (veja var val =), caso contrário o cursor se comporta de forma estranha, precisamos dela no final.
<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
Este método atualiza as propriedades HTMLInputElement.selectionStart, selectionEnd e selectionDirection em uma chamada.
https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange
Em outros métodos js, -1
geralmente significa (para o) último caractere. Esse também é o caso deste, mas não consegui encontrar menção explícita desse comportamento nos documentos.
Para todos os navegadores para todos os casos:
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);
}
Tempo limite necessário se você precisar mover o cursor do manipulador de eventos onFocus
Gosto muito da resposta aceita, mas ela parou de funcionar no Chrome. No Chrome, para que o cursor chegue ao fim, o valor de entrada precisa ser alterado. A solução é a seguinte:
<input id="search" type="text" value="mycurrtext" size="30"
onfocus="var value = this.value; this.value = null; this.value = value;" name="search"/>
Esse problema é interessante. A coisa mais confusa é que nenhuma solução que encontrei resolveu o problema completamente.
+++++++ SOLUÇÃO +++++++
Você precisa de uma função JS, assim:
function moveCursorToEnd(obj) {
if (!(obj.updating)) {
obj.updating = true;
var oldValue = obj.value;
obj.value = '';
setTimeout(function(){ obj.value = oldValue; obj.updating = false; }, 100);
}
}
Você precisa ligar para esse cara nos eventos onfocus e onclick.
<input type="text" value="Test Field" onfocus="moveCursorToEnd(this)" onclick="moveCursorToEnd(this)">
FUNCIONA EM TODOS OS DISPOSITIVOS E NAVEGADORES !!!!
Acabei de descobrir que, no iOS, a textarea.textContent
propriedade de configuração colocará o cursor no final do texto no elemento textarea toda vez. O comportamento foi um bug no meu aplicativo, mas parece ser algo que você pode usar intencionalmente.
var valsrch = $('#search').val();
$('#search').val('').focus().val(valsrch);
Embora essa possa ser uma pergunta antiga com muitas respostas, deparei-me com um problema semelhante e nenhuma das respostas era exatamente o que eu queria e / ou foi mal explicada. O problema com as propriedades selectionStart e selectionEnd é que elas não existem para o número do tipo de entrada (enquanto a pergunta foi feita para o tipo de texto, acho que isso pode ajudar outras pessoas que possam ter outros tipos de entrada que precisam focar). Portanto, se você não souber se o tipo de entrada que a função focalizará é um número de tipo ou não, não poderá usar essa solução.
A solução que funciona em vários navegadores e para todos os tipos de entrada é bastante simples:
Dessa forma, o cursor está no final do elemento de entrada.
Então, tudo o que você faria é algo assim (usando jquery, desde que o seletor de elemento que se deseja focar seja acessível por meio do atributo de dados 'elemento de foco de dados' do elemento clicado e a função seja executada após clicar em '.foo' elemento):
$('.foo').click(function() {
element_selector = $(this).attr('data-focus-element');
$focus = $(element_selector);
value = $focus.val();
$focus.focus();
$focus.val(value);
});
Por que isso funciona? Simplesmente, quando o .focus () é chamado, o foco será adicionado ao início do elemento de entrada (que é o principal problema aqui), ignorando o fato de que o elemento de entrada já possui um valor. No entanto, quando o valor de uma entrada é alterado, o cursor é automaticamente colocado no final do valor dentro do elemento de entrada. Portanto, se você substituir o valor pelo mesmo valor que foi inserido anteriormente na entrada, o valor parecerá intocado, o cursor, no entanto, será movido para o final.
Experimente este funciona com Vanilla JavaScript.
<input type="text" id="yourId" onfocus=" let value = this.value; this.value = null; this.value=value" name="nameYouWant" class="yourClass" value="yourValue" placeholder="yourPlaceholder...">
Em Js
document.getElementById("yourId").focus()
Coloque o cursor quando clicar na área de texto no final do texto ... A variação deste código é ... TAMBÉM funciona! para Firefox, IE, Safari, Chrome ..
No código do servidor:
txtAddNoteMessage.Attributes.Add("onClick", "sendCursorToEnd('" & txtAddNoteMessage.ClientID & "');")
Em 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();
}
Se você definir o valor primeiro e depois o foco, o cursor sempre aparecerá no final.
$("#search-button").click(function (event) {
event.preventDefault();
$('#textbox').val('this');
$("#textbox").focus();
return false;
});
Aqui está o violino para testar https://jsfiddle.net/5on50caf/1/
Eu queria colocar o cursor no final de um elemento "div" em que contenteditable = true e obtive uma solução com o código 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>
E essa função faz mágica:
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);
}
}
Funciona bem para a maioria dos navegadores, verifique, este código coloca o texto e coloca o foco no final do texto no elemento div (não no elemento de entrada)
https://jsfiddle.net/Xeoncross/4tUDk/
Obrigado, Xeoncross
Eu também enfrentei o mesmo problema. Finalmente isso vai funcionar para mim:
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;
});
};
É assim que podemos chamar isso:
var searchInput = $("#searchInputOrTextarea");
searchInput
.putCursorAtEnd() // should be chainable
.on("focus", function() { // could be on any event
searchInput.putCursorAtEnd()
});
Funciona para mim no safari, IE, Chrome, Mozilla. Em dispositivos móveis, não tentei isso.
//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>
Eu tentei as sugestões antes, mas nenhuma funcionou para mim (as testei no Chrome), então escrevi meu próprio código - e funciona bem no Firefox, IE, Safari, Chrome ...
Na área de texto:
onfocus() = sendCursorToEnd(this);
Em 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);}
Aqui está uma demonstração do jsFiddle da minha resposta. A demonstração usa o CoffeeScript, mas você pode convertê-lo em JavaScript simples, se necessário.
A parte importante, em JavaScript:
var endIndex = textField.value.length;
if (textField.setSelectionRange) {
textField.setSelectionRange(endIndex, endIndex);
}
Estou postando esta resposta porque já a escrevi para outra pessoa que teve a mesma pergunta. Essa resposta não cobre tantos casos extremos quanto as principais respostas aqui, mas funciona para mim e tem uma demonstração do jsFiddle com a qual você pode brincar.
Aqui está o código do jsFiddle, portanto, essa resposta é preservada mesmo se o jsFiddle desaparecer:
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;
}
Tente o seguinte código:
$('input').focus(function () {
$(this).val($(this).val());
}).focus()
setSelectionRange
abordagem é certamente muito mais eficiente quando / onde é suportada.
Embora eu esteja respondendo tarde demais, mas para consultas futuras, será útil. E também funciona em contenteditable
div.
De onde você precisa definir o foco no final; escreva este código
var el = document.getElementById("your_element_id");
placeCaretAtEnd(el);
E a função é -
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();
}
}