2010-10-13 3 views
2
$(document).ready(function() { 
    $('.raj').click(function() { 
     if (!$(this).hasClass('already')) { 

      $('.infos').html(''); 

      $('.infos').hide("fast"); 

      $.ajax({ 
       type: "POST", 
       dataType: "json", 
       url: "ggg/hhh/rrr.php", 
       success: function (msg) { 
        $('.infos').html(msg['ats']); 
        arr = msg['valid']; 
       } 
      }); 

      $('.infos').show("slow"); 

      if (arr == 1) { 
       $(this).css("cursor", "default"); 
       $(this).addClass('already'); 
       $(this).animate({ 
        opacity: 0.1 
       }, 1000); 
      } 
     } 
    }) 
}) 

Когда я нажимаю элемент с классом raj (это изображение), ничего не происходит. Только после того, как он будет нажат второй раз, мое событие, похоже, срабатывает. Почему это происходит?Почему мое событие не запускается в первый раз?

редактировать: эта часть задрачивал до:

if(arr == 1) 
{ 
    $(this).css("cursor", "default"); 
    $(this).addClass('already'); 
    $(this).animate({ 
     opacity: 0.1 
    }, 1000); 
} 

Но msg['valid'] действительно всегда один, так что я не понимаю.

ответ

4

Мне интересно, не так ли?

$(document).ready(function() { 
    $('.raj').click(function(){ 
     var thisObj = $(this); 
     if(!$(this).hasClass('already')) 
     { 
      $('.infos').html(''); 
      $('.infos').hide("fast"); 
      $.ajax({ 
       type: "POST", 
       dataType: "json", 
       url: "ggg/hhh/rrr.php", 
       success: function(msg) { 
        $('.infos').html(msg['ats']); 
        arr = msg['valid']; 
        $('.infos').show("slow"); 

        if(arr == 1) { 
         thisObj.css("cursor", "default"); 
         thisObj.addClass('already'); 
         thisObj.animate({ 
          opacity: 0.1 
         }, 1000); 
        } 
       } 
      });   

     } 
    })    
}) 

Похоже, что из-за того, что как-то трудно читать отступление, оно было неуместным.

Edit:

Дополнительная информация: Аякса вызов асинхронно. Это означает, что arr не устанавливается в 1 в первый раз, но во второй раз это происходит из-за того, что обратный вызов был запущен уже (мое единственное объяснение для этого)

+0

Попробуйте это так. Однако обработка результата должна быть выполнена после ajax callback. Вы уже проверили результат до того, как он был фактически завершен. – Vinzenz

+0

@Vinzenz: Почему здесь не работает '$ (this)', и мы должны использовать 'thisObj'? –

+1

+1 Еще одна вещь, которую следует иметь в виду: '$ .ajax' имеет свойство' context: ', которое вы можете установить, чтобы дать' this' в обратных вызовах значение, которое вы хотите. Таким образом, вы можете добавить 'context: this,', чтобы иметь эту ссылку в элементе в обратном вызове. – user113716

1

попробуйте запустить заявление, если (обр == 1) внутри AJAX обратного вызова (функция успеха)

+0

Какое черт?!?! Он работает с arr = 1, а не arr == 1 в первый раз. Как это может быть?! Неужели, может, я умер? –

+1

'arr == 1' истинно, если' arr' равно 1 и false, если это не так. 'arr = 1' всегда верно. – Quentin

1

Вы знаете, что ваш «аранжировка» установлен в функции пост, и что выполняется после проверки. ...

Ваш запрос ajax не является синхронным, вы только настраиваете браузер, который хотите выполнить ajax-запрос, но никогда не знаете, когда он будет выполнен.

Именно поэтому он работает во второй раз, с тех пор был выполнен запрос ajax.

+0

Тогда как я должен проверить? И почему это работает, если я пишу 'if (arr = 1)' not 'if (arr = 2'? –

+0

с arr = 1, вы устанавливаете переменную arr в 1, с arr == 1 вы проверяете, установлено ли значение 1. – some

+0

Вы должны перенести тест на функцию успеха, такую ​​как Vinzenz, написанный в его ответе. Это первый раз, когда вы можете проверить msg ["valid"] – some

0

Все начиная с $('.infos').show("slow"); и далее запускается после отправки запроса Ajax, но до ответ был получен, и таким образом до функция успеха запустилась.

Это означает, что arr не установлен в первый раз и установлен только во второй раз, потому что вы сделали его глобальным.

есть все, что должно произойти в ответ на данные, поступающих от сервера произойдет внутри функцию успеха, и не забудьте использовать var ключевое слово, чтобы сохранить ваш локальные переменные.

-1

Лучший способ - иметь firebug и иметь точку останова и проверить, как происходит поток. Вы можете легко решить этот подход.

Если это не работает, попробуйте нажать кнопку «Вживую», чтобы у вас не было проблем с привязкой.

+2

Задержка, возникающая при переходе через вручную, скорее всего, даст время ответа, чтобы вернуться, поэтому глобальный будет установлен, и скрипт таинственным образом начнет работать , Установка обработчика кликов с помощью 'live' тоже не поможет, так как ни один HTML не перезаписывается, и скрипт работает во второй попытке (если он работал в первый раз и не смог после этого, скорее всего, будет« жить ») – Quentin

+1

Вставка двух предупреждающих сообщений будет показана. сначала перед условием (arr == 1), а вторым - в вызове ajax. Вы увидите, что они вызваны в неправильном порядке, что сделает его очевидным, почему он не работает – Vinzenz

0

Вы должны добавить свою часть f-cked в свойство «success» запроса AJAX. В другой руке arr равен 0 в первый раз.

 var that = $(this); 

     $.ajax({ 
      type: "POST", 
      dataType: "json", 
      url: "ggg/hhh/rrr.php", 
      success: function (msg) { 
       $('.infos').html(msg['ats']); 
       arr = msg['valid']; 

       $('.infos').show("slow"); 

       if (arr == 1) { 
        that.css("cursor", "default"); 
        that.addClass('already'); 
        that.animate({ 
        opacity: 0.1 
        }, 1000); 
       } 

      } 
     }); 
Смежные вопросы