错误:对象不支持属性或方法“包含” IE代码

时间:2019-01-05 22:04:11

标签: javascript babeljs

尝试更改为IndexOf,但这仍然无法正常工作。我已经将我的代码从ES6转换为ES5,但是它没有出现,因为它应该将chrome输出与IE进行比较。我还想念什么?添加了一个具有javascript代码的代码段,向您展示我正在尝试执行的操作。以下内容无法在IE上运行,但可以在chrome和firefox上运行。 我正在尝试以chrome和IE的二进制格式打印出R T。这些都是通过javascript完成的。请参阅下面的图像以识别问题。看起来在ES6-> ES5之间的转换期间它丢失了一些东西,但是在chrome上仍然可以正常工作。

const mapping = {
    R: '1111111111111111111111000000111100000011110000001111111111101111111000110000110011000001101100000011',
    T: '1111111111111111111100001100000000110000000011000000001100000000110000000011000000001100000000110000'

};


// Grab the binary mapping of the letter and
// return some HTML
function binaryise(letter) {
    var arr = mapping[letter].split('');
    return arr.map(function (char) {
        return '<div class="' + (char === '0' ? 'zero' : 'one') + '">' + char + '</div>';
    }).join('');
}

// For each letter in the word create a 
// binary version and return it in a list-item container
function processWord(arr) {
    var items = arr.map(function (letter, i) {
        var binaryised = binaryise(letter);
        return '\n      <li class="binaryli" data-id=' + i + '>\n        <div class="containerbinary">' + binaryised + '</div>\n      </li>\n    ';
    }).join('');
    return '<ul class="binaryul">' + items + '</ul>';
}


// Get a random number that hasn't previously appeared

function getRandom(arr, memo) {
    const index = Math.floor(Math.random() * arr.length);
    return memo.indexOf(index) > 1 ? getRandom(arr, memo) : index;
}

// Once the html has been added to the page
// (all set with opacity to 0)
// iterate over the letters turning the
// opacity of each to 1
function showLetters(arr, memo) {
    memo = memo || [];
    if (memo.length !== arr.length) {
        var index = getRandom(arr, memo);
        var letter = arr[index];
        var el = document.querySelector('[data-id="' + index + '"]');
        setTimeout(function () {
            el.classList.add('show');
            memo.push(index);
            showLetters(arr, memo);
        }, 1000);
    }
}

var wordArr = 'RT'.toUpperCase().split('');

// Process all the letters of the word and add them
// to the page...
const html = processWord(wordArr);
output.insertAdjacentHTML('beforeend', html);

// ...then fade them in
showLetters(wordArr);

以下内容不再出现语法错误,但图像显示IE输出与Chrome不同。 CHrome输出以二进制1,0正确显示“ RT”。 IE输出仅在行中写入,并且不能正确显示。 IE代码中可能缺少什么?我相信这可能是这行中的某些内容,但不能确定...返回memo.indexOf(index)> 1吗? getRandom(arr,memo):索引;

显示您在IE与Chrome中发生了什么的图像:

What happens in IE seen in image below:

What happens in Chrome seen in image below

1 个答案:

答案 0 :(得分:1)

IE不支持Array.prototype.includes

以与IE11兼容的方式编写代码:

function getRandom(arr, memo) {
    const index = Math.floor(Math.random() * arr.length);
    return memo.indexOf(index) > -1 ? getRandom(arr, memo) : index;
}

代码的第二个问题是逻辑。您的函数不会更改memoarr,因此,如果memo包含arr将导致无限递归循环。

如果您想让Babel为您转换代码,则需要使用@babel/preset-env包并在项目根目录中定义一个.babelrc文件:

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "targets": "last 2 versions"
      }
    ]
  ]
}

这仍然不能解决丢失的Array.prototype.includes。为此,以及其他缺少的原型功能,请将@babel/polyfill添加到package.json中,并将其导入Javascript入口点的最顶部。