javascript - 如何编写一个 javascript 函数来执行 ajax 请求而不重复以避免代码异味而不使用 JQuery 库

标签 javascript ajax

我有一个 javascript 代码,它使用对象和属性来执行不同的 ajax 请求。我想找到一种方法来优化我的代码以避免重复和代码异味。我有一个包含列表的对象 trip,它应该从数据库中获取详细信息并附加到我用路径 ./trips/action/定义的 servlet。不需要 JQuery

 var trip = {
    list: function(){
        var ajax = new XMLHttpRequest();

        ajax.onreadystatechange = function(){

            if(ajax.readyState == 4){
                if(ajax.status == 200){
                    document.getElementById('ajax-content').innerHTML = ajax.responseText;
                }
            }
        }

        ajax.open("GET", "./trips/action", true);
        ajax.send();
    },
    add: function(){
        var ajax = new XMLHttpRequest();

        ajax.onreadystatechange = function(){

            if(ajax.readyState == 4){
                if(ajax.status == 200){
                    document.getElementById('ajax-content').innerHTML = ajax.responseText;
                }
            }
        }

        ajax.open("GET", "./trip/addTrip.jsp", true);
        ajax.send();
    },

    save: function(){
        var me = this;
        var ajax = new XMLHttpRequest();

        var depatureDate = document.getElementById('depatureDate').value;
        var arrivalDate = document.getElementById('arrivalDate').value;
        var route = document.getElementById('route').value;
        var vehicle = document.getElementById('vehicle').value;
        var price = document.getElementById('price').value;

        var params = 'depatureDate=' + encodeURIComponent(depatureDate) 
            + '&arrivalDate=' + encodeURIComponent(arrivalDate)
            + '&route=' + encodeURIComponent(route)
            + '&vehicle=' + encodeURIComponent(vehicle)
            + '&price=' + encodeURIComponent(price);

        console.log(params);

        ajax.onreadystatechange = function(){

            if(ajax.readyState == 4){
                if(ajax.status == 200){
                    me.list();
                }
            }
        }

        ajax.open("POST", "./trips/action/add", true);
        ajax.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        ajax.send(params);
    }

  }

最佳答案

您可以创建效用函数:

var utils = {
    ajax: function(url, method, params, callback) {
        if (typeof callback == 'undefined') {
            callback = arguments[1];
            params = null;
        }
        var ajax = new XMLHttpRequest();

        ajax.onreadystatechange = function() {

            if (ajax.readyState == 4){
                if (ajax.status == 200){
                    if (typeof callback == 'function') {
                        callback(ajax.responseText);
                    }
                }
            }
        }

        ajax.open(method, url, true);
        if (params) {
            ajax.send(params);
        } else {
            ajax.send();
        }
   },
   get: function(url, params, callback) {
       this.ajax(url, 'GET', params, callback);
   },
   post: function(url, params, callback) {
       this.ajax(url, 'POST', params, callback);
   }
};

您可以在您的代码中使用它:

var trip = {
    list: function(){
        util.get("./trips/action", function(data) {
            document.getElementById('ajax-content').innerHTML = data;
        });
    },
    ...
};

关于javascript - 如何编写一个 javascript 函数来执行 ajax 请求而不重复以避免代码异味而不使用 JQuery 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38011451/

相关文章:

javascript - 如何编写并保持简洁、易于理解的 Javascript 和 jQuery

javascript - 从 from input 获取用户输入(数字)

javascript - 如何以连续顺序执行多个链接的$ .post()调用?

javascript - jquery 不会触发使用 ajax 添加的链接

javascript - 如何使用对象正确设置插件的选项

javascript - 在 for-of 循​​环中访问 ES6 数组元素索引

javascript - 动态垂直对齐文本

javascript - 浏览器偶尔中止 Ajax 请求而不返回任何错误

ajax - 使用 Wicket.ajax.post 发布大量数据

javascript - document.GetElementById ("main").innerHTML = "testing"正在恢复,而不是永久更改