Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 31.07.2010, 20:32
Интересующийся
Отправить личное сообщение для Saymor Посмотреть профиль Найти все сообщения от Saymor
 
Регистрация: 31.07.2010
Сообщений: 13

вопрос по $.ajax
за помощь отблагодарю денежкой
предложения по улучшению кода с большим удовольствием приму.
я хочу сделать голосование с возможностью выбора возраста.
о работе скрипта: есть кнопки "ЗА(ON)" и "ПРОТИВ(OFF)", при нажатии на одну из них вываливается список с возростом, типа
Выберите Ваш возраст:
моложе 20
21-30
31-40
41-50
51-60
61 старше
где пользователь выбирает свой возраст, кликает например на кнопку "21-30" и с помощью AJAX'a пошли данные к базе!
скажу сразу что ВСЕ как я задумал работает!!
но есть одно, маленький нюанс.
суть проблемы:
если пользователь кликает например по кнопке "ЗА(ON)" -> выбирает возраст -> запрос идет к базе от "ЗА(ON)". Итого: РАБОТАЕТ
а вот если кликает например сначала по кнопке "ЗА(ON)", потом "ПРОТИВ(OFF)" (и наоборот), тоесть сначала хотел проголосовать ЗА, потом передумал, нажал на "ПРОТИВ(OFF) -> выбирает возраст -> вот тут-то и косяк, запрос идет к базе от "ЗА(ON)" и "ПРОТИВ(OFF)".
то есть почему-то выполняется 2ое обращение у базе!
вот код:
<script type="text/javascript">
   var j = jQuery;
   function footer(OnOff){
      j(OnOff).click(function(){
         j(".panel").slideUp("slow");
         j(".boxOn").css({'display':'none'});
         j(".boxOff").css({'display':'none'});
         j(".center").css({'display':'block'});
         return false;
      });
   }
   function ajaxURL(box, rat, age, objid){
      j(box).html('<div class="load"></div>');
      j.ajax({
         type:"POST",
         url:"ajax.index.php",
         data:"option=com_kino&task=vote"+rat+age+"&id=<?=$id;?>",
         cache:false,
         success:function(html){j(box).html(html);}
      });
   }
   j(document).ready(function(){
      j(".center").css({'display':'none'});
      <?php /* кликаем на .boxOn > вываливается панель #panel */?>
      j("#on").bind("click", function(){
         
         j(".panel").attr('id','panelON').slideDown("slow");
         <?php /* присваиваем уникальный id каждому элементу vozrast */ ?>
           j(".panel div").attr('id',function(index){return 'on_'+index;}).addClass("vozrast_On").removeClass("vozrast_Off");
         <?php /* выводим кнопки, ловим клик и обрабатываем AJAX */?>
           j("#on_0").one("click", function(){ajaxURL(".boxLeft", "&query=on", "&age=0", "<?=$id;?>");});
         j("#on_1").one("click", function(){ajaxURL(".boxLeft", "&query=on", "&age=1", "<?=$id;?>");});
         j("#on_2").one("click", function(){ajaxURL(".boxLeft", "&query=on", "&age=2", "<?=$id;?>");});
         j("#on_3").one("click", function(){ajaxURL(".boxLeft", "&query=on", "&age=3", "<?=$id;?>");});
         j("#on_4").one("click", function(){ajaxURL(".boxLeft", "&query=on", "&age=4", "<?=$id;?>");});
         j("#on_5").one("click", function(){ajaxURL(".boxLeft", "&query=on", "&age=5", "<?=$id;?>");});
         footer(".vozrast_On");
      });
        <?php /* отрицательный отзыв */?>
        j("#off").bind("click", function(){         
         
         j(".panel").attr('id','panelOFF').slideDown("slow");
         <?php /* присваиваем уникальный id каждому элементу vozrast */?>
           j(".panel div").attr('id',function(index){return 'off_'+index;}).addClass("vozrast_Off").removeClass("vozrast_On");
         <?php /* выводим кнопки, ловим клик и обрабатываем AJAX */?>
           j("#off_0").one("click", function(){ajaxURL(".boxRight", "&query=off", "&age=0", "<?=$id;?>");});
         j("#off_1").one("click", function(){ajaxURL(".boxRight", "&query=off", "&age=1", "<?=$id;?>");});
         j("#off_2").one("click", function(){ajaxURL(".boxRight", "&query=off", "&age=2", "<?=$id;?>");});
         j("#off_3").one("click", function(){ajaxURL(".boxRight", "&query=off", "&age=3", "<?=$id;?>");});
         j("#off_4").one("click", function(){ajaxURL(".boxRight", "&query=off", "&age=4", "<?=$id;?>");});
         j("#off_5").one("click", function(){ajaxURL(".boxRight", "&query=off", "&age=5", "<?=$id;?>");});
         footer(".vozrast_Off");
      });
   });
   </script>

<div style='text-align:center;margin-top:5px;'>
       <div class='boxLeft'><?=$sumON; /*число из базы*/ ?></div>
                          <div class='boxOn' id='on'></div><div class='boxOff' id='off'></div><div class='center'></div>
       <div class='boxRight'><?=$sumOFF; /*число из базы*/ ?></div>
</div><div style='clear:both;'></div>

<div class='panel'>Выберите Ваш возраст:
       <div>моложе 20</div>
       <div>21-30</div>
       <div>31-40</div>
       <div>41-50</div>
       <div>51-60</div>
       <div>61 старше</div>
</div>
Ответить с цитированием
  #2 (permalink)  
Старый 31.07.2010, 20:38
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от Saymor
j("#on_0").one("click", function(){ajaxURL(".boxLeft", "&query=on", "&age=0", "<?=$id;?>");});
Сообщение от Saymor
j("#off_0").one("click", function(){ajaxURL(".boxRight", "&query=off", "&age=0", "<?=$id;?>");});
вы не снимаете старый обработчик события, и при этом добавляете новый.
как итог, выполняются оба.
поэтому количество запросов будет такое же, как и количество кликов по #on/#off
Ответить с цитированием
  #3 (permalink)  
Старый 31.07.2010, 20:40
Интересующийся
Отправить личное сообщение для Saymor Посмотреть профиль Найти все сообщения от Saymor
 
Регистрация: 31.07.2010
Сообщений: 13

подскажите а как снять-то ?
Ответить с цитированием
  #4 (permalink)  
Старый 31.07.2010, 20:42
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от Saymor
подскажите а как снять-то ?
а, что в документацию заглянуть - это трудно?
Ответить с цитированием
  #5 (permalink)  
Старый 31.07.2010, 20:49
Интересующийся
Отправить личное сообщение для Saymor Посмотреть профиль Найти все сообщения от Saymor
 
Регистрация: 31.07.2010
Сообщений: 13

Сообщение от Gvozd
а, что в документацию заглянуть - это трудно?
unbind(type , fn ) ?

это для On / Off
Ответить с цитированием
  #6 (permalink)  
Старый 31.07.2010, 20:51
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Saymor,
браво.
вам понадобилось всего 7 минут, чтобы найти нужный раздел документации.
спрашивается, зачем задавать идиотские вопросы, если ответ на них находится самостоятельно достаточно быстро?
Ответить с цитированием
  #7 (permalink)  
Старый 31.07.2010, 20:56
Интересующийся
Отправить личное сообщение для Saymor Посмотреть профиль Найти все сообщения от Saymor
 
Регистрация: 31.07.2010
Сообщений: 13

Сообщение от Gvozd
браво.
бился 2 дня! а вы меня на путь истенный направили!
предложением:
Сообщение от Gvozd
вы не снимаете старый обработчик события, и при этом добавляете новый.
как итог, выполняются оба.
поэтому количество запросов будет такое же, как и количество кликов по #on/#off
еще и в доки отправили...
главное зацепки..

спасибо! можно Вас отблагодарить?
WMR
или Qiwi
??
Ответить с цитированием
  #8 (permalink)  
Старый 31.07.2010, 21:01
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от Saymor
главное зацепки..
ну, да, форум пожалуй для этого нужен
задать направление, и дать зацепки
Сообщение от Saymor
WMR
в них пойдет.
кошель скинул в личку
Ответить с цитированием
  #9 (permalink)  
Старый 31.07.2010, 23:18
Интересующийся
Отправить личное сообщение для Saymor Посмотреть профиль Найти все сообщения от Saymor
 
Регистрация: 31.07.2010
Сообщений: 13

Сообщение от Gvozd
ну, да, форум пожалуй для этого нужен
задать направление, и дать зацепки
с unbind() все равно не выходит задуманного!
как же отвязать on от off в моем случае?
Ответить с цитированием
  #10 (permalink)  
Старый 01.08.2010, 00:12
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от Saymor
с unbind() все равно не выходит задуманного!
как же отвязать on от off в моем случае?
а как вы его используете?
вы в курсе, что? :
alert(function(){} == function(){});//false
//================================
var qwe=function(){}
alert(qwe == qwe);//true

а в unbind надо передавать ту же функцию, а не такую же
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Возвращение значения $.ajax() roma86 jQuery 2 19.03.2010 20:56
Вопрос о циклических ссылках (JavaScript -> Dom -> JavaScipt) BlueIce Events/DOM/Window 10 17.02.2010 21:58
Вопрос про ООП, цепочки прототипов. Shaci Общие вопросы Javascript 5 27.01.2010 14:50
мааленький вопрос по Regexp:) mirniy Общие вопросы Javascript 1 22.01.2009 20:47
вопрос по long poll megaswin AJAX и COMET 2 27.05.2008 09:20