Динамически загружать HTML из других файлов на страницу при прокрутке - PullRequest
0 голосов
/ 01 октября 2019

РЕДАКТИРОВАТЬ: Я наполовину ответил на свой вопрос, но по-прежнему нужна помощь. Пожалуйста, смотрите Динамически загружайте HTML из других файлов на страницу при прокрутке ниже.

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

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

Фрагмент кода на jQuery загружает больше данных на прокрутку похоже, что он может работать, но есть ли способ заменить

html += '<p class="dynamic">Dynamic Data : This is test data.<br />Next line.</p>';

с чем-то, что поставит на место содержимое file1.html, затем file2.html и т. Д.

Если нет, есть ли какой-нибудь способ создания какого-либочто-то вроде файла, в котором бы находились миниатюрные местоположения, на которые можно ссылаться и которые пользователь может прокручивать вниз?

Это видео YouTube показалось хорошей отправной точкой, но для этого требуется вызов AJAXили какой-то другой звонок. Я не уверен, что это значит и куда он звонит.

Ответы [ 3 ]

0 голосов
/ 01 октября 2019

Чтобы загрузить больше контента в Javascript (и используя jQuery), вы можете использовать следующее:

$.ajax("path/to/your/file/file1.html")
  .done((data) => {
    $('body').append(data);
  });

Что это делает:

  1. Получить содержимое file1.html
  2. Добавьте содержимое в тело вашего текущего сайта

Дополнительная информация:

0 голосов
/ 02 октября 2019

Итак, я нашел потенциальное решение с использованием IntersectionObserver благодаря deanhume.com . Он прекрасно работает в Chrome и более новых версиях Firefox.

К сожалению, мы все еще кодируем работу нашего сайта, работая с IE 11 в качестве нашего стандарта. Я не знаю почему, но мы делаем это, я должен иметь дело с этим. Проблема в том, что это решение не работает со старой версией Firefox, которую я использую для проверки, и не работает с IE 11. Поэтому я хочу использовать полифилл.

Страница GitHub для полизаполнения говорит об использовании <script src="https://polyfill.io/v3/polyfill.min.js?features=IntersectionObserver"></script> для поддержки старых браузеров, но, похоже, не работает. Я также разместил на сайте файл JavaScript с полифилом и ссылался на него в заголовке страницы перед любым другим Javascript, но он также, похоже, не работает.

Как правильно загрузить файл полизаполнения?

Первая строка, ссылающаяся на него: <script src="../pathto/polyfills/intersectionobserver.js"></script>

Тогда есть несколько несвязанных вещей, прежде чем попасть на пересечениеБит наблюдателя;CSS для появления и вызова в сценарии с отложенной загрузкой:

  <style>
    .fade-in {
      animation-name: fadeIn;
      animation-duration: 1.3s;
      animation-timing-function: cubic-bezier(0, 0, 0.4, 1);
      animation-fill-mode: forwards;
    }

    @keyframes fadeIn {
      from {
        opacity: 0;
      }

      to {
        opacity: 1;
      }
    }

.centered {
   display:block;
   margin:0 auto;
}
  </style>

  <script type="module">
    import LazyLoad from "../pathto/lazy-load.js";
    LazyLoad.init();
  </script>

Ниже приведен файл lazy-load.js.

const defaults = {
  imageLoadedClass: 'js-lazy-image--handled',
  imageSelector: '.js-lazy-image',
  // If the image gets within 100px in the Y axis, start the download.
  rootMargin: '100px 0px',
  threshold: 0.01
};

let config,
    images,
    imageCount,
    observer;

/**
 * Fetches the image for the given URL
 * @param {string} url
 */
function fetchImage(url) {
  return new Promise((resolve, reject) => {
    const image = new Image();
    image.src = url;
    image.onload = resolve;
    image.onerror = reject;
  });
}

/**
 * Preloads the image
 * @param {object} image
 */
function preloadImage(image) {
  const src = image.dataset.src;
  if (!src) {
    return;
  }

  return fetchImage(src).then(() => { applyImage(image, src); });
}

/**
 * Load all of the images immediately
 * @param {NodeListOf<Element>} images
 */
function loadImagesImmediately(images) {
  // foreach() is not supported in IE
  for (let i = 0; i < images.length; i++) {
    let image = images[i];
    preloadImage(image);
  }
}

/**
 * Disconnect the observer
 */
function disconnect() {
  if (!observer) {
    return;
  }

  observer.disconnect();
}

/**
 * On intersection
 * @param {array} entries
 */
function onIntersection(entries) {
  // Disconnect if we've already loaded all of the images
  if (imageCount === 0) {
    disconnect();
    return;
  }

  // Loop through the entries
  for (let i = 0; i < entries.length; i++) {
    let entry = entries[i];
    // Are we in viewport?
    if (entry.intersectionRatio > 0) {
      imageCount--;

      // Stop watching and load the image
      observer.unobserve(entry.target);
      preloadImage(entry.target);
    }
  }
}

/**
 * Apply the image
 * @param {object} img
 * @param {string} src
 */
function applyImage(img, src) {
  // Prevent this from being lazy loaded a second time.
  img.classList.add(config.imageLoadedClass);
  img.src = src;
}

let LazyLoad = {

  init: (options) => {
    config = {...defaults, ...options};

    images = document.querySelectorAll(config.imageSelector);
    imageCount = images.length;

    // If we don't have support for intersection observer, loads the images immediately
    if (!('IntersectionObserver' in window)) {
      loadImagesImmediately(images);
    } else {
      // It is supported, load the images
      observer = new IntersectionObserver(onIntersection, config);

      // foreach() is not supported in IE
      for (let i = 0; i < images.length; i++) {
        let image = images[i];
        if (image.classList.contains(config.imageLoadedClass)) {
          continue;
        }

        observer.observe(image);
      }
    }
  }
};

export default LazyLoad;

И на всякий случай, пример кода изображения на странице:

<img class="js-lazy-image" data-src="url/members/thumbs/ab_banff_np.jpg" alt="rockies, rocky mountains, trees, summer" aria-describedby="image_g2">

0 голосов
/ 01 октября 2019

Теперь вы можете выполнять ленивую загрузку нативного HTML-кода, используя тег loading="lazy"

Пример:

<img src="image.png" loading="lazy" width="200" height="200">

Дополнительная информация: https://css -tricks.com / native-отложенная загрузка /

...