Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > return false в событии


Автор: Иль 20.4.2005, 01:29
Код

<html><head><meta http-equiv="Content-Type" content="text/html; charset=windows-1251"></head>
<body>
<input  checked id="check" type="checkbox">
<script language="JavaScript" type="text/JavaScript">
function MyFunction () {
ch=document.getElementById("check")
alert(ch.checked)
ch.checked=false
return false
}
document.getElementById("check").onclick=MyFunction;
</script>
</body></html>

Из разряда чужие ошибки хорошо, а свои лучше... протрезвляют и тонизируют.

Имеется функция, в которой меняется свойство checked checkbox`а и сразу используется прерывание через return. По привычке пишу всегда return false и поплатился

Описал событие inline (onClick=MyFunction()) - все работает, но мне этого мало.
Описал событие как метод (onclick=MyFunction) (больше никак не умею и недопонимаю smile ) и словил глюк. Сhecked меняется, но после возвращается в прежнее положение. Нечестно smile !

Поэтому теперь, пока наконец не пойму события, у меня новая привычка прерывать функции через return;

Автор: Иль 20.4.2005, 01:45
Увлекся smile
Ругаться не будете?
Просьба втолковать еще раз и "на пальцах", почему разное описание событий по разному себя ведет.
И что это токое сидит в событии при описании inline:
В ИЕ
Цитата
function anonymous() { MyFunction () }

В Геко
Цитата
function onclick(event) { MyFunction () }

Автор: Aliance 20.4.2005, 12:48
Первый пост:
там не полный код дан, нельзя сказать однозначно.
Вообще, возврат boolean`а происходит, когда нужно отменить обычное поведение элемента, в котором записано событие.
Например
Код

<a href="www.sut.net.ru" onclick="alert('Уверены?')">переход</a>
<a href="www.sut.net.ru" onclick="alert('Уверены?'); return false">переход2</a>

При нажатии на первую ссылку появится alert окошко, затем после нажатия на кнопку ОК - оно исчезнет и произойдет переход по ссылке.
Если кликнуть по второй ссылке - то перехода не будет.

Второй пост:
не особо понял суть вопроса smile

ЗЫ: зайди на известную статью (если забыл - номер 1, см. мою подпись) и задавай вопросы там, что непонято именно...

Автор: Иль 20.4.2005, 13:08
Aliance, виноват, думал это не совсем туда относится. Если можешь - перенеси. Ребяты, у меня натуги с этой статьей и событиями вообще. Не понимаю я ее, и отложил на потом.
Особенно это
Цитата
evt = (evt) ? evt : ((window.event) ? event : null )

Смотрю в книгу, вижу фигу smile
Надо будет распечатать и в метро по дороге вызубрить. Может тогда влезет smile

Теперь по теме. Перепроверил код - все работает, все полное.
Ударяем по checkbox и по событию там меняется checked=true на false (при клике чекбатон то тоже eже переключается на false), но из-за return false получаем в chekbox свойство cheked равное его состоянию до вызова события onclick, а должно быть false, тк мы его уже изменили. Получается дважды задается false, но всеравно, в итоге, получаем true в обоих браузерах.
Я так понимаю все происходит.

Автор: Aliance 20.4.2005, 13:27
Цитата
evt = (evt) ? evt : ((window.event) ? event : null )

Что не понятного? Все просто. Есть в JavaScript, равно как и в других языках, сокращенный синтаксис. Тут он вложенный.
Код

evt = (evt) ? evt : ((window.event) ? event : null )
// равно этому:
evt;
if (evt) {
   evt = evt;
} else if (window.event) {
   evt = event;
} else {
   evt = null;
}


Цитата
Если можешь - перенеси

Куда?

Цитата
Не понимаю я ее, и отложил на потом.

А зря smile Полезная статья... Очень (я сам раньше ничего не понимал. Самое главное - осознать о наличии глобального объекта evt...) ЗЫ: задавай вопросы! Там!

Автор: Иль 20.4.2005, 14:02
ОК!

А я собстна про evt и разницу в моделях и не понимаю. Но по теме этого топика тоже хочется понять

Автор: Sardar 20.4.2005, 17:25
Смотрим на код:
Код
<input  checked id="check" type="checkbox">
<div id="debg"></div>
<script language="JavaScript" type="text/JavaScript">
dbg=document.getElementById("debg");

function MyFunction () {
  ch=document.getElementById("check");
  dbg.innerHTML+="click: "+ch.checked+"<br />"
//  ch.checked=false;
  return false;
}
document.getElementById("check").onclick=MyFunction;

document.getElementById("check").onmouseup=function() {
  ch=document.getElementById("check");
  dbg.innerHTML+="up: "+ch.checked+"<br />";
//  ch.checked=false;
  return false;
}
</script>

Думаем над результатами... Похоже вызывается mouseup с реальным состоянием чекбокса, затем вызывается click с инвертированным состоянием чекбокса. Изменение чекбокса в click не даёт результатов, это же в mouseup делает то что нужно.

Почему так? Пока не знаю... smile


Цитата
почему разное описание событий по разному себя ведет.
И что это токое сидит в событии при описании inline:

Какие разные события? Сорец функции в ИЕ и мозилле различается, т.к. в первом это анонимная функция, а во втором определяемая браузером, что кстати самому сделать не получится без eval. Допустим такой пример, где мы сами сделаем inline событие:
Код
<span id="test" onvingrad="this.style.background='#caa5f3'; this.innerHTML='<b>Vingrad</b>';">Test</span>

<script type="text/javascript">
<!--
var s=document.getElementById("test"), evs;
if((evs=s.getAttribute("onvingrad"))!=null) s.onvingrad=new Function("event", evs); //сорес обработчика
else s.onvingrad=null;

alert(s.onvingrad); //видим что это анонимная функция

var testevent=true; //для проверки
//событие: если мы загруженны с хоста винграда либо в тесте
if(s.onvingrad && (location.host.indexOf("vingrad")>=0 || testevent)) s.onvingrad();
//-->
</script>

Сразу оговоримся что в убогой Опере 6 new Function нет.
Как видим мы сделали собственное, по поведению полностью идеентичное как в ИЕ inline событие.

Автор: Иль 20.4.2005, 17:55
Что такое Сорец/Сорес? И не нашел объяснение, что есть анонимная функция. Т.е. без имени, поэтому записывается в представлении как anonymouse?

Автор: Иль 20.4.2005, 18:08
Цитата(Sardar @ 20.4.2005, 17:25)
Почему так? Пока не знаю...

smile Фраза снимает напряжение от трудового дня

Автор: Aliance 20.4.2005, 18:12
Цитата
Что такое Сорец/Сорес?

Исходный код

Цитата
И не нашел объяснение, что есть анонимная функция. Т.е. без имени

Сам дал ответ на свой вопрос smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)