|
|
|
| Добрый день! Не могу разобраться почему в функции криво работает логика. Возвращается всегда false:
function chekNames(name) {
var cookie = getCookie('name');
if(cookie == null) {
jQuery.ajax({
url: 'http://aidaho.kz/function/comment.php?chekName=' + name,
cache: false,
success: function(html){
if(html == 'Ok'){
return true;
} else {
return false;
}
}
});
} else {
return true;
}
}
|
Функция вызывается так:
if(!chekNames(userName)) {
jQuery.prompt('Такое имя зарегистрированно. Выберите другое имя.',{ opacity: 0.8 , prefix: 'jqi'});
jQuery.stop();
}
|
При этом пхп-ешный скрипт отрабатывает нормально. Вроде простая функция с 1 условием, но не могу додумдукать ((( | |
|
|
|
|
|
|
|
для: Aidaho
(06.09.2012 в 19:29)
| | if(cookie == null) - так, а вернее так if(cookie === null) нужно писать в том случае, если нужна проверка на соответствие типа, иначе достаточно if(!cookie)...
Если вы так упрощенно делаете асинхронные запросы к серверу, то лучше и пользоваться упрощенными методами соответствующими: $.get(), $.post.
Какой именно ваш if "кривой"? Второй, если php отработала, в смысле на запрос? Скорее всего это у вас код (ожидания ваши) искривлены. | |
|
|
|
|
|
|
|
для: confirm
(06.09.2012 в 19:54)
| | Всегда возвращает false. Даже если ответ от серевера был "Ок", то выкидывает, что имя занято.... | |
|
|
|
|
|
|
|
для: Aidaho
(06.09.2012 в 19:56)
| | Кто именно возвращает? Вы в каком месте проверку производите? | |
|
|
|
|
|
|
|
для: confirm
(06.09.2012 в 19:58)
| | Возвращает функция chekNames, внутри ее и делаю... | |
|
|
|
|
|
|
|
для: Aidaho
(06.09.2012 в 20:02)
| | Предлагаю для начала найти проблему самому, а для этого:
а) есть в JS махонький отладчик - alert(). Замените возвраты в функции на него, выводя им на экран цифры (в каждом месте своя, то есть вместо соответствующего return). Ожидаемо получается? А если возвращать номер, получите? Кстати, закрывать единственный оператор фигурными скобками, да еще так небрежно раскиданными (не по границам), это только усложняет чтение кода.
б) Запустите этот код в FF, и в его отладчике (firebug) смотрите вкладку Сеть. Там вы можете увидеть отправляет ли клиент запрос, если да, то какой, и отвечает ли сервер, и если да, то каким типом данными.
Пока это. Седлайте, вам будет полезнее. | |
|
|
|
|
|
|
|
для: confirm
(06.09.2012 в 20:16)
| | alert-ы выкидываются, нормально, т.е. логика отрабатывает. Если писать так return 2; и потом if(chekNames(userName) == "2") ... то ничего не происходит (
видать этот кусок if(!chekNames(userName) ) то ли не получает почему-то ретарны, то ли не может их понять...
Сервер возвращает корректно строчным типом...
А как, кстати, лучше закрывать? | |
|
|
|
|
|
|
|
для: Aidaho
(06.09.2012 в 20:28)
| | Значит это освоили, хорошо. Это пригодится. А теперь в чем проблема:
<input type="button" value="GO" onclick="alert(paretn())" />
<script>
function parent() {
function enclosed() {
return 1
}
enclosed();
}
</script>
|
Получаете 1? А вроде бы как должно... Не должно. Не буду долго распространяться, потому как речь о вложенных функциях....
Выполняйте действия непосредственно после запроса, тем более, что не видно причин для иначе.
function chekNames(name) {
var cookie = getCookie('name');
if(!cookie) {
$.ajax({
url: 'http://aidaho.kz/function/comment.php?chekName=' + name,
cache: false,
success: function(html) {
if(html == 'Ok'){
//действия
} else {
$.prompt('Такое имя зарегистрированно. Выберите другое имя.',{ opacity: 0.8 , prefix: 'jqi'});
$.stop();
}
}
});
} else //толи return true; , толи ... не знаю чего вам нужно
}
| Обращение к методам как jQuery.метод применяют тогда, когда возможен конфликт с другими библиотеками, также использующими символ $. Иначе просто - $.метод. | |
|
|
|
|
|
|
|
для: confirm
(06.09.2012 в 21:37)
| | У меня как раз таки конфликт и возникает, по этому и использую - jQuery.метод.
Ок. Сейчас все отрабатывает правильно, но функция из которой идет вызов почему-то не прекращает свою работу.... я думал сделать так: из функции добавления комментария вызывать chekNames, что бы она проверила зарегистрировано ли такое имя, если да, то вывела предупреждение и прекратила все движения и свои и добавления коммента, если такого имени нет, то пусть спокойно себе его добавляет....
А все, разобрался ) просто сделал вызова такой: if(!chekNames(userName)) { jQuery.stop(); }
Но теперь, если имени не существует вообще ничего не происходит... | |
|
|
|
|
|
|
|
для: Aidaho
(07.09.2012 в 07:17)
| | Мне трудно что-либо сказать, не зная полноты картины ваших действий от той или иной зависимости, могу лишь сказать следующее:
метод jQuery всегда возвращают ссылку на объект вызвавший его, а это означает, что вы можете последовательно описать цепочку методов применяемых к объекту, а также перемещаться в этой цепочке по иерархии объектов относительно объекта источника.
Из этого следует, что "вырывать" часть кода из некой линии задачи выполняемой, ради того, чтобы узнать есть или нет, не стоит, эту проверку и действия после проверки, можно спокойно выполнить непосредственно в самой задаче, в цепи ее методов. Нужно лишь правильно построить структуру кода задачи, ее действий.
Если же вас интересует как вернуть результат из вложения, и очень хочется так, то обратитесь в соответствующий раздел описания JavaScript, излагать здесь всю теорию о функциях его, это долго и не имеет смысла. Есть соответствующее решение и в jQuery, но мне кажется, что в вашем случае оно совсем не нужное, как мне представляется (если я прав) задача то у вас совсем простая, только вы ее неудобно "разложили". | |
|
|
|
|
|
|
|
для: confirm
(07.09.2012 в 08:45)
| | Да, задача очень простая, и такая запарка из-за этого....
Выложу полностью 2 функции, может тогда станет понятней:
1. Функция добавления комментария, откуда и вызывается вторая.
2. Сама функция проверки имени....
function commentAdd() {
var id = document.getElementById('id').value;
var userName = document.getElementById('userName').value;
userName = encodeURI(userName);
var comment = document.getElementById('comment').value;
var subs = document.getElementById('subsInput').value;
var button = document.getElementById('button-submit');
var url = 'http://aidaho.kz/function/comment.php?actionCom=add&userName=' + userName + '&comment=' + encodeURI(comment) +'&id='+id + '&mailsubs='+subs;
if(userName.length > 0) {
// if(!chekNames(userName)) { jQuery.stop(); }
if(comment.length > 0) {
if(subs.length > 0) {
if(!checkmail(subs)) {
showError(1);
jQuery.stop();
}
}
button.innerHTML = '<img src=/inc/img/loader.gif />'
jQuery.ajax({
url: url,
cache: false,
success: function(html){
jQuery(".comment-new").html(html).animate({opacity: 1}, 700);
jQuery(".comment-new").toggleClass("comment-new");
jQuery("#id"+id).addClass("comment-new");
jQuery("#id"+id).removeAttr("id");
jQuery("#comment").attr('value', '');
jQuery("#comment").val("");
button.innerHTML = 'Комментировать';
countComment(id);
}
});
} else {
jQuery.prompt('А сам комментарий? Введите комментарий. :)',{ opacity: 0.8 , prefix: 'jqi'});
}
} else {
showError(2);
}
}
|
и
function chekNames(name) {
var cookie = getCookie('name');
if(!cookie) {
jQuery.ajax({
url: 'http://aidaho.kz/function/comment.php?chekName=' + name,
cache: false,
success: function(html){
if(html == 'Ok'){
return true;
} else {
jQuery.prompt('Такое имя зарегистрированно. Выберите другое имя.',{ opacity: 0.8 , prefix: 'jqi'});
jQuery.stop();
return false;
}
}
});
} else {
return true;
}
}
|
| |
|
|
|
|
|
|
|
для: Aidaho
(07.09.2012 в 11:18)
| | Смесь бульдога с носорогом. Вы подключили jQuery для чего, чтобы Ajax запросы делать и выводить его плагин promt и все? Разве нельзя с его помощью получить:
var id = jQuery('#id').val(); //и т.п.
вместо
var id = document.getElementById('id').value; //и т.п.
?
| И вообще, если вы получаете значения, значит речь идет об элементах формы, и получить из нее значения для запроса, это методы .serialise() и .serialiseArray(), так что все ваши перечисления (не важно на чем писанные) document.getElementById('id-атрибут').value не имеют смысла вообще.
Как я и предполагал, ваш код построен не оптимально. Не надо никаких функций отдельных. Вот так примерно должно выглядеть:
//не знаю чем вызывается функция добавления,
//но можно предположить, что кнопкой submit формы, тогда
//не надо никакой функции commentAdd(),
//а обрабатывать это событие
$.("name_form").submit(function(){
var send = $.(this).serializeArray();
$.post('url',{name:name}, function(data){ //ajax-запрос на наличие имени
if(data) { //имя присутствует
$.post('url',send,function(data){ //добавление комментария и возврат значений
//выводим полученные данные на страницу
},'тип возвращаемых данных');
} else {
//вывод вашего promt;
}
},'тип возвращаемых данных');
return false;
})
|
И еще одно замечание. Если речь идет об асинхронном добавлении комментария, при этом пользователь читает некую тему с комментариями, то он может не знать о комментариях поступивших в это время не от него. Значит нужен постоянный опрос сервера и вывод новых комментариев на страницу. | |
|
|
|
|
|
|
|
для: confirm
(07.09.2012 в 12:21)
| | Код писался в разное время и с разным уровнем знаний jQuery и Js-a, по этому такая вот мешанина и не оптимальность. Потихоньку переписываю и делаю нормально.
дело в том, что функция по идеи использоваться будет в нескольких местах и дублировать ее несколько раз не охота, по этому и вывел в отдельную.
Так и есть, новые комментарии от других пользователя у читающего в данный момент пост выводятся... | |
|
|
|
|
|
|
|
для: Aidaho
(07.09.2012 в 14:38)
| | Странная однако логика - дело в том, что функция по идеи использоваться будет в нескольких местах. Что, за одной страницей сидят несколько сот пользователей, каждый из которых стремиться ввести свое имя? Неужели нельзя сделать единственный запрос при загрузке страницы, чтобы запомнить на сервере вопрошающего - "он существует"? Ведь результат этого запроса можно запомнить, и использовать хоть на каждый элемент страницы в любое время. Тем более, что страницу отдает сервер, и нет труда выяснить сразу - есть/нет или регистрированный/нерегистрированный пользователь, и соответственно поступать, то есть делать запросы с клиента в последствии для этого нужды нет.
Ну что за мода усложнять ситуацию? | |
|
|
|
|
|
|
|
для: confirm
(07.09.2012 в 14:53)
| | У меня комментарии могут вводить, как зарегистрированные пользователи так и нет. Как я спрошу у сервера есть ли такой пользователь если гость еще имя не ввел? Вот для этого и нужна эта функция, когда товарищ введет имя в поле, что бы оставить коммент... тогда я его и проверяю...
сделал, кстати, как вы говорили:
function commentAdd() {
var id = document.getElementById('id').value;
var userName = document.getElementById('userName').value;
userName = encodeURI(userName);
var comment = document.getElementById('comment').value;
var subs = document.getElementById('subsInput').value;
var button = document.getElementById('button-submit');
var url = 'http://aidaho.kz/function/comment.php?actionCom=add&userName=' + userName + '&comment=' + encodeURI(comment) +'&id='+id + '&mailsubs='+subs;
if(userName.length > 0) {
var cookie = getCookie('name');
if(!cookie) {
jQuery.post(
'http://aidaho.kz/function/comment.php', {'chekName':userName},
function(html){
if(html != 'Ok'){
jQuery.prompt('Такое имя зарегистрированно. Выберите другое имя.',{ opacity: 0.8 , prefix: 'jqi'});
jQuery.stop();
}
}
);
}
if(comment.length > 0) {
if(subs.length > 0) {
if(!checkmail(subs)) {
showError(1);
jQuery.stop();
}
}
button.innerHTML = '<img src=/inc/img/loader.gif />'
jQuery.ajax({
url: url,
cache: false,
success: function(html){
jQuery(".comment-new").html(html).animate({opacity: 1}, 700);
jQuery(".comment-new").toggleClass("comment-new");
jQuery("#id"+id).addClass("comment-new");
jQuery("#id"+id).removeAttr("id");
jQuery("#comment").attr('value', '');
jQuery("#comment").val("");
button.innerHTML = 'Комментировать';
countComment(id);
}
});
} else {
jQuery.prompt('А сам комментарий? Введите комментарий. :)',{ opacity: 0.8 , prefix: 'jqi'});
}
} else {
showError(2);
}
}
|
Но скрипт не тормазится ( | |
|
|
|
|
|
|
|
для: Aidaho
(07.09.2012 в 15:11)
| | Здрасьте, а регистрированному пользователю вы не устанавливаете куки? А запомнить при первом контакте с пользователем, как я говорил выше?
Вы сделали совсем не так как я писал:
первое - опять пишите этот бедлам var id = document.getElementById('id').value; var userName = document.getElementById('userName').value;.... когда я показывал как получить объект полей формы для передачи его ajax-методом.
второе - выбросите jQuery.ajax() из своего кода и используйте jQuery.post() потому, что вы используете его не по назначению.
Скрипт и не должен тормозиться, иначе это не скрипт, а сказка 1000 и одна ночь. О каком "тормозе" речь?
Ранее я вам вроде бы как говорил, что "jQuery методы возвращают ссылку на объект...". Вот это:
jQuery(".comment-new").html(html).animate({opacity: 1}, 700);
jQuery(".comment-new").toggleClass("comment-new");
jQuery("#id"+id).addClass("comment-new");
jQuery("#id"+id).removeAttr("id");
jQuery("#comment").attr('value', '');
jQuery("#comment").val("");
нужно производить так
jQuery(".comment-new")
.html(html)
.toggleClass("comment-new")
.animate({opacity: 1}, 700);
jQuery("#id"+id).addClass("comment-new").removeAttr("id");
//тут вообще чушь полная
//дважды очищать значение,
//сначала через атрибут,
//затем непосредственно значение,
//поэтому первое выбрасываем
jQuery("#comment").attr('value', ''); //это выкинуть
jQuery("#comment").val("");
|
| |
|
|
|
|
|
|
|
для: confirm
(07.09.2012 в 15:41)
| | Куки с именем для не зареганых я устанваливал, но из-за небольшого конфликта пришлось их убрать. К тому же если гость зашел в первый раз и куков у него нет, что тогда делать?
Исправил вот так, с формой потом разбирусь:
function commentAdd() {
var id = document.getElementById('id').value;
var userName = document.getElementById('userName').value;
userName = encodeURI(userName);
var comment = document.getElementById('comment').value;
var subs = document.getElementById('subsInput').value;
var button = document.getElementById('button-submit');
var url = 'http://aidaho.kz/function/comment.php';
if(userName.length > 0) {
var cookie = getCookie('name');
if(!cookie) {
jQuery.post(
'http://aidaho.kz/function/comment.php', {'chekName':userName},
function(html){
if(html != 'Ok'){
jQuery.prompt('Такое имя зарегистрированно. Выберите другое имя.',{ opacity: 0.8 , prefix: 'jqi'});
jQuery.stop();
}
}
);
} /
if(comment.length > 0) {
if(subs.length > 0) {
if(!checkmail(subs)) {
showError(1);
jQuery.stop();
}
}
button.innerHTML = '<img src=/inc/img/loader.gif />'
jQuery.post(
url,
{ 'actionCom': 'add',
'userName': userName,
'comment': encodeURI(comment),
'id': id,
'mailsubs': subs
},
function(html){
jQuery(".comment-new")
.html(html)
.toggleClass("comment-new")
.animate({opacity: 1}, 700);
jQuery("#id"+id).addClass("comment-new");
jQuery("#id"+id).removeAttr("id");
jQuery("#comment").val("");
button.innerHTML = 'Комментировать';
countComment(id);
});
} else {
jQuery.prompt('А сам комментарий? Введите комментарий. :)',{ opacity: 0.8 , prefix: 'jqi'});
}
} else {
showError(2);
}
}
|
| |
|
|
|
|
|
|
|
для: Aidaho
(07.09.2012 в 16:42)
| | Куки может устанавливать и клиент, это раз.
Отправляет клиент запрос на сервер, проверили, и вернули:
usr = true; //false
и используйте откуда угодно и где угодно. Это два. | |
|
|
|
|
|
|
|
для: confirm
(07.09.2012 в 17:18)
| | Правильно ли я понял: гость пытается написать комментарий, вводит имя, на сервер полетела проверка, вернул сервер занято имя или нет, ответ сервера вставили записали в куки с помощью JS, потом с помощью него проверили, что есть в куке? | |
|
|
|
|
|
|
|
для: Aidaho
(07.09.2012 в 17:22)
| | А почем нет?
<script>
var usr;
//где-то первый запрос к серверу
$.post {
//сервер отвечает - если не проверялся сей изер, возвращают инфу о нем.
//запомнили ее
usr = server-user;
}
//а далее используете значение usr где угодно
//и сервер уже имеет его признак - кроме кук еще есть и сессия.
<script> | |
|
|
|
|
|
|
|
для: confirm
(07.09.2012 в 17:30)
| | Ну допустим я изменю функцию... но почему не отрабатывает в функции jQuery.stop()? | |
|
|
|
|
|
|
|
для: Aidaho
(07.09.2012 в 17:55)
| | Понятия не имею почему она не срабатывает, так как не знаю этого плагина (promt). А метод .stop() ничего и не тормозит, а прекращает выполнение текущей анимации. Значит у вас где-то в чем-то баг.
Вы назвали свой пост некорректно - if ... else ... логика не может быть кривой, это просто конструкция языка выполняющая ВАШУ логику, которую ВЫ в нее вкладываете. Как вы захотели (предположили), так она и действует. | |
|
|
|
|
|
|
|
для: confirm
(07.09.2012 в 18:03)
| | Про If понятно )) просто не правильно выразился.....
А как можно тогда остановить работу функции? | |
|
|
|
|
|
|
|
для: Aidaho
(07.09.2012 в 18:06)
| | Да откуда я знаю, я же написал, что не знаю этого плагина. Если это копия, по сути действий, стандартного окна promt, то ваше .stop() для него, может остановить только анимацию этого плагина, и то, если она одна в очереди или текущая, иначе обращаться к этому методу нужно не так.
А вот закрыть этот плагин, само сообщение, никакой stop() не сможет - стандартное окно promt ждет выбора пользователя, именно в этом суть истинно мадальных окон. Можно только удалить объект этот методом .remove(). Но вот вопрос - это сообщение/выбор для пользователя должно быть логичным, то есть тогда, когда в нем есть необходимость, и вы должны получить выбор пользователя, а значит щемящего вопроса как сделать "стоп" быть не должно. В противном случае этот плагин срабатывает у вас совсем не кстати, а значит ваша логика действий хромает. | |
|
|
|
|
|
|
|
для: confirm
(07.09.2012 в 18:21)
| | Нет, мне надо остановить не .promt(), а функцию добавления комментария. Модальное окно должно висеть, что бы пользователь прочитал сообщение и нажал Ок. | |
|
|
|
|
|
|
|
для: Aidaho
(07.09.2012 в 21:53)
| | Я вам вроде бы как написал, и не функцию, а метод, и когда получен ответ от сервера, и вы с ним что-то сотворите, то все, метод отработал и отвалился. Все, спать ушел метод. Что у вас там продолжает работать и почему, ума не представляю. | |
|
|
|
|
|
|
|
для: Aidaho
(07.09.2012 в 21:53)
| | А если речь не о плагине, то зачем после него jQuery.stop();, и еще в одном месте это?
В общем так - выбрасывайте этот код, пишите заново, без смеси чистого JS и jQuery там, где в этом нет необходимости. Но прежде чем писать, и когда пишите, размышляйте, именно размышляйте, а не просто думайте. Тогда все получится. | |
|
|
|
|
|
|
|
для: Aidaho
(06.09.2012 в 19:29)
| | Сичас "акей" не пишут.
Нада писать "клёво"
if (html == 'клёво') всегда будет давать true. | |
|
|
|
|
|
|
|
для: ЯСА
(06.09.2012 в 19:56)
| | хех ) а чего тогда не "супер" сразу? ) | |
|
|
|
|
|
|
|
для: Aidaho
(06.09.2012 в 20:02)
| | Шобы работала 'супир' нада писать if (htmlЪ == 'супир') | |
|
|
|
|