模拟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')
        })
复制代码

本文转自艾伦 Aaron博客园博客,原文链接:http://www.cnblogs.com/aaronjs/p/4167241.html,如需转载请自行联系原作者
相关文章
|
5月前
|
JSON 前端开发 JavaScript
axios请求成功而$.ajax却不行排错
axios请求成功而$.ajax却不行排错
47 2
|
5月前
|
前端开发
解决前端ajax跨域请求不携带cookie信息JSESSIONID的问题
解决前端ajax跨域请求不携带cookie信息JSESSIONID的问题
|
1月前
|
前端开发
React技术栈-react使用的Ajax请求库实战案例
这篇文章介绍了在React应用中使用Axios和Fetch库进行Ajax请求的实战案例,展示了如何通过这些库发送GET和POST请求,并处理响应和错误。
34 10
React技术栈-react使用的Ajax请求库实战案例
|
7天前
|
JSON JavaScript 前端开发
Jquery常用操作汇总,dom操作,ajax请求
本文汇总了jQuery的一些常用操作,包括DOM元素的选择、添加、移除,表单操作,以及如何使用jQuery发送Ajax请求,涵盖了GET、POST请求和文件上传等常见场景。
|
1月前
|
前端开发
React技术栈-react使用的Ajax请求库用户搜索案例
这篇文章展示了一个React技术栈中使用Ajax请求库(如axios)进行用户搜索的实战案例,包括React组件的结构、状态管理以及如何通过Ajax请求获取并展示GitHub用户数据。
24 7
React技术栈-react使用的Ajax请求库用户搜索案例
|
13天前
|
JSON 资源调度 JavaScript
Vue框架中Ajax请求的实现方式:使用axios库或fetch API
选择 `axios`还是 `fetch`取决于项目需求和个人偏好。`axios`提供了更丰富的API和更灵活的错误处理方式,适用于需要复杂请求配置的场景。而 `fetch`作为现代浏览器的原生API,使用起来更为简洁,但在旧浏览器兼容性和某些高级特性上可能略显不足。无论选择哪种方式,它们都能有效地在Vue应用中实现Ajax请求的功能。
18 4
|
3月前
|
XML 前端开发 JavaScript
JavaScript进阶 - AJAX请求与Fetch API
【7月更文挑战第3天】前端开发中的异步基石:AJAX与Fetch。AJAX,使用XMLHttpRequest,处理跨域、回调地狱和错误处理。Fetch,基于Promise,简化请求,但需注意默认无跨域头和HTTP错误处理。两者各有优劣,理解其问题与解决策略,能提升前端应用的性能和用户体验。
104 24
|
4月前
|
前端开发 Python
Django框架中Ajax GET与POST请求的实战应用
Django框架中Ajax GET与POST请求的实战应用
|
3月前
|
XML 前端开发 JavaScript
JavaScript进阶 - AJAX请求与Fetch API
【7月更文挑战第9天】JavaScript进阶:AJAX与Fetch API对比。AJAX用于异步数据交换,XMLHttpRequest API复杂,依赖回调。Fetch API是现代、基于Promise的解决方案,简化请求处理。示例:`fetch(&#39;url&#39;).then(r =&gt; r.json()).then(data =&gt; console.log(data)).catch(err =&gt; console.error(err))`。注意点包括检查HTTP状态、错误处理、CORS、Cookie和超时。Fetch提高了异步代码的可读性,但需留意潜在问题。
78 0
|
5月前
|
JSON 前端开发 JavaScript
Fetch API与Ajax请求
Fetch API是JavaScript的一种新方法,用于网络请求,提供简洁的Promise-based语法和更多功能,如处理头、取消请求及跨域支持,比Ajax更强大。尽管不完全替代Ajax,尤其在老浏览器或需要底层控制时,Fetch API仍是现代浏览器中获取资源的优选工具。例如,以下代码展示了如何使用Fetch API进行GET和POST请求。