Прокрутка первого появления до верхней позиции внутри div

#javascript #html

#javascript #HTML

Вопрос:

После того, как я нажал на ссылку, которая переходит на другую страницу, я должен прокрутить первое (самое раннее) появление тревоги (которое помечено красным текстом) в верхней части «tbody» div. В каждой строке есть id='tab_content' и данные таблицы class = 'td_list_row_center' . При возникновении тревоги tds меняют цвет с черного на красный и имя class = 'td_list_row_center font-red" .

Я пытался обработать появление красного цвета, и если оно было найдено, прокрутите вверху внутри «tbody» div. Вторая строка должна быть черным шрифтом (без тревоги)

 <script>
    function scrollToFirstRedAlarmOccurence(red_occurrence) {
        $('tbody').animate({
            scrollTop: red_occurrence.offset().top
        }, 2000);
    }

    var red_occurrence = document.getElementsByClassName("td_list_row_center font-red");

    if(red_occurrence)
        scrollToFirstRedAlarmOccurence(red_occurrence);
    else
        null
</script>
  

После нажатия на ссылку и отображения таблицы ничего не происходит (например, скрипт не работает). Я ожидаю, что он будет прокручиваться до первого красного появления из огромного набора данных. После того, как я прокручиваю таблицу вверх, я увижу еще одно более позднее появление красного цвета. Ниже фактические и ожидаемые результаты в виде фотографий:

[Фактическое разрешение] -> https://ibb.co/1zn4ty9
[Ожидаемое разрешение] -> https://ibb.co/Jy6FrL6

Комментарии:

1. вы должны добавить сюда полный html и js

2. jsfiddle.net/ox1mbc8w

3. можете ли вы конвертировать только в html?

Ответ №1:

Параметры для ‘getElementsByClassName’ неверны. Используйте их следующим образом.

 <script>
  function scrollToFirstRedAlarmOccurence(red_occurrence) {
    // make jQuery object for first element
    $('tbody').animate({
      scrollTop: $(red_occurrence[0]).offset().top,
    }, 2000);
  }
  setTimeout(() => {
    // select "font-red" classed elements
    var red_occurrence = document.getElementsByClassName("font-red"); // you can use jQuery selector too
    if(red_occurrence.length) { // check for array length
      scrollToFirstRedAlarmOccurence(red_occurrence);
    }
  }, 1000); // wait for DOM to render
</script>
  

В принципе, вы можете отладить свой код, чтобы проверить, получают ли они правильные значения. Я внес некоторые исправления, которые будут работать в вашем случае.

Комментарии:

1. Хорошо, я использовал ваш измененный код, но он не работает. Теперь мне нужно подождать, пока все данные будут загружены, а затем прокрутить до последнего элемента массива red_occurence. Я только что внес простое изменение. n setTimeout(() => { var red_occurrence = document.getElementsByClassName("font-red"); var first_red_occurrence = red_occurrence[red_occurrence.length-1]; scrollToFirstRedAlarmOccurrence(first_red_occurrence); }, 10000);

2. Работает ли модифицированное решение? Я вижу, что вы ждете 10 секунд. Я предполагаю, что есть вызов AJAX, и эти элементы DOM генерируются после его успешного ответа. Если это так, я предложу добавить эти проверки в обработчик успеха. Таким образом, вы можете быть уверены, что ваш код будет работать, даже если вызов AJAX займет больше времени, чем ожидалось.

3. Нет, мой измененный код не работает. Я мало что знаю об AJAX. Не могли бы вы сказать мне, что не так в моем коде здесь ссылка ? Я хочу сохранить first_red_occurrence после загрузки всех данных. Результат для консоли. журнал показывает, что first_red_occurrence указывает на последний элемент, кроме консоли. журнал выполняется несколько раз (количество запусков равно количеству строк?).

4. Как вы можете видеть, последний элемент в консоли Firefox указывает на самый ранний сигнал тревоги, и ЭТА строка должна отображаться вверху в tbody. Ссылка

5. Хорошо, все работает как шарм 🙂 Спасибо Суджит за отличные советы!