Как решить ошибку Uncaught RangeError: Invalid array length при ресайзе?

Ссылка скопирована
1 ответ

snippet

Дополнительно:

Вы удаляете элемент из DOM и его ширина становится 0.

Использование innerHTML это практически всегда плохая идея.

  • Lynn «Кофеман», а что лучше использовать тогда?
  • Lynn «Кофеман», глянь по возможности мой ответ. Нет ли на такие случаи подходящего слушателя? что-то вроде domContentLoaded.но при отрисовке вставленных элементов/контента после ресайза. Ощущение что все это изобретание велосипеда. Самому интересно, чаще пишу в реакте где подобных проблем нет.
  • Kentavr16,

    > Я так понимаю DOM не успевает перерисоваться после втыкивания в него элементов через иннер хтмл

    неправильно.

    После marqueeWrap.innerHTML = "..."; оригинальный элемент сохранённый в marqueeContent удаляется из DOM и у него уже в принципе нет никаких размеров.

  • webl2m,
    document.createElement

    И если это просто текст, то проще внутренности marquee склонировать

  • Ответы:

    webl2m, я вижу два решения. Первое - добавь отсрочку перед выполнением скрипта. Я так понимаю DOM не успевает перерисоваться после втыкивания в него элементов через иннер хтмл, потому в Math.ceil(marqueeWidth / marqueeContentWidth) ты делил на ноль.

    if(!marqueeContentWidth) {             setTimeout(()=>{                 const duplicatedItems = Array.from(                     { length: itemsNeeded },                     () => originalContent                   ).join('')                                  marqueeWrap.innerHTML = duplicatedItems             },100)         }

    if(!marqueeContentWidth) { setTimeout(()=>{ const duplicatedItems = Array.from( { length: itemsNeeded }, () => originalContent ).join('') marqueeWrap.innerHTML = duplicatedItems },100) }

    Второй вариант - удалить window.addEventListener('resize', duplicateItems). В чем его назначение? И так при ресайзе будет нормальная прокрутка. Или я недопонял что-то?
    И да - добавь

    .marquee {   padding: 5px 0;   background-color: #000;   color: #fff;   overflow: hidden; /* вот это вот */ }

    .marquee { padding: 5px 0; background-color: #000; color: #fff; overflow: hidden; /* вот это вот */ }

    Еще можно промис написать который будет резолв если элемент отрисован.
    Может есть и другие решения - я нашел такие топорные.

    • Наверное по уму использовать mutation observer для родителя этих спанов, но это выглядит уже слишком для такого простого функционала.
    • Kentavr16, если на каком-нибудь условном айфоне 14 повернуть экран. То элементов на всю ширину может не хватить и получится вот это:

      Как решить ошибку Uncaught RangeError: Invalid array length при ресайзе?

      Поэтому думал решить это ресайзом. Хотя на самом деле можно в itemsNeeded плюсануть один лишний дубликат и перекрыть эту нехватку. Сейчас попробую переписать на document.createElement как Lynn «Кофеман» подсказал. Если не получится, так и сделаю ) Спасибо за ответ

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Ирина WP Ответ

    Чтобы решить ошибку Uncaught RangeError: Invalid array length при ресайзе, необходимо понять, что она означает и как можно исправить её.

    Эта ошибка возникает, когда пытаетесь создать массив с недопустимой длиной. В JavaScript максимальная длина массива ограничена 2^32-1 элементами, и попытка создать массив с большей длиной приведет к возникновению данной ошибки.

    Для решения этой проблемы, вам необходимо пересмотреть код, который пытается создать массив с очень большой длиной. Возможно, вам стоит пересмотреть алгоритм или логику вашего приложения, чтобы избежать создания массивов с такой огромной длиной.

    Пример исправления ошибки:

    // Плохой пример
    let arr = new Array(9999999999); // Попытка создать массив с огромной длиной
     
    // Хороший пример
    let arr = new Array(); // Создаем пустой массив
    for (let i = 0; i < 1000; i++) {
      arr.push(i); // Добавляем элементы по одному
    }

    // Плохой пример let arr = new Array(9999999999); // Попытка создать массив с огромной длиной // Хороший пример let arr = new Array(); // Создаем пустой массив for (let i = 0; i < 1000; i++) { arr.push(i); // Добавляем элементы по одному }

    Исправление ошибки заключается в том, чтобы создавать массивы с разумной длиной и избегать создания массивов с огромным количеством элементов. Таким образом, вы сможете избежать ошибки Uncaught RangeError: Invalid array length при ресайзе.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно