Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: для новичков > Проконсультируёте по оптимизации и недочётам


Автор: thefree 26.5.2008, 10:24
Собственно есть вот код
Код

var ajax = {

    options: {
        method: 'post',
        async: true,
        onStateChange: function() { },
        onFailure: function() { },
        onSuccess: function() { }
    },

    setOptions: function(content) {
        for (var i in content) {
            this.options[i] = content[i];
        }
    },
    
    form2query: function(isform) {
        var query = [];
        for (var i=0; i<isform.elements.length; i++) {
            switch (isform.elements[i].type.toLowerCase()) {
                case "textarea": query[query.length] = isform.elements[i].name + "=" + encodeURI(isform.elements[i].value); break;
                case "radio": if(isform.elements[i].checked) query[query.length] = isform.elements[i].name + "=" + isform.elements[i].value; break;
                case "checkbox": if(isform.elements[i].checked) query[query.length] = isform.elements[i].name + "=" + isform.elements[i].value; break;
                default: query[query.length] = isform.elements[i].name + "=" + isform.elements[i].value;
            }
        }
        return query.join('&');
    },
    
    transport: (window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest()),

    send: function(url, data) {
        this.transport.open(this.options.method, url, this.options.async);
        var self = this;
        this.transport.onreadystatechange = function() {
            if (self.transport.readyState == 4) {
                if (self.transport.status >= 200 && self.transport.status < 300) {
                    self.options.onSuccess(self.transport.responseText);
                } else {
                    self.options.onFailure(self.transport.status);
                }
            } else {
                self.options.onStateChange(self.transport.readyState);
            }
        }
        if(this.options.method == 'post') this.transport.setRequestHeader('Content-type','application/x-www-form-urlencoded');
        this.transport.send((data ? data : null));
    }

}

Подскажите что подправить и что возможно стоит добавить.

Автор: Padonak 30.5.2008, 00:10
Цитата(thefree @ 26.5.2008,  10:24)
Собственно есть вот код
...
Подскажите что подправить и что возможно стоит добавить.

А вот прикинь пришел бы Гоголь к каким-нибудь кентам своим шмякнул им на стол рукопись "Мертвых душ" и сказал: 
- Ну чо перцы-дэкуэльяры вот почитайте и скажите мне где подправить или может чота переписать надо на ваш взгляд...

Автор: Pokoinik 30.5.2008, 16:06
thefree, я бы подправил вот эту часть... добавил обработку двумерных массивов.. а так смотрите сами, вам же этим кодом пользоваться...
Код

    setOptions: function(content) {
        for (var i in content) {
            this.options[i] = content[i];
        }
    }

Автор: thefree 5.6.2008, 00:22
да он стал уже таким. После оптимизации и попытки кроссплатформенности.
Код

var ajax = {

    options: {
        method: 'post',
        async: true,
        onStateChange: function() { },
        onFailure: function() { },
        onSuccess: function() { }
    },

    setOptions: function(content) {
        for (var i in content) {
            this.options[i] = content[i];
        }
    },
    
    transport: (window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest()),

    send: function(url, data) {
        if (this.running) return this;
        this.running = true;
        this.transport.open(this.options.method, url, this.options.async);
        var self = this;
        this.transport.onreadystatechange = function() {
            if (self.transport.readyState == 4 && self.running) {
                self.running = false;
                if (self.transport.status >= 200 && self.transport.status < 300) {
                    self.options.onSuccess(self.transport.responseText);
                } else {
                    self.options.onFailure(self.transport.status);
                }
            } else {
                self.options.onStateChange(self.transport.readyState);
            }
        }
        if (this.options.method == 'post') this.transport.setRequestHeader('Content-type','application/x-www-form-urlencoded');
        this.transport.send((data ? data : null));
    },
    
    collect: function(a, f) {
        var n = [];
        for(var i = 0; i < a.length; i++) {
            var v = f(a[i]);
            if (v != null) n.push(v);
        }
        return n;
    },
    
    serialize: function(f) {
        var r = [];
        var g = function(n) {
            return f.getElementsByTagName(n)
        };
        var nv = function(e){
            if (e.name) r[r.length] = encodeURIComponent(e.name) + '=' + encodeURIComponent(e.value);
        };
        this.collect(g('input'), function(i) {
            if ((i.type != 'radio' && i.type != 'checkbox') || i.checked) return nv(i);
        });
        this.collect(g('select'), nv);
        this.collect(g('textarea'), nv);
        return r.join('&');
    }

}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)