【问题标题】:Haxe IE9 xmlHTTPrequest issueHaxe IE9 xmlHTTPrequest 问题
【发布时间】:2014-10-06 14:46:18
【问题描述】:

我在 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
            };

请注意,这仅实现了 IE9 修复,而不执行 if 语句以保持对其他浏览器的支持。但这真的很容易。 IF 语句很简单

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

基本上,我知道问题出在哪里,我只是不知道如何在 Haxe 本身的核心内改变这些东西。

谢谢。

【问题讨论】:

    标签: html xmlhttprequest internet-explorer-9 haxe


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      这个做得好! 您必须直接联系 Haxe 邮件列表,大多数思考者都在那边而不是这里 :)

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-05
        • 1970-01-01
        • 2014-12-30
        • 2011-11-17
        • 2011-09-29
        • 1970-01-01
        相关资源
        最近更新 更多