Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   При передаче фокуса select`у и выборе определенного option возникает трудность (https://javascript.ru/forum/events/53175-pri-peredache-fokusa-select%60u-i-vybore-opredelennogo-option-voznikaet-trudnost.html)

klk.pma 23.01.2015 20:20

При передаче фокуса select`у и выборе определенного option возникает трудность
 
Добрый день!

При передаче фокуса от input к select вот таким кодом:
if(event.keyCode==40) {
	var vsel=document.getElementById("listfam");
	vsel.focus();  //передача фокуса select
	if(vsel.selectedIndex==-1) vsel.selectedIndex=0;  //отметить первый в списке option
   }

я попутно отмечаю первый option в select`e. Задача селекта - найти в нем нужный пункт и при нажатии enter или click, передать значение option в другой элемент.
if(event.keyCode==13) document.getElementById("inpfam").value=name;

И тут сталкиваюсь с проблемой: если сразу после получения фокуса выбран option[0] и нажать enter, то указанный option не передается. Даже при проверке alert`om ничего не происходит:
if(vsel.selectedIndex==-1) alert(vsel.selectedIndex);


Кто сталкивался с такой проблемой, подскажите в чем причина.

danik.js 23.01.2015 22:03

Примерчик запускаемый сделай.

klk.pma 28.01.2015 19:54

Цитата:

Сообщение от danik.js (Сообщение 353119)
Примерчик запускаемый сделай.

Вот пример. Проблема в нем такая:
1 ВАРИАНТ: вводится любой символ, нажимается стрелка вниз, нажимаем enter и получаем пустое поле (а должно быть значение Петров);
2 ВАРИАНТ: если ввести символ, нажать 2 раза стрелку вниз и нажать enter в поле появится правильное значение (это правильная работа скрипта).

<!DOCTYPE HTML>
<html>
<head>
  <meta charset="windows-1251">
  <style>
    .cla {width:450px}
  </style>
</head>
<body>
<form method="post" action="" name="addedit" class="cla">
  <div>
    Фамилия
    <div>
      <input id="addfam" type="text" name="fam" maxlength="50" value="" onkeyup="strlist(this.value);">
      <select id="listfam" name="listfam" size="5" style="width:450px; display:none;" onclick="inpstr(this.value);" onkeyup="inpstr13(this.value);"></select>
    </div>
  </div>
</form>

<script>
function strlist(famn) {
	if(event.keyCode==40) {
		var vsel=document.getElementById("listfam");
		vsel.focus();	//передача фокуса select
		if(vsel.selectedIndex==-1) vsel.selectedIndex=0;	//отметить первый в списке option
	} else {
		var result=['Петров', 'Сидоров', 'Петренко', 'Петрущенко', 'Иванов']; 	//сюда поставляется массив данных - заполнен для примера
		if(result && result!='') {
			document.getElementById("listfam").style.display='';
	    		var list=document.getElementById("listfam");
			list.length=0;
			for(var i=0;i<result.length;i++) list[i]=new Option(result[i]);
		} else document.getElementById("listfam").style.display='none';
	}
}
function inpstr(famn) {
	document.getElementById("addfam").value=famn;
	document.getElementById("listfam").style.display='none';
}
function inpstr13(famn) {
	window.captureEvents(Event.KEYPRESS);	//перехват события нажатия клавиши (для некоторых браузеров)
	window.onkeypress=pressed;		//событие при нажатии клавиш
	function pressed(e) {
		if(e.which==13) {		//если нажат enter
			e.preventDefault(); 	//отмена действия браузера по умолчанию (отправка формы)
		}
	}
	if(event.keyCode==13) {
		document.getElementById("addfam").value=famn;
		document.getElementById("listfam").style.display='none';
	}
}
</script>
</body>
</html>


Кстати, есть один нюанс: если сначала применить 2 ВАРИАНТ, а затем 1 ВАРИАНТ, то enter сработает правильно.

Можете подсказать в чем проблема?

danik.js 28.01.2015 22:44

Погугли datalist polyfill:

<input type="text" list="options" />
<datalist id="options">
    <option value="Петров" />
    <option value="Сидоров" />
    <option value="Петренко" />
    <option value="Петрущенко" />
    <option value="Иванов" />
</datalist>

klk.pma 29.01.2015 09:31

Цитата:

Сообщение от danik.js (Сообщение 353971)
Погугли datalist polyfill

Datalist хороший вариант, но есть проблема, как сделать его доступным во всех браузерах без подключения дополнительных файлов (хотя бы без jQuery)?
Мне желательно разобраться со своим вариантом. Есть по моему вопросу какие-то соображения?
Как исправить косяк с select? Подскажите хотя бы из-за чего возникает проблема в select

klk.pma 30.01.2015 11:25

Решил пойти другим путем, вместо select использовал группу div c tabindex="-1". Но и тут нарвался на мелкое неудобство: при нажатии на "стрелка вниз" или "стрелка вверх" фокус происходит на нужном диве, но при этом прокручивается страница (соответственно когда контента больше высоты окна). Пожалуйста, хотя бы в этом подскажите, КАК ЭТОГО ИЗБЕЖАТЬ?????????
preventDefault и return false; не помогают.

рони 30.01.2015 11:43

Цитата:

Сообщение от klk.pma
но при этом прокручивается страница

отмените всплытие события.

рони 30.01.2015 11:48

klk.pma,
event.stopPropagation();

klk.pma 30.01.2015 18:19

Цитата:

Сообщение от рони
отмените всплытие события

Все равно прокручивается страница

klk.pma 30.01.2015 18:28

Вот мой код:
<!DOCTYPE HTML>
<html>
<head>
  <meta charset="windows-1251">
  <style>
    #li2 {border:1px solid gray}
    .cla {width:450px}
    .dlist:focus {background:gray; outline:none;}
  </style>
</head>
<body style="height:2000px">

<form method="post" action="" name="addedit" class="cla">
  <div>
    Фамилия
    <div>
      <input id="addfam" type="text" name="fam" maxlength="50" value="" onkeyup="strlist(this.value,event);" placeholder="Фамилия">
      <div id="li2" style="width:450px; display:none;"></div>
    </div>
  </div>
</form>

<script>
function strlist(famn,event) {
	event=event||window.event;
	event.preventDefault();
	event.stopPropagation();
	if(event.keyCode==40) {
		document.getElementById("l1").focus();
	} else {
		var result='<div tabindex="-1" id="l1" class="dlist" onkeyup="inpstr13(this,event);">Петров</div><div tabindex="-1" id="l2" class="dlist" onkeyup="inpstr13(this,event);">Сидоров1</div><div tabindex="-1" id="l3" class="dlist" onkeyup="inpstr13(this,event);">Сидоров2</div><div tabindex="-1" id="l4" class="dlist" onkeyup="inpstr13(this,event);">Сидоров3</div><div tabindex="-1" id="l5" class="dlist" onkeyup="inpstr13(this,event);">Сидоров4</div><div tabindex="-1" id="l6" class="dlist" onkeyup="inpstr13(this,event);">Сидоров5</div><div tabindex="-1" id="l7" class="dlist" onkeyup="inpstr13(this,event);">Сидоров6</div>';
		if(result && result!='') {
			document.getElementById("li2").style.display='';
	    		document.getElementById("li2").innerHTML=result;
		} else document.getElementById("li2").style.display='none';
	}
}
function inpstr13(famn,event) {
	event=event||window.event;
	tekp=parseInt(famn.id.replace(new RegExp("^l",'g'),""));
	if(event.keyCode==40) {
		event.preventDefault();
		event.stopPropagation();
		tekp="l"+(tekp+1);
		document.getElementById(tekp).focus();
		return false;
	} else if(event.keyCode==38 && tekp!=1) {
		event.preventDefault();
		event.stopPropagation();
		tekp="l"+(tekp-1);
		document.getElementById(tekp).focus();
		return false;
	} else if(event.keyCode==13) {
		document.getElementById("addfam").value=famn.innerHTML;
		document.getElementById("li2").style.display='none';
	}
}
</script>
</body>
</html>

Как отловить эти гадские кнопки? Кто сталкивался с подобной проблемой подскажите как решить.


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