背景:目前項目使用 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); })(),