当前位置: 首页 > 面试题库 >

重新创建jQuery的ajaxStart和ajaxComplete功能

丌官绍元
2023-03-14
问题内容

我正在尝试在没有jQuery的情况下重现jQuery的函数ajaxComplete和ajaxStart,以便可以在没有库依赖项的任何环境中使用它们(这是一个特殊的用例)。这些功能允许在任何ajax请求之前和之后调用事件侦听器。在我的示例中,我将它们称为preAjaxListener和postAjaxListener。

我正在尝试通过连接到XMLHttpRequest对象并覆盖/装饰openand 来实现它send。是的,我知道这很脏。

XMLHttpRequest.prototype.open = (function(orig){
    return function(a,b,c){
        this._HREF = b; // store target url
        return orig.apply(this, arguments); // call original 'open' function
    };
})(XMLHttpRequest.prototype.open);

XMLHttpRequest.prototype.send = (function(orig){
    return function(){
        var xhr = this;
        _core._fireAjaxEvents('pre', xhr._HREF); // preAjaxListener fires

        var rsc = xhr.onreadystatechange || function(){}; // store the original onreadystatechange if it exists
        xhr.onreadystatechange = function(){ // overwrite with custom function
            try {
                if (xhr.readyState == 4){
                    _core._fireAjaxEvents('post', xhr._HREF); // postAjaxListneer should fire
                    this.onreadystatechange = rsc;
                } 
            } catch (e){ }
            return rsc.apply(this, arguments); // call original readystatechange function
        };

        return orig.apply(this, arguments); // call original 'send' function
    };
})(XMLHttpRequest.prototype.send);

我不想编写包装器功能来发出ajax请求。我希望能够挂接到页面上任何库(或使用香草js)发出的任何ajax请求。

到目前为止,仅该preAjaxListener功能有效。我似乎无法弄清楚为什么,但似乎onreadystatechange从未有人称呼过。任何指导将不胜感激。

工作演示:http :
//jsfiddle.net/_nderscore/QTQ5s/


问题答案:

使用.onreadystatechange不起作用,因为我正在使用jQuery进行测试,并且jQuery的ajax方法可以操纵并删除该onreadystatechange属性。

但是,为loadendIE 添加事件侦听器的方法在所有地方都可以正常工作。对于IE,我改为设置时间间隔-不是最佳解决方案,但它可以满足我的需要。
我只打算将此脚本用于IE8 +和现代浏览器。

XMLHttpRequest.prototype.send = (function(orig){
    return function(){
        _core._fireAjaxEvents('pre', this._HREF);

        if (!/MSIE/.test(navigator.userAgent)){
            this.addEventListener("loadend", function(){
                _core._fireAjaxEvents('post', this._HREF);
            }, false);
        } else {
            var xhr = this,
            waiter = setInterval(function(){
                if(xhr.readyState && xhr.readyState == 4){
                    _core._fireAjaxEvents('post', xhr._HREF);
                    clearInterval(waiter);
                }
            }, 50);
        }

        return orig.apply(this, arguments);
    };
})(XMLHttpRequest.prototype.send);


 类似资料:
  • 问题内容: 我有一个加载功能,并希望代码在加载时以及完成时将一些html写入div以显示页面。我在ajaxStart和ajaxComplete事件上看到了一些小文章,但是我不确定如何实现它们。 这是我正在考虑使用的jQuery,但是不确定如何在我当前使用的代码中实现… 这是我正在使用的当前jQuery: 问题答案: 如果它是单个div,并且您希望使用加载消息/指示符更新其内容,则可以这样进行: 除

  • 问题内容: 基本上就是这个问题(括号很重要) 问题答案: 并且针对 所有 请求 一起使用 ,在第 一个 同时请求开始时触发,然后在该同时批处理的 最后一个 完成时触发。 因此,假设您一次发出3个请求,在第一个请求开始时触发,在最后一个请求返回时(它们不一定按顺序完成)触发。 这些事件 没有 任何参数,因为它们是针对一批请求的: 并在 每个请求 发送/完成后触发一次。这就是为什么这些处理程序传递参数

  • 问题内容: 在哪个时间使用哪个。 在http://api.jquery.com/上的文档中: 对于ajaxStop(),它表示: 描述:注册所有Ajax请求完成后要调用的处理程序。这是一个Ajax事件。 对于ajaxComplete(),它说: 描述:注册一个在Ajax请求完成时要调用的处理程序。这是一个Ajax事件。 从我可以看到,由于以下原因,ajaxComplete()更加灵活: 无论完成了

  • 本文向大家介绍SQL 创建一个新功能,包括了SQL 创建一个新功能的使用技巧和注意事项,需要的朋友参考一下 示例 本示例创建一个名为FirstWord的函数,该函数接受varchar参数并返回另一个varchar值。

  • 问题内容: 此代码 在我的标记中 这是完整的ajax请求: 即使gif显示为旋转,也永远不会触发警报“开始”。AjaxStop如预期那样被触发。有什么想法吗? 问题答案: 之所以不会被触发,是因为直到ajax请求执行完 之后 (直到被调用时为止) , 您的处理程序才被注册。在被注册后为好,但 之前 的请求完成,所以当它回来就迷上了运行。 要解决此问题,请 在 首次致电 之前 将其移动: 更新:从j

  • 创建新的Arraylist(如第一种方法)与创建第二种方法之间的区别是什么?在创建一个时,您考虑了什么?