Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   отменить действия обработчика (https://javascript.ru/forum/events/3538-otmenit-dejjstviya-obrabotchika.html)

qweqwe 30.04.2009 14:28

отменить действия обработчика
 
на странице есть текстовый input, при потере фокуса ввода (onblur), закрывается другой элемент, но если потеря фокуса произошла в связи с кликом на тот самый элемент, который должен скрываться, нужно как то отменить обработчик (onblur) инпута, как это реализовать

B~Vladi 14.05.2009 17:56

Что-то типа такого:

inputEle.onblur=function(){
this.onclick=null;
}

inputEle.onclick=function(){
this.onblur=null;
}


Или можно попробовать енту ф-цию
function clearEvent(event){
    event=event||window.event;
    if(event.stopPropagation) event.stopPropagation();
    else event.cancelBubble = true;
    if(event.preventDefault) event.preventDefault();
    else event.returnValue = false;
}


В обработчике... Не тестил еси чесно... Самому интересно...

Pattern 15.05.2009 11:51

Я бы не стал убивать какую либо функцию в обработчике события, ибо потом её придётся каким то образом возвращать обратно, соответсвенно для этого нужна дополнительная переменная-хранилище. В общем, это лишняя головная боль.
Думаю, тут лучше поменять саму логику появления и исчезновения элементов страницы. Как я понял по поставленной задаче, вы пытаетесь сделать нечто подобное выпадающего списка при вводе поиского слова (как это реализовано например в гугле). Я бы это реализовал так:
<input id="srch" type="text" name="text" value="" style="width:200px" />
<div id="dropDownList" style="display: none;margin: -1px 0px 0px 0px; border: 1px solid #0000ff; width:200px;">
	<ul style="margin:0px">
		<li style="cursor:pointer" onclick="insSrchStr(this)">Пункт 1</li>
		<li style="cursor:pointer" onclick="insSrchStr(this)">Пункт 2</li>
		<li style="cursor:pointer" onclick="insSrchStr(this)">Пункт 3</li>
	</ul>
</div>
<script language="javascript" type="text/javascript">
<!--
function insSrchStr(o){
	document.getElementById('srch').value=o.innerHTML;
	document.getElementById('dropDownList').style.display='none';
}
function init(){
	document.getElementById('srch').onmouseover=function(){
		document.getElementById('dropDownList').style.display='block';
	}
	document.getElementById('srch').onmouseout=function(){
		document.getElementById('dropDownList').style.display='none';
	}
	document.getElementById('dropDownList').onmouseover=function(){
		document.getElementById('dropDownList').style.display='block';
	}
	document.getElementById('dropDownList').onmouseout=function(){
		document.getElementById('dropDownList').style.display='none';
	}
}
document.body.onload=init();
//-->
</script>
Хитрость заключается в том, что слой со списком находится 1 пикселем над input-полем. Соответсвенно, если пользователь возжелает что то выбрать и появившегося списка, он мышь будет перемещать сверху вниз. Поэтому событие onmouseover над слоем возникнет раньше, чем onmouseout input-поля, соответственно, слой не исчезнет. Ну а далее, дело техники.

x-yuri 15.05.2009 12:16

не люблю я эти хитрости, можно кого не надо перехитрить :blink:
я бы в input флаг сделал какой-нибудь, который бы и проверял при потере фокуса (if (! this.cancelHide)), а при щелчке его устанавливал (inputVar.cancelHide = true;)

Pattern 15.05.2009 12:56

x-yuri, на самом деле вариантов вагон и маленькая тележка. Сам делаю именно так как ты предложил. Но предложил самый простой прямой как рельсы способ и более наглядный.

Riim 15.05.2009 15:47

Цитата:

Сообщение от Pattern
Но предложил самый простой прямой как рельсы способ

Изобретаете не понятно что.
Единственно правильный способ уже был предложен:

Цитата:

Сообщение от B~Vladi
function clearEvent(event){
event=event||window.event;
if(event.stopPropagation) event.stopPropagation();
else event.cancelBubble = true;
if(event.preventDefault) event.preventDefault();
else event.returnValue = false;
}


x-yuri 15.05.2009 16:12

а как тут clearEvent поможет?
p.s. мне лично не очевидно, что речь идет о выпадающем списке... по-крайней мере странное у него поведение должно быть

B~Vladi 15.05.2009 17:29

clearEvent поможет предотвратить просачивание остальных событий... Мы поймали, к примеру, onclick и дальше событие не будут просачиваца... Что и хотели получить собственно... Будет время - напишу рабочий пример...


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