Как я могу добавить новый скрипт и загрузить его на свиток? - PullRequest
1 голос
/ 22 марта 2020

Я пытаюсь добавить новый скрипт и хочу к нему только при прокрутке. Я попробовал это, но не сработало. есть идеи почему?

      $(window).scroll(function() {
       var heightT = $('body').offset().top,
           outerH = $('body').outerHeight(),
           windowH = $(window).height(),
           wS = $(this).scrollTop();

       if (wS > (heightT+outerH-windowH-200)){
          <script src="myscript.js"></script>
       }

Ответы [ 3 ]

0 голосов
/ 22 марта 2020

Если вы используете jQuery, то вы можете использовать $. GetScript .

$.getScript("your/script.js", function(){
    console.log("Script was loaded");
});
0 голосов
/ 29 марта 2020

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

Вы можете прослушивать события мутации, но это больше не рекомендуется из-за производительности и браузера проблемы совместимости

https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Mutation_events

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

Здесь потенциальная реализация ванили javascript:

    const id = "scriptID";
    const src = "your script src";  
    const scriptElement = document.getElementById(id);

    if (!scriptElement) {
      const script = document.createElement("script");

      if (script) {
        script.src = src;       
        script.id = id;

        const loadError = () => throw new Error("can't load the script")
        const loadSuccess = () => console.log("loaded");
        const attachedScript = document.body.appendChild(script);
        const onloadEvent = attachedScript.addEventListener("load", loadSuccess);
        const onerrorEvent = attachedScript.addEventListener("error", loadError);
        const onavortEvent = attachedScript.addEventListener("abort", loadError);

      } else {
        const error = "can't load the script";
        throw new Error(error);
      }
    }

Однако вышеприведенное решение прослушивает событие загрузки, которое запускается окном, когда страница полностью загружена (включая ресурсы), что В отличие от события DocumentContentLoaded, которое вызывается при загрузке DOM, но не ожидает загрузки ресурсов:

https://developer.mozilla.org/en-US/docs/Web/API/Document/DOMContentLoaded_event

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

https://developer.mozilla.org/en-US/docs/Web/API/Window/load_event

Вместо элегантного решения будет использоваться вместо MutationObserver, предназначенный для замены функции MutationEvents:

https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver

    const id = "scriptID";
    const src = "https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.9/angular.js";   
    const scriptElement = document.getElementById(id);

    if (!scriptElement) {
      const script = document.createElement("script");

      if (script) {
        script.src = src;       
        script.id = id;

        const observer = new MutationObserver(() => { 
          console.log("change being done");
          observer.disconnect();
        });
        const config = { attributes: false, childList: true, subtree: true };
        observer.observe( document.body, config);
        document.body.appendChild(script)

      } else {
        const error = "can't load the script";
        throw new Error(error);
      }
    }

MutationObserver ищет мутацию DOM, но не запускается, когда скрипт на самом деле загружен, поэтому использование события load из окна также сделает решение более сильным.

Теперь, зачем все это нужно для простого добавления скрипта в DOM? Вот некоторые из причин:

  • Одна вещь - это добавление скрипта в DOM, но важно то, что когда скрипт загружен
  • , мы должны быть очень осторожны при прослушивании манипуляций с DOM события, потому что это может легко привести к снижению производительности
  • , при добавлении дочернего элемента нет необходимости прислушиваться к ошибке, так как случаи сбоя редки
0 голосов
/ 22 марта 2020

Вы можете добавить скрипт динамически.

let scriptAdded = false;

$(window).scroll(function() {
       var heightT = $('body').offset().top,
           outerH = $('body').outerHeight(),
           windowH = $(window).height(),
           wS = $(this).scrollTop();

       if (wS > (heightT+outerH-windowH-200) && !scriptAdded){
          var script = document.createElement('script');
          script.setAttribute('src','myscript.js');
          document.head.appendChild(script);
          // So that not add many time
          scriptAdded = true;
       }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...