Ajax:如果有条件,防止Ajax执行的功能

时间:2018-09-10 15:33:34

标签: javascript php jquery ajax

我的php应用程序中有很多像这样的ajax函数:

$.post('index.php?controller=suivi&action=ajax_intervention_save', {
            id: root.find('#id').val(),
            begin: begin,
            end: end,
        }, function(res) {
            //if is not an ID
            if (res && isNaN(res)) {
                error();
                SUIVI.showButton();
            } else {
                displaySuccess("Fiche saved");
            }
        });

当我有一个maintenance_mode == 1时,我想阻止对我应用程序的访问。因此,我添加了此条件:

$.post('index.php?controller=suivi&action=ajax_intervention_save', {
            id: root.find('#id').val(),
            begin: begin,
            end: end,
        }, function(res) {
        if(res === 'MAINTENANCE'){
            error(res);
            return;
        }
            //if is not an ID
            if (res && isNaN(res)) {
                error();
                SUIVI.showButton();
            } else {
                displaySuccess("Fiche saved");
            }
        });

我的问题是我在其他文件中有很多类似的功能。如何在所有功能中不复制代码res ==='MAINTENANCE'? 我希望有一种方法可以告诉我在mode == 1时可以显示所有ajax函数的“维护模式消息”

这是我的index.php重定向:

if(\app\models\Config::getValue('maintenance_mode')){
if (Tools::isAjax())
    die('MAINTENANCE');
elseif(!isset($_GET['action']) || $_GET['action'] !== 'maintenance'){
    header('Location:index.php?module=general&action=maintenance');
}

}

谢谢

4 个答案:

答案 0 :(得分:0)

我认为最好的方法如下:您将拥有一个全局函数,该函数期望应调用的URL,以及一个与请求一起发送的信息的数组。

该函数应使用给定的注入信息来执行所有ajax请求。然后,将已实现的所有ajax调用更改为调用该函数。

有了这一点,您就可以在一点上进行所需的更改。

但是我想这个问题主要是基于观点的。

答案 1 :(得分:0)

die()之前,您可以设置一个不在200范围内的状态标头,因此会出错$.post并且不将其称为成功回调。

header("HTTP/1.1 503 SERVICE UNAVAILABLE");
die('MAINTENANCE');

然后使用jQuery全局ajaxError()在所有请求中查找该错误状态


使用张贴到http://httpbin.org/的示例,其中包含状态代码的测试路径

// will see all ajax errors in page
$(document).ajaxError(function(event, xhr) {

  var maintenanceMessage = "SERVICE UNAVAILABLE" // default 503 message
  
  if (xhr.status === 503 && xhr.statusText === maintenanceMessage) {
    // do something to notify user of maintenance mode      
    console.log('Status::', [xhr.status, xhr.statusText])
  }
  // else ...do things for other errors also  
});

// make simple request in order to trigger error
var url = 'http://httpbin.org/status/503';
$.post(url, function() {
  console.log('Should not see this due to status code error')
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

请注意,有多种方法可以使用php设置状态标题,请参见https://stackoverflow.com/a/12018482/1175966

答案 2 :(得分:0)

如果您不想重构所有其他代码,则可以覆盖成功回调。您可以通过设置全局的beforeSend回调并更改success对象的erroroptions或其他任何回调属性来实现此目的

$.ajaxSetup({
  beforeSend:function(xhr,options){
    //save the original callback
    var original = options.success;

    //setup the new callback
    options.success = function(data){
      if(data == "MAINTENANCE"){
        error();
        return;
      }
      //call the original callback if no error
      original.apply(this,arguments);
    }
  }
})

请注意,但是如果ajax调用使用promise回调,则不会拦截它们。例如,如果您有:

$.post().then(function(){
  //code
});

即使您设置了then(),您的beforeSend回调也会被调用。

答案 3 :(得分:0)

您可以尝试以下方法:

if(res !== 'MAINTENANCE'){
$.post('index.php?controller=suivi&action=ajax_intervention_save', {
        id: root.find('#id').val(),
        begin: begin,
        end: end,
    }, function(res) {
        //if is not an ID
        if (res && isNaN(res)) {
            error();
            SUIVI.showButton();
        } else {
            displaySuccess("Fiche saved");
        }
    });
}