Array.from () с HTMLcollection не работает в браузере Chrome - PullRequest
0 голосов
/ 08 января 2019

У меня есть фрагмент кода JavaScript, который работает во всех браузерах (даже IE), но не работает с Chrome на моем HUAWEI P8 Lite с Android 6.

Chrome - версия 71.0.3578.99.

Неисправный код var class_arr = Array.from(class);, где class - это HTMLcollection.

Похоже, что Array.from () не работает, хотя он должен поддерживаться Chrome на мобильных устройствах .

Кроме того, я заметил, что этот же код работал одно обновление назад, а не два обновления назад, как ни странно.

Вы можете проверить проблему с помощью этого URL (конечно, это будет недействительно, если я найду решение своей проблемы). Вам нужно открыть боковую панель слева и попытаться увеличить карту с помощью кнопки «Плюс» или «Минус».

enter image description here

enter image description here

EDIT

Вот код, в котором я использую Array.from ():

export function updateSlider(all_sliders, ol_layers, class_layers) {
    // updates slider with the actual opacity of the layers
    for (var i = 0, len_i = all_sliders.length; i < len_i; ++i) {
        var curr_slider = all_sliders[i];
        // get layer from ol_layers whose title is equal to current slider id
        // Find the value of the first element/object in the array, otherwise undefined is returned
        // (https://stackoverflow.com/a/13964186/1979665)
        var lyr = ol_layers.find(obj => {
            return obj.values_["title"] === curr_slider.getAttribute("id")
        });
        // get class_layer (layerswitcher) from class_layers whose title is equal to current slider id
        // (first we need to convert class_layers from HTMLCollection to array otherwise .find will fail)
        var class_layers_arr = Array.from(class_layers);
        var class_elem = class_layers_arr.find(obj => {
            return obj.innerText.replace('\t','') === curr_slider.getAttribute("id")
        });
        // get current layer opacity and set it as the value of current slider
        var curr_opacity = lyr.values_["opacity"];
        curr_slider.setAttribute("value", curr_opacity);
        // create new li element
        var li_elem = document.createElement("LI");
        // add slider input to li elem
        li_elem.appendChild(curr_slider);
        // add li with layer legend after layer li
        insertAfter(li_elem, class_elem);
        changeOpacity(curr_slider, ol_layers);
    }
}

class_layers сначала определяется в другом скрипте как var class_layers = document.getElementsByClassName("layer");

РЕДАКТИРОВАТЬ 2

Хорошо, так что, видимо, проблема связана с Chrome в целом, а не только на мобильном телефоне. Фактически, если вы попробуете вышеуказанный URL-адрес в Chrome Desktop, вы можете воспроизвести ошибку, открыв боковую панель (слева), затем закрыв ее и нажав символ + или -, чтобы увеличить карту. Я думаю, это связано с тем, как события click обрабатываются либо моим кодом, либо OpenLayers. Я, вероятно, удаляю этот вопрос, так как мне кажется, что мне нужно копать дальше в проблемных.

РЕШЕНИЕ

Не удаляет, потому что я думаю, что другим было бы полезно увидеть решение.

Вот ссылка на созданную и закрытую проблему OpenLayers Github: https://github.com/openlayers/openlayers/issues/9105.

Проблема заключалась в событии «изменение: разрешение», которое вызывается классом представления OL (v5.3.0), который генерируется несколько раз во время анимации (проблема также указана здесь ).

НОВОЕ РАССМОТРЕНИЕ

Оказывается, у меня все еще была проблема на мобильных устройствах. Реальным решением было не использовать innerText в моем коде и переключиться на innerHTML, так как он всегда был пустым (и только в) Chrome, в то время как с другими браузерами это было не так (я мог видеть строку). Если вам интересно, я могу привести пример, но, к сожалению, я не смог найти много по этой проблеме в Интернете ...

1 Ответ

0 голосов
/ 08 января 2019

Это не Array.from() проблема.

Проверьте вашу class_elem переменную Он не определен (потому что не найден элемент для ваших условий), а затем завершается неудачно, когда вы пытаетесь получить parentNode из undefined in:

export function insertAfter(newNode, referenceNode) {
    referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...