Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   input, заблокировать первые два символа (https://javascript.ru/forum/misc/72530-input-zablokirovat-pervye-dva-simvola.html)

pokk 05.02.2018 09:45

input, заблокировать первые два символа
 
Добрый день подскажите, как сделать так что бы когда пользователь меняет значение в инпуте, некоторые символы он не мог изменить, что бы они остались как были.

ksa 05.02.2018 10:38

Цитата:

Сообщение от pokk
как сделать так что бы когда пользователь меняет значение в инпуте, некоторые символы он не мог изменить, что бы они остались как были

Вот, например, не меняются первые 2 символа...
<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=windows-1251' />
<script src='https://code.jquery.com/jquery-latest.js'></script>
<!--
<script src="https://code.angularjs.org/1.3.9/angular.min.js"></script>
<script src="https://code.angularjs.org/1.3.9/angular-route.js"></script>
-->
<style type='text/css'>
</style>
<script type='text/javascript'>
$(function(){
	var str='';
	$('input').on('input',function(e){
		if (str.length==2) {
			if (this.selectionStart<3) {
				this.value=this.value.replace(/./,'');
			};
			this.value=this.value.replace(/.?.?/,str);
		} else {
			str=this.value.slice(0,2);
		};
	});
});
</script>
</head>
<body>
<input type='text' />
</body>
</html>

pokk 05.02.2018 12:49

Благодарю, а replace(/./ и replace(/.?.?/ чего такое и для чего?
18 строчка this.value=''; какое отличие?

у себя сделал чуть по другому но и так тоже работает
var str='';
function Input_MAC(){
Temp=document.getElementById("id_Mac");
		if (str.length==2) {
			if (Temp.selectionStart<3) {
				//Temp.value=Temp.value.replace(/./,'');
				Temp.value='';
				console.log(Temp.value);
			};
			Temp.value=Temp.value.replace(/.?.?/,str);
			console.log(Temp.value);
		} else {
			str=Temp.value.slice(0,2);
		};	
	
}

Dilettante_Pro 05.02.2018 14:20

Наверное, имеет смысл заранее задать 2 первых символа, например:
var str='0#';
    $('input').val(str);

ksa 06.02.2018 09:31

Цитата:

Сообщение от pokk
а replace(/./ и replace(/.?.?/ чего такое и для чего?

Цитата:

Сообщение от ksa
this.value=this.value.replace(/./,'');

Убирает первый символ.
Цитата:

Сообщение от pokk
Temp.value='';

Твой вариант просто "обнуляет" всю строку...
Думаю разница тут очевидна.

Цитата:

Сообщение от ksa
this.value=this.value.replace(/.?.?/,str);

Уберет первый и второй символы если они есть...

Цитата:

Сообщение от pokk
у себя сделал чуть по другому но и так тоже работает

Это же твой код - тебе и определять какой он будет... :)

Alexandroppolus 06.02.2018 10:54

можно вынести их перед инпутом

Dilettante_Pro 06.02.2018 11:26

Alexandroppolus,
Цитата:

Сообщение от Alexandroppolus
можно вынести их перед инпутом

Здравая мысль! Такой как-бы комбинированный инпут
<div style="display: inline-block;border:1px solid blue">
  0x<input type="text">
</div>

laimas 06.02.2018 11:35

Цитата:

Сообщение от Dilettante_Pro
Здравая мысль!

Если только не требуется отправка их на сервер, в противном случае придется собирать дополнительно в кучу. И что это такое 0#?

Dilettante_Pro 06.02.2018 12:00

laimas,
Пардон, 0x
Префикс шестнадцатеричного числа. Именно эти два символа нужны ТС, насколько я помню из его предыдущих тем

laimas 06.02.2018 12:18

<input type="number" min="100" max="125" value="105" onchange="document.getElementById('hex').value=this.valueAsNumber.toString(16).toUpperCase()" /> 0x<output id="hex">69</output>

Alexandroppolus 06.02.2018 12:20

Цитата:

Сообщение от laimas
Если только не требуется отправка их на сервер, в противном случае придется собирать дополнительно в кучу.

это да, в общем случае.
но намного проще, чем обработка "oninput", потому что в последнем, по хорошему, надо не просто корректировать value, а ещё и запоминать/восстанавливать позицию курсора. Кстати, если тут нужны шестнадцатиричные числа, то таки придется это заговнокодить. Либо сделать проверку при отправке.

laimas 06.02.2018 12:24

Цитата:

Сообщение от Alexandroppolus
но намного проще, чем обработка "oninput"

Согласен. Если знаем, что есть нечто постоянное перед значением и требуемое для всех полей, то не зачем его гонять между клиентом и сервером. На мой взгляд в данном случае усложняется все неоправданно, о чем автору ранее уже говорилось (в другой теме).

laimas 06.02.2018 12:28

Цитата:

Сообщение от Alexandroppolus
Кстати, если тут нужны шестнадцатиричные числа, то таки придется это заговнокодить. Либо сделать проверку при отправке.

И об этом говорилось ранее, но ... :)
Это еще ладно, что на клиенте придется "костылять", а что же тогда есть на сервере, если все связано с базой? К чему это весь сыр-бор не понятно. Десятичными должен оперировать и клиент, и сервер, а если надо, то представить можно хоть в восьмеричной, какие тут проблемы.

Dilettante_Pro 06.02.2018 16:47

laimas,
Цитата:

Сообщение от laimas
Десятичными должен оперировать и клиент, и сервер

Судя по предыдущим темам, у них персонал привык работать с шестнадцатиричным отображением чисел. Такое бывает ...

laimas 06.02.2018 17:04

Цитата:

Сообщение от Dilettante_Pro
у них персонал привык работать с шестнадцатиричным отображением чисел

Как вещает история, к супер компьютеру Gray был утерян загрузчик и Сеймур Крэй диктовал несколько килобайт машинного кода загрузчика по памяти.

Вы представляете хранение опций в базе в виде шестнадцатеричных значений? Конечному потребителю как то ini-файлов, hex-дампов прошивок причем в любом формате intel/motorolla, и т.п., десятичные упаковать в любое иное исчисление не проблема, а вот оперировать шестнадцатеричными не удобно.

Все может быть, может так и выгоднее, но тогда для удобства свое кастомное поле с кнопками c отображением в hex.

Alexandroppolus 06.02.2018 17:27

Цитата:

Сообщение от laimas
Сеймур Крэй диктовал несколько килобайт машинного кода загрузчика по памяти.

если он его так хорошо запомнил, то это поистине выстраданный код :)

laimas 06.02.2018 17:30

Цитата:

Сообщение от Alexandroppolus
если он его так хорошо запомнил, то это поистине выстраданный код

:) Не только код, но и сами машины тоже.


Часовой пояс GMT +3, время: 13:37.