Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 侦听Ajax调用,而不在Ajax调用iteslf中键入其他代码_Javascript_Ajax_Events - Fatal编程技术网

Javascript 侦听Ajax调用,而不在Ajax调用iteslf中键入其他代码

Javascript 侦听Ajax调用,而不在Ajax调用iteslf中键入其他代码,javascript,ajax,events,Javascript,Ajax,Events,我计划了很长一段时间来创建一个JS函数,用于侦听失败的AJAX调用并执行某些操作(例如向单独的服务器报告错误) 我可以在Ajax代码本身的Ajax失败部分调用该函数,但我希望我的同事编写Ajax调用,而无需记住他们需要在Ajax失败部分键入任何内容 e、 g: 我们编写的代码如下: 我们要处理错误的所有调用,请转到预先指定的 ajax_controller2.php所以我们Ajax调用的目标文件是 始终称为ajax\u controller2.php。还有其他AJAX调用,但是 对于不同的ph

我计划了很长一段时间来创建一个JS函数,用于侦听失败的AJAX调用并执行某些操作(例如向单独的服务器报告错误)

我可以在Ajax代码本身的Ajax失败部分调用该函数,但我希望我的同事编写Ajax调用,而无需记住他们需要在Ajax失败部分键入任何内容

e、 g:

我们编写的代码如下:

  • 我们要处理错误的所有调用,请转到预先指定的 ajax_controller2.php所以我们Ajax调用的目标文件是 始终称为ajax\u controller2.php。还有其他AJAX调用,但是 对于不同的php文件,我们不希望为它们处理错误
是否可以只侦听对php文件的失败AJAX调用 调用ajax\u controller2.php时未在ajax中键入任何内容,失败 代码的一部分

整个想法是,我的同事在他们的HTML中只包含一个.js文件,其余的都是为他们完成的

这是我们使用的AJAX调用:

        var ajax = new XMLHttpRequest();
        var params = //some parameters here;
        ajax.open("POST", "ajax_controller2.php?m=somecase", true);
        ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        ajax.send(params);
        ajax.onreadystatechange = function () {
            var response = "";
            if (ajax.readyState == 1) {
                response += "Status 1: Server connection established ! <br/>";
            } else if (ajax.readyState == 2) {
                response += "Status 2: Request recieved ! <br/>";
            } else if (ajax.readyState == 3) {
                response += "Status 3: Processing Request ! <br/>";
            } else if (ajax.readyState == 4) {
                if (ajax.status == 200) {
                    var text = ajax.responseText;


                } else {
                    console.log("Ajax failed"); //In this portion of the code I could just type down the name of the function that when triggered, sends an error report.
                }
            }
        }
        //If an error occur during the ajax call.
        if (ajax.readyState == 4 && ajax.status == 404) {
            console.log("Error during AJAX call");
        }
    }
}
var ajax=new-XMLHttpRequest();
var params=//此处有一些参数;
open(“POST”,“ajax\u controller2.php?m=somecase”,true);
setRequestHeader(“内容类型”、“应用程序/x-www-form-urlencoded”);
发送(params);
ajax.onreadystatechange=函数(){
var响应=”;
if(ajax.readyState==1){
响应+=“状态1:服务器连接已建立!
”; }else if(ajax.readyState==2){ 响应+=“状态2:已收到请求!
”; }else if(ajax.readyState==3){ 响应+=“状态3:处理请求!
”; }else if(ajax.readyState==4){ if(ajax.status==200){ var text=ajax.responseText; }否则{ log(“Ajax失败”);//在代码的这一部分中,我可以键入函数名,当触发时,该函数会发送错误报告。 } } } //如果在ajax调用期间发生错误。 if(ajax.readyState==4&&ajax.status==404){ log(“AJAX调用期间出错”); } } }
您还可以更改XMLHttpRequest的原型,以便在onreadystatechange上插入事件处理程序

在下面的代码中,我使用
open
方法并使用
addEventListener
,这样它就不会与其他事件监听器混淆或丢失,即使是添加了
。onreadystatechange=function…

    function errorLoggingFunc(){ console.log('myFunc'); };

    XMLHttpRequest.prototype._open = XMLHttpRequest.prototype.open;

    XMLHttpRequest.prototype.open= function(){
        if(!this._hasErrorLog)
        {
            this._hasErrorLog = true;
            this.addEventListener('readystatechange', errorLoggingFunc);  
        }

        this._open.apply(this, arguments);
    };

这样,您的同事将继续使用XMLHttpRequest,但您的日志记录将始终存在。

为什么不围绕ajax逻辑编写一个包装函数来进行错误处理,并告诉您的同事使用该函数而不是“原始”ajax代码呢?我不确定这是否是最好的问题,因为您似乎没有具体的问题或错误。尝试一些东西,如果它不起作用,展示你尝试过的东西,并解释它不起作用的方式。问题表明,如果不在失败的ajax代码中键入任何内容,是否可以侦听“原始”ajax调用失败。这就是问题所在。我可以在Ajax状态404中调用errorHandler()。这就是我试图解决的问题。我也要求找到其他的解决办法。我想说的是,您可以将ajax请求的“核心”功能抽象为一些函数(或类)。您声明不希望其他人担心调用错误处理程序。这个解决方案可以实现这一点。你的问题是“我可以在不编写任何SQL(或其他流行的查询语言)的情况下编写查询吗?”简单地说,不,你不能。但是您可以将查询本身抽象为一个函数,这样,例如,您可能只传递表名和ID(或类似的内容)。啊,好的,明白了。我不久前使用了事件分派器和事件侦听器——我只是认为可能存在类似的东西,不需要事件分派——它只侦听正在运行的特定代码部分。这就是我问这个问题时的想法