19年12月踩過(guò)最深的坑

前天快下班的時(shí)候收到客服反饋購(gòu)買(mǎi)產(chǎn)品頁(yè)面提示用戶(hù)瀏覽器版本過(guò)低,想到自己更新vue項(xiàng)目不久,因此可能是用戶(hù)訪問(wèn)的是緩存index頁(yè)面,里面的外聯(lián)js都是失效的,而在頁(yè)面加載完后500ms,我判斷到頁(yè)面文字還是原來(lái)預(yù)設(shè)的文字時(shí)就說(shuō)明項(xiàng)目沒(méi)有運(yùn)行成功,可能是碰到不兼容的錯(cuò)誤,因此會(huì)提示用戶(hù)瀏覽器版本底了,但是后來(lái)想想用戶(hù)訪問(wèn)緩存頁(yè)面遇到這種情況 ,我會(huì)自動(dòng)幫用戶(hù)刷新瀏覽器的,不會(huì)存在這種情況呀(犯了調(diào)試9法中的 那不可能發(fā)生的條例),是不是確實(shí)是用戶(hù)的瀏覽器版本低呢?(既然是突然、集中出現(xiàn)的,那說(shuō)明跟用戶(hù)瀏覽器版本沒(méi)有關(guān)系)因此為了驗(yàn)證這個(gè)判斷,我讓客服幫忙讓用戶(hù)訪問(wèn)可以拿到用戶(hù)瀏覽器的user agent的網(wǎng)址,同時(shí)詢(xún)問(wèn)用戶(hù)之前是否可以正常使用該頁(yè)面;客服做了這件事后,另一個(gè)客服也反饋瀏覽器版本問(wèn)題,因此這時(shí)我確定是我這邊的問(wèn)題了,然后看看自己的代碼---資源跟頁(yè)面是同域且能夠識(shí)別該資源地址且該資源不是img的情況時(shí),我會(huì)幫用戶(hù)刷新瀏覽器;(當(dāng)時(shí)沒(méi)想到,這些都是要在觸發(fā)error 事件的大前提下 才會(huì)執(zhí)行 的);說(shuō)明自己在判斷條件及幫用戶(hù)刷新瀏覽器這兩個(gè)步驟出問(wèn)題了,因此我簡(jiǎn)化了判斷條件(不要求同域、不要求識(shí)別到資源地址、不需要判斷是否為img標(biāo)簽)及由 window.location.href = window.location.href+'?getTimeForReload='+new Date().getTime();刷新方式改為location.reload(true) 方式(微信里還是保持 location.href刷新方式)(雖然知道自己明知犯了 調(diào)試九法 中的 單一原則 但我還是這么做了。。。) 。以為自己就這么解決問(wèn)題了,但是第二天一上班還是覺(jué)得心里沒(méi)有譜,想把這個(gè)問(wèn)題研究到底、研究的清清楚楚(這點(diǎn)精神值得后續(xù)保持),因此在拿到客服給的user agent 信息后, 在公司的測(cè)試機(jī)中找到一款比較接近的OPPO進(jìn)行簡(jiǎn)單測(cè)試,發(fā)現(xiàn)我之前的猜測(cè)是錯(cuò)誤的,因?yàn)橐笸?、要求識(shí)別到資源地址、需要判斷不為img標(biāo)簽,且刷新瀏覽器的方式,它都能夠正常判斷和運(yùn)行。后來(lái)為了驗(yàn)證自己的最新代碼是否有效,我按照正常流程進(jìn)行打包及采用遠(yuǎn)程域名但實(shí)際使用的是本地資源的方式(可見(jiàn)研究前端常用工具很關(guān)鍵)進(jìn)行測(cè)試,驚奇的發(fā)現(xiàn)我曾經(jīng)遇到的一個(gè)相同的報(bào)錯(cuò)---Uncaught SyntaxError: Unexpected token <
,自己還寫(xiě)了一篇 js報(bào)Uncaught SyntaxError: Unexpected token <錯(cuò)誤 解決方法 這樣的文章;(可見(jiàn)影響力、多做事情,積累經(jīng)驗(yàn)很關(guān)鍵)

因此答案慢慢浮出水面了----出現(xiàn)404時(shí),服務(wù)器返回了一個(gè)html給我,所以不會(huì)觸發(fā) error事件。測(cè)試一個(gè)不存在的js資源地址,發(fā)現(xiàn)無(wú)論如何它都會(huì)返回首頁(yè)的html給我。所以進(jìn)一步驗(yàn)證了判斷。

總結(jié):
1、遇到問(wèn)題不要逃避或放棄,多嘗試幾種方案,說(shuō)不定偶然間會(huì)發(fā)現(xiàn)一些有用的線索;
2、遇見(jiàn)詭異問(wèn)題,多想想,要具備深入研究精神,要有“打破砂鍋問(wèn)到底”、“不見(jiàn)真相不罷休” 的思想,不要“想當(dāng)然”的解決問(wèn)題(如 可能是xxxxx),要嚴(yán)謹(jǐn)、要驗(yàn)證;
3、詭異問(wèn)題,也可能是其他方面的錯(cuò)誤,如后端接口、運(yùn)維設(shè)置,不要一直把關(guān)注點(diǎn)放在自己,思路應(yīng)該開(kāi)闊點(diǎn);
4、遇見(jiàn)問(wèn)題,不能“目擊現(xiàn)場(chǎng)”時(shí),要盡量模擬整個(gè)流程且要與真實(shí)的場(chǎng)景一致,也就是復(fù)現(xiàn)要與真實(shí)場(chǎng)景一致;
5、平時(shí)多做事情、多積累經(jīng)驗(yàn)、多總結(jié)及提升自己的影響力;

window.addEventListener('error', function(msg, url, row, col, error){
      // console.log(msg)
      var targetSrc = getSrcOrHref(msg);
      // console.log(targetSrc)

      if (msg.target && !msg.message) {
        document.getElementById('app')? document.getElementById('app').innerText='檢測(cè)到頁(yè)面有更新或資源加載失敗,請(qǐng)刷新頁(yè)面。(加載失敗的資源地址:'+targetSrc+')':'';
        // alert('檢測(cè)到頁(yè)面有更新或資源加載失敗,即將刷新瀏覽器。'+targetSrc);

        if(getBrowserInfo()){
          window.location.href = window.location.href+'?getTimeForReload='+new Date().getTime();
        }else {
          window.location.reload(true)
        }

        // var joiner=window.location.href.indexOf('?')===-1?'?':'&';
        // window.location.href = window.location.href+joiner+'getTimeForReload='+new Date().getTime();
        // if (confirm('檢測(cè)到平臺(tái)程序有更新,是否需要刷新瀏覽器?'+targetSrc)) {
        //   console.error('可能您的瀏覽器還在使用過(guò)期的緩存文件,是否需要幫您自動(dòng)刷新瀏覽器?'+'原因?yàn)檎也坏?+targetSrc);
        //   window.location.href = window.location.href+'?getTimeForReload='+new Date().getTime();
        //
        // }
      }
      // console.log('msg.target',msg.target)

      console.warn(msg.target ? msg.target.outerHTML:'無(wú)法找到目標(biāo)地址');
      console.warn(msg.srcElement ? msg.srcElement.outerHTML:'無(wú)法找到目標(biāo)地址');
      console.warn(
        msg, url, row, col, error
      );
      return true;
    }, true);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 人丑就該多看書(shū) 文章來(lái)自其他博文。 *.location.href 用法: javascript> functio...
    櫻花樹(shù)下_529d閱讀 484評(píng)論 0 0
  • ??ECMAScript 是 JavaScript 的核心,但如果要在 Web 中使用 JavaScript,那么...
    霜天曉閱讀 954評(píng)論 0 0
  • ??JavaScript 與 HTML 之間的交互是通過(guò)事件實(shí)現(xiàn)的。 ??事件,就是文檔或?yàn)g覽器窗口中發(fā)生的一些特...
    霜天曉閱讀 3,701評(píng)論 1 11
  • mobileHack 這里收集了許多移動(dòng)端上遇到的各種坑與相對(duì)解決方案 工具類(lèi)網(wǎng)站 HTML5 與 CSS3 技術(shù)...
    Zoemings閱讀 6,770評(píng)論 0 12
  • “相別多年,甚是掛念,余離家多年,遍尋多地未果,幸門(mén)下弟子巧遇,三日之后自有人樂(lè)坊尋之,當(dāng)年因果自然相告?!蔽揖従?..
    林書(shū)洛閱讀 375評(píng)論 0 1

友情鏈接更多精彩內(nèi)容