Pull to refresh

Comments 32

Было бы намного удобнее давать вам совет, если бы код был более читабельным.
Ага, типа такого
$(document).ready(function(){
//ajax login
$("#loginform").bind("submit",function() {
var qString = $('#loginform').formSerialize();
$.getJSON('login.html', qString, function(json){
if(json.result == 1){
$('#login').html('');
$('#login').append('<a href=profile.html?id=' + json.id + '>' + json.login + ' Выход');
$("#logout").bind(«click»,function() {
// Функции должна возвращать false
return false;
});
} else {
$('#msg').html('');
$('#msg').append('Неверно введён логин или пароль');
}
});
// Функции должна возвращать false
return false;
});
//end ajax login
//ajax logout
$("#logout").bind(«click»,function() {
$('#login').load(«logout.html»);;
// Функции должна возвращать false
return false;
});
//end ajax logout
});
//end document.ready


* This source code was highlighted with Source Code Highlighter.
Я, возможно, не совсем понял принцип работы вашего кода, но нахрена вы делаете
$("#logout").bind(«click»,function() {
// Функции должна возвращать false
return false;
});
при логине? Что вы ожидаете потом будет происодить при нажатии на $("#logout") — который, кстати, вообще не понятно что из себя представляет и где находится.
если я не ставлю в конце
return false;

то у меня вобще событие не обрабатывается
#logout это ссылка «Выход» с id=logout
просто хабр ссылку «съел»
Ну тогда все просто. Вы вешаете обработчик ДО появления самого объекта.
Тут есть два выхода — либо использовать live вместо bind
Либо делать $("#logout").bind — прямо в логине.

В вашем же случае, сначала срабатывают все «вешалки» событий, и не найдя объекта #logout успокаиваются. Когда вы создаете его уже во время работы страницы, событие на него само не повесится.
вообще-то все это завернуто в $.ready так что дело не в этом.

А вот в чем.

Здесь на клик по #logout вешается функция которая загружает logout.html.
Поэтому все работает после перезагрузки страницы.

А вот если мы перед этим залогинились, отправив #loginform — то здесь то, что его обрабатывает, после успешного входа зачем-то вешает на #logout пустую функцию, поэтому ничего и не происходит.

видимо ссылка «выход» создается после логина, так что это правильно — повесить на нее событие для выхода. Вот только дописать его надо :)
я уже дописывал, но проблема от этого не решается! Если пользователь залогиниться, а потом захочет отлогиниться, то у него получиться, но если он вдруг опять захочет залогиниться, то уже не получиться! Вот в этом-то и проблема!
Вам уже предлагали выше использовать метод live вместо bind
Вы же видите, что при загрузке ваших форм login.html и logout.html все навешанные события исчезают, а live решает эту проблему при условии существования #login и #logout
Спасибо. Попробовал, но не помогает. После авторизация у меня появляется ссылка с id=logout, но клик по нему введёт по ссылке. Тоже самое происходит когда первым делом я пытаюсь отлогиниться и подгружаю форму логина в div с id=login, то событие по submit не вызывается.
вы что-то умалчиваете ;)
и еще нарисовали бы структуру формы, сделана ли она так? может есть еще какие элементы? может подгружается что важное в login.html / logout.html

<form id="loginForm">
<div id="login"></div>
</form>
или
<div id="login">
 <form id="loginForm"></form>
</div>

* This source code was highlighted with Source Code Highlighter.
<div id="login">
<form id="loginform">
Логин: <input type="text" name="login" /><br>
Пароль: <input type="password" name="password" /><br>
<input type="submit" name="go" value="Войти" />
</form>
<span id="msg"><a href="/easyski/registration.html">Регистрация</a></span>
</div>

* This source code was highlighted with Source Code Highlighter.
Странно конечно, что live не помог, но я jquery не пользуюсь и м.б. чего не знаю.

Ваш код при отработке $('login').append и $('login').load удаляет все обработчики, т.к. вы очищаете самый главный контейнер, и если уж не заморачиваться, я бы переделал так:

HTML
<div id="login">
 <form id="loginform">
  Логин: <input type="text" name="login"><br>
  Пароль: <input type="password" name="password" /><br>
  <input type="submit" name="go" value="Войти" onclick="return SubmitRegForm()">
 </form>
 <span id="msg"><a href="/easyski/registration.html">Регистрация</a></span>
</div>


* This source code was highlighted with Source Code Highlighter.

js
function SubmitRegForm(){
  var qString = $('#loginform').formSerialize();
  $.getJSON('login.html', qString, function(json){
   if(json.result == 1){
    $('#login').html('');
    $('#login').append('<a href=profile.html?id=' + json.id + '>' + json.login + '</a> <a id="logout" href="" onclick="return UserLogout()">Выход</a>');
   } else {
    $('#msg').html('');
    $('#msg').append('Неверно введён логин или пароль');
   }
  });
  return false;
 }
 
 function UserLogout(){
  $('#login').load("logout.html");
  return false;
 }


* This source code was highlighted with Source Code Highlighter.

Получается, что функции будут лежать отдельно и просто запускаться при кликах, а вы загружаете необходимый код с готовым событием onclick.

Кто-то скажет, что некрасиво, но главное вполне работоспособно :)
Если же не хотите смешивать html+js, то скорее всего придется менять саму форму логина, чтоб не убивать все подряд :)
Процитирую James Bennet, одного из разработчиков Django:
«If you call yourself a “web developer” you have absolutely no excuse for not knowing Javascript. And if you don’t know Javascript, you have absolutely no right to call yourself a “web developer”»
Зачем тогда «осваиваете jQuery и пишете ajax авторизацию для своего сайта»?
Отдайте эту задачу студентам-фрилансерам, они вам за еду всё сделают.
По вашей логике — так учиться ничему вообще не нужно. Еду только студентам раздавай.
По моей логике врач должен лечить, строитель — строить, программист — программировать.
Вряд ли вы заходите чтобы аппендикс вам удалял какой-нибудь дизайнер.
Неправильная аналогия: если следовать логике, то аппендикс будет удалятся (тьфу, тьфу) себе самим foof :)
Он не веб-девелопер, но занимается веб-девелоперством. Что неправильного?
я — студент, а студент, как правило учиться, чем я и занимаюсь.
Так вот если вы хотите научиться, то сначала изучите javascript, а потом беритесь за jQuery. Не наоборот.
Вы бы лучше помогли мне разобраться в коде…
В том-то и вся проблема, что вы мыслите кодом. А в коде ошибки от непонимания jQuery. А jQuery вы не понимаете потому что не знаете javascript.
А помочь я не могу т.к. не вижу контекста в котором этот код исполняется. Откуда я знаю что у вас возвращает logout.html и как выглядит DOM-дерево которое вы изменяете? Телепаты в отпуске.
Наверное, мы обое правы по-своему. foof делает себе «операцию» сам, вместо того, чтобы пригласить для этой работы специалиста.
> $('#login').append('<a href=profile.html?id=' + json.id + '>' + json.login + ' Выход');
Для начала закройте тег )
тег закрыт, я же говорю, что слово «Выход» на самом деле ссылка, которую хабр почему-то съел.
Sign up to leave a comment.

Articles