laydate 在 ie 瀏覽器中無法彈出


背景:目前項目使用 Angular 開發,里面引入了 laydate.js 做日期控件。

問題:最近項目從 Angular8 升級到了 Angular9,發現升級之后在 IE 里面不能打開日期彈框了。

原因:經過一系列的調試操作之后終於發現,Angular9 的 script 標簽都使用了 defer,在 laydate.js 加載的時候他們並沒有加載完畢,所以 laydate.js 中不能獲取到當前正在加載的 script 的 src 值。這時候它會去獲取最后一個 script 標簽的 src 值,好死不死的是我們的主頁里面最后一個 script 不是引入的,它沒有 src 值,這時候 getPath 函數就返回 undefined 了,導致整個組件不加載。

解決:修改 getPath 方法,將獲取 src 改成獲取最后一個帶 src 的 script 的src 值。

 

原來代碼如下:

getPath: function(){
      var jsPath = document.currentScript ? document.currentScript.src : function(){
        var js = document.scripts
        ,last = js.length - 1
        ,src;
        for(var i = last; i > 0; i--){
          if(js[i].readyState === 'interactive'){
            src = js[i].src;
            break;
          }
        }
        return src || js[last].src;
      }();
      return jsPath.substring(0, jsPath.lastIndexOf('/') + 1);
}()

  

 

修改后的代碼:

getPath: (function () {
                var jsPath = document.currentScript
                    ? document.currentScript.src
                    : (function () {
                          var js = document.scripts,
                              last = js.length - 1,
                              src;

                          for (var i = last; i > 0; i--) {
                              if (js[i].readyState === 'interactive') {
                                  src = js[i].src;
                                  break;
                              }
                          }
                          var srcJs = [].slice
                              .call(js)
                              .filter(function (scriptItem) {
                                  return scriptItem.src;
                              });
                          return src || srcJs[srcJs.length - 1].src;
                      })();
                return jsPath.substring(0, jsPath.lastIndexOf('/') + 1);
})(),

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM