2015-09-18 5 views
1

Итак, у меня есть кнопка «вверх», которая при нажатии начинается с обратного отсчета с 8, и когда она достигает 0, создается ajax-вызов для update.php, который, в свою очередь, обновляет таблицу sql. update.php работает.Ajax не всегда называется

<input type='button' id='countdw' value='Wait 8s' class='btn btn-primary disabled'> 

Это работает, просто не каждый раз, когда отсчет достигает 0. Этот бит кода, кажется, не выполнять каждый раз, когда

$.ajax({ 
     url: "update.php", 

Вот код

<script> 
       var secsLeft = 8; 
       setInterval(function(){ 
        secsLeft--; 
        if(secsLeft > 0){ 
         $('#countdw').val('Wait ' + secsLeft + 's'); 
        } else if(secsLeft == 0){ 
         $('#countdw').removeClass('disabled'); 
         $('#countdw').val('UP'); 
         $('#countdw').attr("onclick","myfunction()"); 

        } 
       }, 1000);   
      </script> 

      <script> 
       count=0; 
       function myfunction(){ 
        if(mycount!=0 && mycount%25==0){ 

        }else{ 
          var secsLeft = 8; 
          setInterval(function(){ 
           secsLeft--; 
           if(secsLeft > 0){ 
            $('#countdw').addClass('disabled'); 
            $('#countdw').val('Wait ' + secsLeft + 's'); 
           } else if(secsLeft == 0){ 
            $('#countdw').removeClass('disabled'); 
            $('#countdw').val('UP'); 
            $('#countdw').attr("onclick","myfunction()"); 

            $.ajax({ 
           url: "update.php", 
           data:{'user':'<?php echo $subid ?>','data':'<?php echo $key ?>'}, 
           success: function(result){ 

           } 
          }); 

           } 
          }, 1000); 

        } 
        up(); 
       } 
      </script> 

Любая помощь будет принята с благодарностью.

+0

Так какая часть не работает. Сценарий PHP или AJAX? – samrap

+0

Вы отлаживали, чтобы посмотреть, где он перестает обрабатывать? –

ответ

2

Меньше или равно

# instead of 
#  if(secsLeft == 0){ 
# test if it's less-or-equal zero 
if(secsLeft <= 0){ 

В событиях JavaScript иногда накапливаются, а затем возникают конфликтные ситуации, которые, как представляется маловероятным. В вашем случае это может быть так, что secsLeft уменьшается два раза, прежде чем он проверяется на равенство.

Был ли запрос отправлен?

Убедитесь, что запрос AJAX не отправлен. В каждом браузере есть инструменты для разработчиков, где вы можете проверить весь трафик. Убедитесь, что в вашем ответе на запрос AJAX нет сообщений об ошибках.

Кроме того, что вы должны добавить console.log(..) к success() и error() Funtions из $.ajax, чтобы увидеть, если что-то происходит за занавесом.

Что происходит потом?

Вы вызываете метод up(). Убедитесь, что этот метод не предотвращает вызов AJAX, например, путем перенаправления.

+0

Хорошо, это был update.php, но спасибо за предложение инструментов разработчика. Я только что установил/использовал firebug, и это помогло мне найти проблему. Я попробовал secLeft <= 0, и он включал и выключал кнопку и несколько раз вызывал update.php. Приветствует снова. – withjamin

+0

Часто мы можем указать только в каком-то направлении, хотя решение - это нечто другое. :-) –

0

Прежде всего, я хочу, чтобы вы простили мой английский язык. Я не могу получить вашу озабоченность, но когда вы видите свой код, какова роль переменной mycount и где она определена? когда setInterval() работает с первым блоком сценария, secsLeft всегда будет уменьшаться. Поэтому каждый раз, когда secsLeft будет <= 0, у вас будут инструкции в блоке «else», который будет выполнен, и, возможно, это не желаемый результат. Это можно оптимизировать, остановив функцию времени, когда secsLeft<=0. Тогда вы будете иметь что-то вроде этого:

<script> 
      var secsLeft = 8; 
      var timedDecreaseID = setInterval(function(){ 
       secsLeft--; 
       if(secsLeft > 0){ 
        $('#countdw').val('Wait ' + secsLeft + 's'); 
       } else { //secsLeft <= 0 
        $('#countdw').removeClass('disabled'); 
        $('#countdw').val('UP'); 
        $('#countdw').attr("onclick","myfunction()"); 

        clearInterval(timedDecreaseID);//will stop this timed function 
       } 
      }, 1000);   
     </script> 

Во втором блоке сценария может быть «столкновение» между setInterval которая реализуется и в предыдущем другом в первом блоке сценария. Это также объясняет, почему я рекомендую остановить первый после выполнения соответствующего условия. Другое замечание состоит в том, что если вы сделаете тест secsLeft <=0, вы будете иметь вызов ajax каждый раз, когда secsLeft будет уменьшаться по значению 0, и это всегда произойдет, если рассматриваемый вызов setInterval не будет остановлен.Итак, если это не желаемый результат, я думаю, что лучше сделать что-то вроде:

<script> 
      count=0; 
      function myfunction(){ 
       if(mycount!=0 && mycount%25==0){ 

       }else{ 
         var secsLeft = 8; 
         timedDecreaseID = setInterval(function(){ 
          secsLeft--; 
          if(secsLeft > 0){ 
           $('#countdw').addClass('disabled'); 
           $('#countdw').val('Wait ' + secsLeft + 's'); 
          } else {//secsLeft <= 0 
           $('#countdw').removeClass('disabled'); 
           $('#countdw').val('UP'); 
           $('#countdw').attr("onclick","myfunction()"); 

           $.ajax({ 
          url: "update.php", 
          data:{'user':'<?php echo $subid ?>','data':'<?php echo $key ?>'}, 
          success: function(result){ 

          } 
         }); 

         clearInterval(timedDecreaseID);//will stop this timed function 
          } 
         }, 1000); 

       } 
       up(); 
      } 
     </script> 
+0

Большое вам спасибо за ваш ответ. Я реализовал это как да, это имеет смысл, хотя мой исходный код действительно работал нормально, это была проблема update.php. Я заметил, что setInterval работает очень медленно, используя Chrome, возможно, это только я? но мой обратный отсчет - это довольно жуткий код моего кода и исправленная версия. Знаете ли вы, почему? возможно, это только я. – withjamin

+0

В зависимости от использования процессора процессора процесс может занять некоторое время. Тогда когда-нибудь вы должны это учитывать, функция времени, подобная 'setInterval', может не соответствовать точно определенному временному интервалу. Может быть, более практично было бы дать приблизительное значение, например '985ms' вместо' 1000ms'; так что вы можете получить ошибку поля. – tnga

Смежные вопросы