2014-10-06 5 views
1

У меня проблемы с отображением моей игры Haxe в IE9. На самом деле это вообще не отображается. Мы отследили проблему внутри скомпилированного JS-файла для Haxe и выяснили, что проблема находится в haxe.HTTP API.Haxe IE9 xmlHTTPrequest issue

Есть некоторые вещи, которые необходимо проверить и сделать для IE9 для работы с xmlhttprequests. Это не было сделано в API Haxe.

Это класс 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(typeof XDomainRequest != "undefined") return new XDomainRequest(); 

В принципе, я знаю, что этот вопрос, я просто понятия не имею, как я могу изменить эти вещи в ядре самого Haxe.

Спасибо.

ответ

0

Хорошая работа на этом! Вы должны связаться список рассылки Haxe непосредственно, большинство мыслящих головы там, а не здесь :)

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