ES6 для ошибки оператора, даже если она скомпилирована с babel - PullRequest
0 голосов
/ 01 мая 2018

У меня возникли проблемы с выяснением, что не так с этим утверждением.

for(const form of doc.getElementsByClassName('class-name')) { .... }

Рассматривая списки совместимости , я могу понять, почему у него возникают проблемы с запуском в ES6 на сафари, если он не поддерживает. Однако это происходит до тех пор, пока я не скомпилирую ES6 с babel.

При компиляции я получаю следующее:

var _iteratorNormalCompletion3 = true;
    var _didIteratorError3 = false;
    var _iteratorError3 = undefined;

    try {
        for (var _iterator3 = doc.getElementsByClassName('class-name')[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
            var form = _step3.value;
        }
    } catch (err) {
        _didIteratorError3 = true;
        _iteratorError3 = err;
    } finally {
        try {
            if (!_iteratorNormalCompletion3 && _iterator3.return) {
                _iterator3.return();
            }
        } finally {
            if (_didIteratorError3) {
                throw _iteratorError3;
            }
        }
    }

Но это вызывает ошибку в сафари

TypeError: doc.getElementsByClassName('class-name')[Symbol.iterator] is not a function. (In 'doc.getElementsByClassName('class-name')[Symbol.iterator]()', 'doc.getElementsByClassName('class-name')[Symbol.iterator]' is undefined)

При этом используется последняя версия Babel, скомпилированная с gulp посредством browserify и babelify всех последних версий. Если я установлю плагин transform-es2015-for-of и включу его, я получу следующий результат:

var _loop = function _loop() { };

    for (var _iterator2 = doc.getElementsByClassName('class-name'), _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {
        var _ref2;

        var _ret = _loop();

        if (_ret === 'break') break;
    }

Но это дает мне еще одну ошибку сафари:

TypeError: _iterator2[Symbol.iterator] is not a function. (In '_iterator2[Symbol.iterator]()', '_iterator2[Symbol.iterator]' is undefined)

1 Ответ

0 голосов
/ 01 мая 2018

Чтобы перебрать NodeList, NodeList должен иметь свойство Symbol.iterator, но babel не заполняет DOM, только JS.

Я бы порекомендовал вообще не использовать for of или использовать для заполнения HTML5 DOM polyfill в дополнение к babel.

https://github.com/babel/babel/issues/545

...