2013-11-14 16 views
7

Đây là lớp tôi đã sử dụng YQL để thực hiện Google Dịch.Yêu cầu jQuery ajax với lời hứa không hoạt động trong 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; 
      } 
     }); 
    } 
} 

Và bây giờ tôi gọi đó là trên một tập hợp của các yếu tố trong trang

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

này đang làm việc không có vấn đề với Firefox và Chrome. Tuy nhiên, như thường lệ, Internet Explorer (9 trong trường hợp của tôi) có vẻ là vấn đề. Từ những gì tôi đã có thể suy ra nó nằm trong trình phân giải lời hứa (Translate.spitResult) - được gọi, nhưng không có dữ liệu nào dường như được truyền cho nó. Tôi nhìn nó trong bảng điều khiển. Phần tử mảng lời hứa được điền bằng 3 đối tượng (mà tôi chắc chắn là bình thường), nhưng nó là:

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

Tôi đã cố gắng loại bỏ hàm dấu phụ (bây giờ tôi không chắc chắn lý do tại sao, vì có lẽ đã có một phản ứng anyway), tôi cũng đã thử chế độ cache: false trong cuộc gọi ajax, nhưng không có kết quả.

Có ai biết điều gì có thể là vấn đề không?

Cảm ơn bạn trước.

+5

+1 cho bình thường, Internet Explorer (9 trong trường hợp của tôi) có vẻ là vấn đề_ – Barun

+1

vui lòng thêm liên kết vào mã làm việc để chúng tôi có thể xem mà không cần phải tự thiết lập mọi thứ, cảm ơn –

+0

@EmmanuelBucur. dữ liệu được truyền cho trình xử lý spitResult() hoặc thành công()? –

Trả lời

0

có Internet Explorer là vấn đề của bạn ... Kiểm tra http://caniuse.com/#search=promise

Tôi nghĩ rằng bạn có thể sử dụng một polyfill (https://github.com/taylorhakes/promise-polyfill) nếu đó là vấn đề, chưa bao giờ thử một polyfill cho lời hứa nhưng nó sẽ làm việc như một nét duyên dáng chắc chắn

+0

Vui lòng dành một phút để giải thích những liên kết bạn đã đăng đang tham chiếu. Một câu trả lời sẽ có thể sống mà không dựa vào các nguồn bên ngoài. –

+1

có thể là một câu hỏi bị bỏ lỡ, trong một khoảnh khắc tôi hiểu rằng IE9 không hỗ trợ lời hứa vì vậy tôi đã liên kết hỗ trợ hứa hẹn và polyfill để cho phép sử dụng lời hứa trên các trình duyệt không hỗ trợ nó. Nhưng tôi có thể sai vì tôi không thấy anh ta bằng lời hứa bây giờ. –

Các vấn đề liên quan