[JS] implementatie van FormData voor IE

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Juup
  • Registratie: Februari 2000
  • Niet online
FormData is een handig object waarmee je je form aan een XMLHttpRequest kan meesturen, net als bij een gewone form post.
(zie ook Using FormData Objects).

Die FormData wordt zo gebruikt:
JavaScript:
1
2
3
var xhr = new XMLHttpRequest();  
xhr.open("POST", "/submitform");  
xhr.send(new FormData(document.forms[0])); 


Die xhr.send kan dus omgaan met een FormData object.
Nu probeer ik dit ook voor IE < 8 te implementeren maar daar kan je de XMLHttpRequest.prototype.send method niet overriden.

Code zover:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
(function(){

if (!('FormData' in window))
{
    var FD = function(form)
    {
        var result = [];
        for (var i = 0; i < form.elements.length; i++)
        {
            var input = form.elements[i];
            if (input.name && !input.disabled)
            {
                var type = input.type;
                var tagName = input.tagName;
                if (tagName == "SELECT")
                {
                    for (var j = 0; j < input.options.length; j++)
                    {
                        var opt = input.options[j];
                        if (opt.selected)
                            result.push(input.name + "=" + opt.value);
                    }
                }
                else if (type == "checkbox" && input.checked)
                {
                    result.push(input.name + "=on");
                }
                else if (type != "radio" || input.checked)
                {
                    result.push(input.name + "=" + input.value);
                }
            }
        }
        this.result = result;
    };
    FD.prototype =
    {
        toString: function()
        {
            return this.result.join("&");
        },
        append: function(key, val)
        {
            this.result.push(key + "=" + val);
        }
    };
    window.FormData = FD;

    //Change XMLHttpRequest to accept the new FormData
    var originalXHR_send = XMLHttpRequest.prototype.send;
    XMLHttpRequest.prototype.send = function(data)
    {
        if (data instanceof FD)
        {
            originalXHR_send.call(this, data.toString());
        }
        else
        {
            originalXHR_send.apply(this, arguments);
        }
    };
}

})();


Heeft iemand een idee hoe dit enigszins netjes voor IE7 (IE6?) te doen?

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Je zal denk ik voor IE < 8 XMLHttpRequest compleet moeten herimplementeren in een native JS object; iets als http://www.ilinsky.com/articles/XMLHttpRequest/

Het probleem in IE < 8 is dat XMLHttpRequest geen native object is en dus inderdaad niet netjes mbv prototypes uit te breiden is. Voordeel van een wrapped native implementatie is wel dat je meteen bepaalde browser quirks kan fixen :)

Overigens is je form-serialisatie incompleet, en vergeet je netjes te encoden ;) (form-serialisatie is overigens nogal tricky)

[ Voor 17% gewijzigd door crisp op 09-09-2011 22:43 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Juup
  • Registratie: Februari 2000
  • Niet online
crisp schreef op vrijdag 09 september 2011 @ 22:40:
Je zal denk ik voor IE < 8 XMLHttpRequest compleet moeten herimplementeren in een native JS object; iets als http://www.ilinsky.com/articles/XMLHttpRequest/
Hee dat is een goed idee, dat gaan we doen.
Het probleem in IE < 8 is dat XMLHttpRequest geen native object is en dus inderdaad niet netjes mbv prototypes uit te breiden is. Voordeel van een wrapped native implementatie is wel dat je meteen bepaalde browser quirks kan fixen :)
Yup.
Overigens is je form-serialisatie incompleet, en vergeet je netjes te encoden ;) (form-serialisatie is overigens nogal tricky)
Haha ik realiseerde me toen ik het gepost had dat ik het idd niet escape ;) maar ik moest weg (echt waar!)
Niet de eerste keer :)
Ik zal 'n complete serialize-implementatie van iemand anders jatten includen dan zijn we daar ook vanaf.

Edit: die van jQuery lijkt dus de enige goede te zijn. Bedankt voor de link.

[ Voor 4% gewijzigd door Juup op 09-09-2011 23:00 ]

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.