亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何添加新腳本并將其加載到滾動條上?

如何添加新腳本并將其加載到滾動條上?

慕哥6287543 2022-05-26 14:53:18
我正在嘗試添加新腳本,并且只想在滾動時添加。我試過這個但沒有奏效。知道為什么嗎?      $(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 回答

?
慕容3067478

TA貢獻1773條經驗 獲得超3個贊

您可以動態添加腳本。


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;

       }

}


查看完整回答
反對 回復 2022-05-26
?
慕慕森

TA貢獻1856條經驗 獲得超17個贊

在這里,我們要確保正確加載腳本。您可以在嘗試動態加載腳本時嘗試使用偵聽器,并確保正確加載腳本。


您可以收聽 Mutation Events,但由于性能和瀏覽器兼容性問題不再推薦


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


第二種選擇是將事件附加到附加的 childNode。實際上,appendChild 方法返回 childNode,它可以監聽 window 觸發的 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);

      }

    }

但是,上述解決方案在頁面完全加載(包括資產)時偵聽由 window 觸發的 load 事件,這與加載 DOM 但不等待加載資產時觸發的 DocumentContentLoaded 事件形成對比:


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


上面的問題是 load 事件應該在第一次加載時使用,而不是在 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 突變,但它不會在腳本實際加載時觸發,因此也使用 window 的 load 事件會使解決方案更強大。

現在,為什么只需要在 DOM 中附加一個腳本就需要所有這些?其中一些原因是:

  • 一件事是在 DOM 中附加一個腳本,但重要的是何時加載腳本

  • 我們在監聽 DOM 操作事件時應該非常小心,因為它很容易導致性能下降

  • 附加孩子時不需要聽錯誤,因為失敗的情況很少見


查看完整回答
反對 回復 2022-05-26
?
繁星淼淼

TA貢獻1775條經驗 獲得超11個贊

如果您使用的是 jQuery,那么您可以使用$.getScript。


$.getScript("your/script.js", function(){

    console.log("Script was loaded");

});


查看完整回答
反對 回復 2022-05-26
  • 3 回答
  • 0 關注
  • 142 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號