• 模拟ajax的 script请求


    /**
         * 模拟ajax的 script请求
         * @param  {[type]} options [description]
         * @return {[type]}         [description]
         */
        function createAjax(options) {
    
            if (typeof url === "object") {
                options = url;
                url = undefined;
            }
    
            options = options || {};
    
            /**
             * 参数
             * jQuery.ajaxSetup 是默认参数
             * @type {[type]}
             */
            var s = jQuery.ajaxSetup({}, options);
    
            // Deferreds
            // 异步机制
            var deferred = jQuery.Deferred();
            var completeDeferred = jQuery.Callbacks("once memory");
    
            /**
             * 实际返回的ajax对象
             * @type {Object}
             */
            var jqXHR = {}
    
            // 把jqXHR对象转化promise对象,幷加入complete、success、error方法
            deferred.promise(jqXHR).complete = completeDeferred.add;
            //别名
            jqXHR.success = jqXHR.done;
            jqXHR.error = jqXHR.fail;
    
            // 增加回调队列
            // complete: function() {
            //     console.log('局部事件complete')
            // },
            // error: function() {
            //     console.log('局部事件error请求失败时调用此函数')
            // },
            // success: function() {
            //     console.log('局部事件success')
            // }
            for (i in {
                success: 1,
                error: 1,
                complete: 1
            }) {
                jqXHR[i](s[i]);
            }
    
            function send(_, complete) {
                var script = jQuery("<script>").prop({
                    async: true,
                    charset: s.scriptCharset,
                    src: s.url
                }).on(
                    "load error",
                    callback = function(evt) {
                        script.remove();
                        callback = null;
                        if (evt) {
                            complete(evt.type === "error" ? 404 : 200, evt.type);
                        }
                    }
                );
                document.head.appendChild(script[0]);
            }
    
    
            function done(status, nativeStatusText, responses, headers) {
                var isSuccess = status >= 200 && status < 300 || status === 304;
                var success = jqXHR.success;
                var error = jqXHR.error;
                if (isSuccess) {
                    deferred.resolveWith(document, [success, jqXHR]);
                } else {
                    deferred.rejectWith(document, [jqXHR, error]);
                }
            }
    
            //发送请求
            send({
                Accept: "text/javascript, application/javascript, application/ecmascri"
            }, done);
    
            return jqXHR;
        }
    
        function show(data){
            $('body').append('<li>'+ data +'</li>');
        }
    
            //执行一个异步的HTTP(Ajax)的请求。
            var ajax = createAjax({
                url: 'http://code.jquery.com/jquery-latest.js',
                dataType: 'script',
                //请求完成后回调函数 (请求success 和 error之后均调用)
                complete: function() {
                    show('局部事件complete')
                },
                error: function() {
                    show('局部事件error请求失败时调用此函数')
                },
                success: function() {
                    show('局部事件success')
                }
            })
    
            ajax.done(function() {
               show('deferred done')
            }).fail(function() {
                show('deferred fail')
            }).always(function() {
                show('deferred lways')
            })
  • 相关阅读:
    C++ Primer 笔记——标准库类型string
    Windows文件系统
    c++数组
    B+树
    简单搭建FastDFS分布式文件系统(简单易懂)
    什么是分布式系统(通俗易懂)
    对List中每个对象元素按时间顺序排序
    java23种设计模式之一: 策略模式
    微信app支付java后台流程、原理分析及nei网穿透
    quartz多任务调度+spring 实现
  • 原文地址:https://www.cnblogs.com/aaronjs/p/4167241.html
Copyright © 2020-2023  润新知