1

我正在尝试向 jQuery 的 beforeSend 添加一些自定义代码。为此,我想出了以下代码:

(function( $ ){
    $.ajax_overlay = function(settings, overlay_selector, target_selector, class_active, class_deactive) {
        var $overlay = $(overlay_selector);
        function overlay_before(user_beforesend){
            if ( target_selector === undefined )
            {
                var $body = $('body');
                $overlay.height($body.height()).width($body.width()).css("position","absolute");
            }
            else{
                var $target= $(target_selector);
                $overlay.height($target.height()).width($target.width()).css("position","absolute");
                $target.css("position","relative").append($overlay);
            }

            if (typeof(class_active) == "string"){
                $overlay.addClass(class_active)
            }
            if (typeof(class_deactive) == "string") {
                $overlay.removeClass(class_deactive)
            }
            $overlay.css("display","block").animate(
                {
                    opacity: 0.8
                },
                500);
            if (typeof(user_beforesend) == "function"){
                user_beforesend();
            }
        }
        function overlay_complete(user_complete){
            if (typeof(class_active) == "string"){
                $overlay.removeClass(class_active);
            }
            if (typeof(class_deactive) == "string") {
                $overlay.addClass(class_deactive);
            }
            $overlay.animate(
                {
                    opacity: 0.0
                },
                500, function(){
                    $overlay.css("display","none");
                });
            if (typeof(user_complete) == "function"){
                user_complete();
            }
        }
        if (typeof(overlay_selector) == "string"){
            settings["beforeSend"] = overlay_before(settings["beforeSend"]);
            settings["complete"] = overlay_complete(settings["complete"]);
        }
        return jQuery.ajax(settings);
    }
})( jQuery );

主要思想是使用这个插件在每个 ajax 请求上添加一个覆盖。我面临的问题是我无法保持 beforeSend 参数的原始行为,因为它期望 anxhrsettings参数。

我怎样才能得到一个合适的 xhr 来提供给我的 beforeSend 函数?

编辑:

找到了一些与此相关的有趣链接/答案 以 编程方式将代码添加到 javascript 函数 在引用原始函数时覆盖 JavaScript 函数

4

2 回答 2

1

让您的 overlay_before 返回一个带有预期参数的函数,并将这些参数传播到 user_beforesend 调用,应该可以解决问题:

function overlay_before(user_beforesend){
        return function(xhr, settings)
           {
            if ( target_selector === undefined )
            {
                var $body = $('body');
                $overlay.height($body.height()).width($body.width()).css("position","absolute");
            }
            else{
                var $target= $(target_selector);
                $overlay.height($target.height()).width($target.width()).css("position","absolute");
                $target.css("position","relative").append($overlay);
            }

            if (typeof(class_active) == "string"){
                $overlay.addClass(class_active)
            }
            if (typeof(class_deactive) == "string") {
                $overlay.removeClass(class_deactive)
            }
            $overlay.css("display","block").animate(
                {
                    opacity: 0.8
                },
                500);
            if (typeof(user_beforesend) == "function"){
                user_beforesend(xhr,settings);
            }
        }
      }
于 2013-09-02T13:41:33.623 回答
0

你试过var xhr = new XmlHttpRequest();吗?还是您在寻找更多/不同的东西?

于 2013-09-02T13:42:10.053 回答