javascript - 带有 promise 的 jQuery ajax 请求在 IE9 中不起作用

标签 javascript jquery ajax promise internet-explorer-9

这是我制作的一个类,它使用 YQL 进行谷歌翻译。

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)似乎是问题所在。据我推断,它驻留在 promise 解析器 (Translate.spitResult) 中 - 它被调用,但似乎没有数据传递给它。我在控制台中查看了它。 promise 数组元素填充了 3 个对象(我确信这是正常的),但它是:

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

我尝试删除变音符号功能(现在我不确定为什么,因为无论如何都应该有响应),我还尝试了 ajax 调用的 cache: false 模式,但是没有用。

有谁知道可能是什么问题吗?

提前谢谢你。

最佳答案

是的,Internet Explorer 是您的问题... 检查http://caniuse.com/#search=promise

如果这是问题所在,我认为你可以使用 polyfill ( https://github.com/taylorhakes/promise-polyfill ),从未尝试过 polyfill 的 promise ,但它肯定会像魅力一样工作

关于javascript - 带有 promise 的 jQuery ajax 请求在 IE9 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19977131/

相关文章:

javascript - 如何使用 ajax 将多个值发送到 PHP

PHP/Javascript - 从我的大学网站解析 html

javascript - 如果您通过 ID 在 jQuery 中选择一个元素,是否仍然可以通过为其提供上下文来提高速度?

php - 如何在Gridview Yii2中的条形码生成器中传递 "elementId"?

ajax - 如何在 p :accordionPanel from outside? 的单个选项卡中使用 AJAX 更新组件

javascript - 实时更新有问题

Javascript - 缩短太长的标题

javascript - 如何使用具有相同 id 的 div 显示不同的 div 值?

javascript - 循环结束前执行的循环内的 AJAX 调用

javascript - Json 编码 php mysql 查询