在任何AJAX调用之前触发一个javascript函数

trigger a javascript function before on any AJAX call

本文关键字:一个 函数 javascript AJAX 任何 调用      更新时间:2023-09-26

这里,我有一个函数,它需要在.NET项目中的任何AJAX调用之前调用。

目前,我必须在每次点击要调用AJAX方法的按钮时调用checkConnection,如果有网络连接,则进行实际的AJAX调用
无论如何,我想避免这种方式,checkConnection函数应该在表单上的任何AJAX调用之前自动调用

简而言之,我想让函数表现得像event,它将在任何AJAX调用之前被触发

添加示例,使AJAX调用按钮点击;当然,在检查了互联网可用性之后。。。

//check internet availability
function checkConnection() {
    //stuff here to check internet then, set return value in the variable
    return Retval;
}
//Ajax call
function SaveData() {
        var YearData = {
            "holiday_date": D.getElementById('txtYears').value
        };
        $.ajax({
            type: "POST",
            url: 'Service1.svc/SaveYears',
            data: JSON.stringify(YearData),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            processData: true,
            success: function (data, status, jqXHR) {
                //fill page data from DB
            },
            error: function (xhr) {
                alert(xhr.responseText);
            }
        });
    }

下面是调用函数的当前方式:

<form onsubmit="return Save();">
    <input type="text" id="txtYears" /><br />
    <input type="submit" id="btnSave" onclick="return checkConnection();" value="Save" />
    <script>
        function Save() {
            if (confirm('Are you sure?')) {
                SaveData();
            }
            else {
                return false;
            }
        }
    </script>
</form>

如果不使用JavaScript编写一次调用(!),就不能隐式调用函数。

因此,最好在实际的AJAX中调用它,为此您可以使用ajaxRequest的beforeSend属性,如下所示,因此不需要单独调用checkConnection()

$.ajax({
            type: "POST",
            url: 'Service1.svc/SaveYears',
            data: JSON.stringify(YearData),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            processData: true,
            beforeSend: function() {
               if(!checkConnection())
                   return false;
            },
            success: function (data, status, jqXHR) {
                //fill page data from DB
            },
            error: function (xhr) {
                alert(xhr.responseText);
            }
        });

它减少了您对form标签的onsubmit()的调用!

更新:要在每次AJAX请求之前注册全局函数,请使用:

$(document).ajaxSend(function() {
  if(!checkConnection())
     return false;
});

最好的方法是使用publish-subscribe模式来添加任何额外的函数,以便在预定时间调用(例如,在ajax之前或之后)。

jQuery已经支持自定义发布子rcibe

对于这个特定的例子,只需这样做:

//Ajax call
function SaveData(element) {
       var doAjax = true; 
       var YearData = {
            "holiday_date": D.getElementById('txtYears').value
        };
        if (element === myForm) 
        {
           doAjax = checkConnection();
        }
        if ( doAjax )
        {
        $.ajax({
            type: "POST",
            url: 'Service1.svc/SaveYears',
            data: JSON.stringify(YearData),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            processData: true,
            success: function (data, status, jqXHR) {
                //fill page data from DB
            },
            error: function (xhr) {
                alert(xhr.responseText);
            }
        });
        }
        else
        {
          // display a message
        }
    }

希望我能正确理解你的意思。

更新:

if中,如果函数是从窗体或字段调用的,则可以进行额外的检查(例如添加参数SaveData(元素))

如果您在html中使用saveData,请执行以下操作:"saveData(this)",也许您也应该发布您的html

您可以使用:

$(document)
.ajaxStart(function () {
  alert("ajax start");
})
.ajaxComplete(function () {
     alert("ajax complete");
})

就是这样!!

使用

beforeSend: function () {
},  

ajax方法