Haxe IE9 xmlHTTPrequest问题

时间:2014-10-06 14:46:18

标签: html5 xmlhttprequest internet-explorer-9 haxe

我在IE9中显示我的Haxe游戏时遇到问题。它实际上根本没有显示。我们在已编译的Haxe JS文件中找到了问题,发现问题出在haxe.HTTP API中。

有些事情需要检查并完成IE9才能使用xmlhttprequests。这些都没有在Haxe API中完成。

这是没有我修复的http类:

                this.url = url;
                this.headers = new List();
                this.params = new List();
                this.async = true;
            };
            $hxClasses["haxe.Http"] = haxe.Http;
            haxe.Http.__name__ = ["haxe","Http"];
            haxe.Http.prototype = {
                setParameter: function(param,value) {
                    this.params = Lambda.filter(this.params,function(p) {
                        return p.param != param;
                    });
                    this.params.push({ param : param, value : value});
                    return this;
                }
                ,request: function(post) {
                    var me = this;
                    me.responseData = null;
                    var r = this.req = js.Browser.createXMLHttpRequest();
                    var onreadystatechange = function(_) {
                        if(r.readyState != 4) return;
                        var s;
                        try {
                            s = r.status;
                        } catch( e ) {
                            s = null;
                        }
                        if(s == undefined) s = null;
                        if(s != null) me.onStatus(s);
                        if(s != null && s >= 200 && s < 400) {
                            me.req = null;
                            me.onData(me.responseData = r.responseText);
                        } else if(s == null) {
                            me.req = null;
                            me.onError("Failed to connect or resolve host");
                        } else switch(s) {
                        case 12029:
                            me.req = null;
                            me.onError("Failed to connect to host");
                            break;
                        case 12007:
                            me.req = null;
                            me.onError("Unknown host");
                            break;
                        default:
                            me.req = null;
                            me.responseData = r.responseText;
                            me.onError("Http Error #" + r.status);
                        }
                    };
                    if(this.async) r.onreadystatechange = onreadystatechange;
                    var uri = this.postData;
                    if(uri != null) post = true; else {
                        var $it0 = this.params.iterator();
                        while( $it0.hasNext() ) {
                            var p = $it0.next();
                            if(uri == null) uri = ""; else uri += "&";
                            uri += encodeURIComponent(p.param) + "=" + encodeURIComponent(p.value);
                        }
                    }
                    try {
                        if(post) r.open("POST",this.url,this.async); else if(uri != null) {
                            var question = this.url.split("?").length <= 1;
                            r.open("GET",this.url + (question?"?":"&") + uri,this.async);
                            uri = null;
                        } else r.open("GET",this.url,this.async);
                    } catch( e1 ) {
                        me.req = null;
                        this.onError(e1.toString());
                        return;
                    }
                    if(!Lambda.exists(this.headers,function(h) {
                        return h.header == "Content-Type";
                    }) && post && this.postData == null) r.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
                    var $it1 = this.headers.iterator();
                    while( $it1.hasNext() ) {
                        var h1 = $it1.next();
                        r.setRequestHeader(h1.header,h1.value);
                    }
                    r.send(uri);
                    if(!this.async) onreadystatechange(null);
                }
                ,onData: function(data) {
                }
                ,onError: function(msg) {
                }
                ,onStatus: function(status) {
                }
                ,__class__: haxe.Http
            };

这是修复代码:

            haxe.Http = function(url) {
                this.url = url;
                this.headers = new List();
                this.params = new List();
                this.async = true;
            };
            $hxClasses["haxe.Http"] = haxe.Http;
            haxe.Http.__name__ = ["haxe","Http"];
            haxe.Http.prototype = {
                setParameter: function(param,value) {
                    this.params = Lambda.filter(this.params,function(p) {
                        return p.param != param;
                    });
                    this.params.push({ param : param, value : value});
                    return this;
                }
                ,request: function(post) {
                    var me = this;
                    me.responseData = null;
                    var r = this.req = js.Browser.createXMLHttpRequest();
                    var onreadystatechange = function(_) {
                    console.log('in onreadystatechange function');
                        //if(r.readyState != 4) return;
                        console.log(r.responseText);
                        console.log('r.status: ' + r.status);
                        me.req = null;
                        me.onData(me.responseData = r.responseText);
                    };
                    if(typeof XDomainRequest != "undefined") {
                        console.log('XDomainRequest');
                        r.onload = onreadystatechange;
                    }
                    var uri = this.postData;

                    try {
                        console.log('calling r.open with url: ' + this.url);
                        r.open("GET",this.url);
                    } catch( e1 ) {
                        me.req = null;
                        this.onError(e1.toString());
                        return;
                    }

                            //r.send(uri);
                    //do it, wrapped in timeout to fix ie9
                     setTimeout(function () {
                           r.send();
                        }, 0);
                    //if(!this.async) onreadystatechange(null);

                }
                ,onData: function(data) {
                }
                ,onError: function(msg) {
                }
                ,onStatus: function(status) {
                }
                ,__class__: haxe.Http
            };

请注意,这只会在不执行if语句的情况下实现IE9修复,以保持对其他浏览器的支持。但它真的很容易。 IF语句只是

if(typeof XDomainRequest != "undefined") return new XDomainRequest();

基本上,我知道问题是什么,我根本不知道如何在Haxe本身的核心内改变这些东西。

感谢。

2 个答案:

答案 0 :(得分:1)

https://github.com/HaxeFoundation/haxe/pull/3449

BAM!让它在我的haxe的本地版本中工作。已修复所有浏览器并发送拉取请求。 :d

答案 1 :(得分:0)

这个好工作! 你必须直接联系Haxe邮件列表,大多数思想头都在那里,而不是在这里:)

https://groups.google.com/d/forum/haxelang