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


Автор: Rivelt_Silverbeast 7.3.2008, 15:13
Имеется следующий код:

Код

<body onunload="
 forms = document.forms;
 unclose = 0;
 for(i=0;i<forms.length;i++)
 {
  if(forms[i].body!=null)if(forms[i].body.value!='')unclose++;
 }
 if(unclose)return confirm('На странице имеется полей с вводимым текстом: '+unclose+'.'+
'\nВы действительно хотите уйти со страницы, не отправив текст?');
 ">


Также на странице есть набор однотипных форм, имеющих textarea. При наличии хотя бы одного заполненного (и не отправленного) textarea хотелось бы предупреждать пользователя перед уходом по ссылке или перезагрузке страницы.
Проблема в том, что пока выполняемый код действует издевательски: проверки выполняются, confirm вызывается, пользователь уведомлён о наличии полей ввода с текстом, но браузер бодро уходит.

Что здесь можно сделать?

Автор: ksnk 7.3.2008, 15:45
потомучто метод называется onbeforeunload и работать с ним нужно несколько по другому...

Автор: Kefir 7.3.2008, 16:12
Код

<body onbeforeunload="return 'Уже уходите?';">


Добавлено через 1 минуту и 56 секунд
смысл такой, что будет показано окошечко самого браузера, где будет текст о том, что ты, мол уходишь со страницы, а также будет вписан текст который ты вернёшь в onbeforeunload (в моём примере - 'Уже уходите?').

Автор: Rivelt_Silverbeast 7.3.2008, 16:23
О, спасибо. Примерно то, что искал.

В итоге получаем:
Код

...
<body onbeforeunload="
 forms = document.forms;
 unclose = 0;
 for(i=0;i<forms.length;i++)
 {
  if(forms[i].body!=null)if(forms[i].body.value!='')unclose++;
 }
 if(unclose)return 'На странице имеется полей с вводимым текстом: '+unclose+'.'+
'\nВы действительно хотите уйти со страницы, не отправив текст?';
 ">
...

Автор: Rivelt_Silverbeast 7.3.2008, 16:39
P.S.
Валидатор ругается на атрибут onbeforeunload, как ни странно.

Автор: Kefir 7.3.2008, 16:52
дело в том, что оно не входит в стандарт  smile , хотя IE, FF и Safari его поддерживают (насколько я помню). Проблемная тема - Опера  smile , как всегда выделилась и не поддерживает эту фичу (хотя гугль-мэйл как-то справляется В))

Добавлено через 14 минут и 9 секунд
ан нет, вру - даже гмейл не смог сделать эту тему в опере В)

Автор: Rivelt_Silverbeast 7.3.2008, 17:54
Поэтому единственный известный мне способ скормить валидатору страничку с этим решением — перевести полностью в javascript. smile

Код

function f()
 {
 forms = document.forms;
 unclose = 0;
 for(i=0;i<forms.length;i++)
 {
  //if(((forms[i].message!=null)&(forms[i].message.value!=''))|(forms[i].body))unclose++;
  if(forms[i].message!=null)if(forms[i].message.value!='')unclose++;
  if(forms[i].body!=null)if(forms[i].body.value!='')unclose++;
 }
 if(unclose)return 'На странице имеется полей с вводимым текстом: '+unclose+'.'+
'\nВы действительно хотите уйти со страницы, не отправив текст?';
 }
 
window.onbeforeunload=function()
{
return f();
}


Но это не совсем честно, imho. smile

Автор: Sardar 7.3.2008, 21:11
Цитата(Rivelt_Silverbeast @  7.3.2008,  16:54 Найти цитируемый пост)
Поэтому единственный известный мне способ скормить валидатору страничку с этим решением — перевести полностью в javascript.

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

Автор: Kefir 8.3.2008, 01:39
Rivelt_Silverbeast, ну, насколько я помню, аякс тоже изначально не был валидным, его в стандарт ввели задним числом, когда он уже какое-то время просуществовал. а onbeforeupload по любому рано или поздно в стандарт войдёт. вопрос времени В)

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