2013-11-14 9 views
7

Hier ist eine Klasse, die ich gemacht, die YQL verwendet, um Google Translate zu tun.jQuery ajax Anfrage mit Versprechen funktioniert nicht in IE9

var Translator = { 
    source: 'ro', // default 
    target: 'en', // default 
    url: 'http://query.yahooapis.com/v1/public/yql?q=select * from google.translate where q="', 
    urlRemaining: '";&format=json&diagnostics=true&env=store://datatables.org/alltableswithkeys&callback=', 
    diacritics: Array(), 
    newCharacters: Array(), 

    replaceAll: function(string, replace, replaceWith) { 
     return string.replace(new RegExp(replace, 'g'), replaceWith); 
    }, 

    replaceDiacritics: function(text) { 
     string = text; 

     // diacritics and newCharacters should be arrays of the same length 
     // diacritics should only be specified in lowercase - uppercased version will be assumed 
     // durring the process 
     for (i = 0; i < this.diacritics.length; i++) { 
      string = this.replaceAll(string, this.diacritics[i], this.newCharacters[i]); 
      string = this.replaceAll(string, this.diacritics[i].toUpperCase(), this.newCharacters[i].toUpperCase()); 
     } 

     return string; 
    }, 

    translate: function(text, target, source) { 
     target = target || this.target; 
     source = source || this.source; 

     return $.ajax({ 
      url: this.url + encodeURIComponent(this.replaceDiacritics(text)) + '" and source="' + source + '" and target="' + target + this.urlRemaining, 
      dataType: 'json', 
      cache: false 
     }); 
    }, 

    spitResult: function(x, container) { 
     x.success(function(realData) { 
      $report = realData.query.results.json.sentences; 
      $result = ''; 
      if ($.isArray($report)) { 
       for (i = 0; i < $report.length; i++) { 
        $result += $report[i].trans; 
       } 
      } else { 
       $result = $report.trans; 
      } 

      if (container instanceof jQuery) { 
       container.html($result); 
      } else { 
       container.innerHTML = $result; 
      } 
     }); 
    } 
} 

Und jetzt bin ich es auf eine Reihe von Elementen in der Seite

promises = Array(); 

Translator.diacritics = Array('ă', 'â', 'î', 'ș', 'ț'); 
Translator.newCharacters = Array('a', 'a', 'i', 's', 't'); 

$('.translate').each(function() { 
    $this = $(this); 
    promises[promises.length] = Translator.translate($this.html(), 'en', 'ro'); 
    Translator.spitResult(promises[promises.length-1], $this); 
}); 

Dies funktioniert kein Problem mit Firefox und Chrome aufrufen. Wie auch immer, Internet Explorer (9 in meinem Fall) scheint das Problem zu sein. Von dem, was ich abgeleitet haben konnte, befindet es sich in der Promise Resolver (Translate.spitResult) - die aufgerufen wird, aber keine Daten scheinen an sie weitergegeben werden. Ich schaute es in der Konsole an. Das Versprechen Array-Element wird mit 3 Objekten gefüllt (was ich bin sicher, normal ist), aber es ist:

readyState: 0 
responseJSON: undefined, status: 0 
statusText: "No Transfer". 

Ich versuchte, die diakritische Funktion zu entfernen (jetzt bin ich nicht ganz sicher, warum, denn es hätte sein sollen, eine Antwort sowieso), versuchte ich auch cache: false Modus auf dem Ajax Anruf, aber ohne Erfolg.

Weiß jemand, was könnte los sein?

Vielen Dank im Voraus.

+5

+1 für _as üblich, Internet Explorer (9 in meinem Fall) scheint das Problem zu sein_ – Barun

+1

fügen Sie bitte einen Link zu den Arbeitscode, damit wir einen Blick haben, ohne alles selbst einrichten müssen, danke –

+0

@EmmanuelBucur so nein Daten werden an den spitResult() - oder den success() -Handler übergeben? –

Antwort

0

ja Internet Explorer ist Ihr Problem ... prüfen http://caniuse.com/#search=promise

Ich glaube, Sie einen polyfill verwenden können (https://github.com/taylorhakes/promise-polyfill) wenn das das Problem ist, nie ein polyfill für Versprechungen versucht, aber es wird sicher wie ein Zauber funktionieren

+0

Bitte nehmen Sie sich eine Minute Zeit, um zu erklären, auf welche Links Sie verlinkt haben. Eine Antwort sollte in der Lage sein zu leben, ohne auf externe Quellen angewiesen zu sein. –

+1

vielleicht ein Missread die Frage, für einen Moment habe ich verstanden, dass das Problem war, dass IE9 Versprechen nicht unterstützt, so verband ich die Versprechen Unterstützung und die Polyfill, um die Verwendung von Versprechen auf Browsern zu ermöglichen, die es nicht unterstützt. Aber ich kann mich irren, weil ich nicht sehe, dass er jetzt Versprechungen macht. –