У меня точно такая же проблема, и я написал оболочку для вызовов POST ajax. Идея состоит в том, что когда вы пытаетесь выполнить POST, он сначала делает GET-запрос к простому ping.php, и только в случае успеха он запрашивает POST.
Вот как это выглядит в режиме Backbone:
var BaseView = Backbone.View.extend({
ajax: function(options){
var that = this,
originalPost = null;
// defaults
options.type = options.type || 'POST';
options.dataType = options.dataType || 'json';
if(!options.forcePost && options.type.toUpperCase()==='POST'){
originalPost = {
url: options.url,
data: options.data
};
options.type = 'GET';
options.url = 'ping.php';
options.data = null;
}
// wrap success
var success = options.success;
options.success = function(resp){
if(resp && resp._noNetwork){
if(options.offline){
options.offline();
}else{
alert('No network connection');
}
return;
}
if(originalPost){
options.url = originalPost.url;
options.data = originalPost.data;
options.type = 'POST';
options.success = success;
options.forcePost = true;
that.ajax(options);
}else{
if(success){
success(resp);
}
}
};
$.ajax(options);
}
});
var MyView = BaseView.extend({
myMethod: function(){
this.ajax({
url: 'register.php',
type: 'POST',
data: {
'username': 'sample',
'email': 'sample@sample.com'
},
success: function(){
alert('You registered :)')
},
offline: function(){
alert('Sorry, you can not register while offline :(');
}
});
}
});
Имейте что-то вроде этого в вашем манифесте:
NETWORK:
*
FALLBACK:
ping.php no-network.json
register.php no-network.json
Файл ping.php так же прост, как:
<?php die('{}') ?>
И no-network.json выглядит так:
{"_noNetwork":true}
И все, перед любым POST он сначала попробует GET ping.php и вызовет offline (), если вы не в сети.
Надеюсь, это поможет;)