2013-11-14 89 views
7

這是我使用YQL進行Google翻譯的一個類。jQuery ajax請求,承諾不能在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; 
      } 
     }); 
    } 
} 

現在我稱它在一組元素在頁面

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); 
}); 

這正與Firefox和Chrome沒有問題。然而,像往常一樣,Internet Explorer(我的情況是9)似乎是問題所在。從我已經能夠推斷出它駐留在諾言解析器(Translate.spitResult) - 這被稱爲,但沒有數據似乎被傳遞給它。我在控制檯中看着它。該承諾數組元素填充了3個對象(我敢肯定是正常的),但它是:

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

我試圖消除變音符號的功能(現在我不知道是什麼原因,因爲那裏本來應該反正無論如何),我也嘗試在ajax調用cache: false模式,但無濟於事。

有誰知道會發生什麼事?

預先感謝您。

+5

+1爲通常情況下,Internet Explorer(我的情況下9)似乎是問題_ – Barun

+1

請添加一個鏈接到工作代碼,所以我們可以看看,而不必自己設置一切,謝謝 –

+0

@EmmanuelBucur所以沒有數據被傳遞給spitResult()或success()處理程序? –

回答

0

是Internet Explorer的是你的問題...... 檢查http://caniuse.com/#search=promise

我想你可以使用填充工具(https://github.com/taylorhakes/promise-polyfill)如果是這樣的問題,從來沒有嘗試過的承諾,一個填充工具,但它會像肯定魅力

+0

請花一分鐘來解釋您發佈的鏈接是參考的。答案應該能夠不依靠外部來源而生活。 –

+1

也許是一個錯誤的問題,一會兒我明白問題在於IE9不支持承諾,所以我鏈接了承諾支持和polyfill,以便在不支持它的瀏覽器上使用承諾。但我可能是錯的,因爲我現在沒有看到他使用承諾。 –