Как мне защитить от getJSON, не вызывая обратный вызов? - PullRequest
2 голосов
/ 24 мая 2011

Перед отправкой кнопки формы я выполняю вызов $ .getJSON, который проверяет некоторые данные, и когда он возвращается, он либо отображает диалоговое окно «Вы не правильно заполнили эту форму», либо выполняет форму.Отправить().Но иногда, особенно на моем медленном тестовом сервере, проходит несколько секунд, прежде чем вызывается обратный вызов, и поэтому я хотел бы включить некоторые визуальные индикаторы (отключенные кнопки, курсоры ожидания и т. Д.), Что вы нажали кнопку, изатем отключив эту визуальную индикацию в обратном вызове.Но мне сказали, что есть небольшой, но ненулевой шанс, что обратный вызов может не быть вызван.

Как лучше всего убедиться, что в такой ситуации у меня не будет нефункциональной формы?

Ответы [ 3 ]

4 голосов
/ 24 мая 2011

Вы можете использовать $.ajax с обратным вызовом .error в дополнение к обратному вызову .success вместо $.getJSON.Если запрос не выполнен, обратный вызов .error сработает.Вы можете использовать это для повторного включения и отображения подходящего сообщения, аналогичного тому, которое отображается в StackOverflow при неудачном голосовании.Пример:

$.ajax({
  url: "test.html",
  dataType: "json",
  success: function(html){
     $form.submit();
  },
  error: function(xhr, error){
     console.debug(xhr); 
     console.debug(error);
     $form.find(":input").attr("disabled", false);
  }
});
4 голосов
/ 24 мая 2011

Я бы просто использовал тайм-аут.Убедитесь, что enableForm () просто возвращается, если форма уже включена, и очистите тайм-аут, когда форма отключена, чтобы избежать запуска более одного таймера.

setTimeout (enableForm, 10000);// включает форму в любом случае через 10 с

2 голосов
/ 24 мая 2011

Вы можете посмотреть здесь http://api.jquery.com/jQuery.getJSON/ в разделе Объект jqXHR, это объясняет, что функция $ .getJSON () возвращает объект jqXHR, который реализует XMLHTTPRequest, поэтому у вас будут доступны .error, .success и .complete

Я думаю, что это будет работать в вашем случае:

$.getJSON("a.json", function() {}).error(function() {}) 
...