Выбор всего текста в текстовом вводе HTML при нажатии
у меня есть следующий код для отображения текстового поля на веб-странице HTML.
<input type="text" id="userid" name="userid" value="Please enter the user ID" />
когда страница отображается, текст содержит пожалуйста, введите ID пользователя сообщение. Однако я обнаружил, что пользователю нужно щелкнуть 3 раза, чтобы выбрать весь текст (в этом случае это пожалуйста, введите ID пользователя).
можно ли выбрать весь текст одним щелчком мыши?
Edit:
Извините, Я забыл сказать: я должен использовать input type="text"
22 ответов
Вы можете использовать этот фрагмент кода:
<input onClick="this.select();" value="Sample Text" />
но, по-видимому, он не работает на мобильном Safari. В этих случаях вы можете использовать:
<input onClick="this.setSelectionRange(0, this.value.length)" value="Sample Text" />
ранее опубликованные решения имеют две причуды:
- в Chrome выбор через .select () не прилипает - добавление небольшого таймаута решает эту проблему.
- невозможно поместить курсор в нужную точку после фокуса.
вот полное решение, которое выбирает весь текст в фокусе, но позволяет выбрать определенную точку курсора после фокуса.
$(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(); }, 50); //select all text in any field on focus for easy re-entry. Delay sightly to allow focus to "stick" before selecting.
});
});
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>
Я знаю, что это старый, но самый лучший вариант-использовать новый placeholder
HTML атрибут, если это возможно:
<input type="text" id="userid" name="userid" placeholder="Please enter the user ID" />
это приведет к отображению текста, если не введено значение, устраняя необходимость выбора текста или очистки входных данных.
перечисленные ответы являются частичными в соответствии со мной. Я связал ниже два примера того, как это сделать в Angular и с JQuery.
данное решение имеет следующие особенности:
- работает для всех браузеров, поддерживающих JQuery, Safari, Chrome, IE, Firefox и т. д.
- работает для Phonegap / Cordova: Android и IOs.
- только выбирает все один раз после ввода получает фокус до следующего размытия, а затем фокус
- несколько входы могут быть использованы, и он не глюк.
- угловая директива имеет большое повторное использование, просто добавьте директиву 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);
}
}
});
Угловое: 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;
});
}
};
}]);
вы всегда можете использовать document.execCommand
(поддерживается во всех основных браузерах)
document.execCommand("selectall",null,false);
выбирает весь текст в текущем сфокусированном элементе.
действительно, использовать onclick="this.select();"
но помните, что не следует сочетать его с disabled="disabled"
- он не будет работать, и вам нужно будет вручную выбрать или несколько щелчков, чтобы выбрать, по-прежнему. Если вы хотите заблокировать выбранное значение содержимого, объедините его с атрибутом readonly
.
автофокус ввода, с событием onfocus:
<INPUT onfocus="this.select()" TYPE="TEXT" NAME="thing" autofocus>
Это позволяет открыть форму с выбранным элементом. Он работает с помощью автофокусировки, чтобы попасть на вход, который затем отправляет себе событие onfocus, которое, в свою очередь, выбирает текст.
вот многоразовая версия ответа Шобана:
<input type="text" id="userid" name="userid"
value="Please enter the user ID" onfocus="Clear(this);"
/>
function Clear(elem)
{
elem.value='';
}
таким образом, вы можете повторно использовать сценарий clear для нескольких элементов.
Ну, это нормальная активность для текстового поля.
пункт 1 - установить фокус
щелкните 2/3 (двойной щелчок) - выберите текст
вы можете установить фокус в текстовом поле при первой загрузке страницы, чтобы уменьшить "select"до одного события двойного щелчка.
проблема с ловлей события click заключается в том, что каждый последующий щелчок в тексте будет выбирать его снова, в то время как пользователь, вероятно, ожидал переместить курсор.
Что сработало для меня, это объявление переменной selectSearchTextOnClick и установка ее в true по умолчанию. Обработчик click проверяет, что переменная по-прежнему true: если это так, он устанавливает ее в false и выполняет select(). Затем у меня есть обработчик событий blur, который возвращает его в истинный.
пока результаты вроде поведение я ожидал.
(Edit: я забыл сказать,что я пытался поймать событие фокуса, как кто-то предложил, но это не работает: после того, как событие фокуса срабатывает, событие click может сработать, немедленно отменяя выбор текста).
этот вопрос имеет варианты .выбрать() не работает на мобильных платформах: программный выбор текста в поле ввода на устройствах iOS (mobile Safari)
Html, как это
<input type="text" value="click the input to select" onclick="javascript:textSelector(this)"/>
и код javascript без bind
function textSelector(ele){
$(ele).select();
}
точное решение того, что вы спросили:
<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" />
Примечание: если учесть onclick="this.select()"
, при первом щелчке все символы будут выбраны, после этого, возможно, вы хотели что-то изменить во вводе и нажмите среди символов, затем он снова выберет все символы. Чтобы устранить эту проблему, вы должны использовать onfocus
вместо onclick
.
Если вы используете 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-поэтому первая и последняя строка могут быть пропущены при использовании чего-то другого.
Если кто-то хочет сделать это на странице load w/ jQuery (sweet for search fields) вот мое решение
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
если вы просто пытаетесь иметь текст-заполнитель, который заменяется, когда пользователь выбирает элемент, то, очевидно, лучше всего использовать
Вы можете заменить
<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. Placeholder делает это так, что это не значение, а как имя предполагает владельца места. Это то, что используется в нескольких онлайн-формы на которой написано "логин" или "email" и при нажатии на это "письмо" исчезнет, и вы можете начать печатать правильно прочь.
вот пример в React, но его можно перевести на jQuery на vanilla JS, если вы предпочитаете:
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
потому что элемент уже получил фокус к моменту срабатывания события" click " (и, таким образом,activeElement
проверить не удастся).
на activeElement
проверка необходима так, что они потребитель смогут расположить их курсор где они хотят без постоянн повторно выбирать весь входной сигнал.
тайм-аут необходимо, потому что в противном случае текст будет выбран, а затем мгновенно отменен, так как я предполагаю, что браузер проверяет положение курсора после слов.
и наконец,el = ev.currentTarget
необходимо в React потому что React повторно использует объекты событий, и вы потеряете синтетическое событие к моменту срабатывания setTimeout.