背景:如果頁面title是異步獲取的數據,那么拿到數據直接使用document.title會在ios低版本出現失效的問題,因為頁面加載完成后title被確定,此后不再監聽title的change事件
解決方法:獲取到數據后,動態創建iframe標簽,src指向一個非常小的資源,監聽load事件,加載完成立即刪除即可更新title
代碼:
document.title = this.title; let iframe = document.createElement('iframe'); iframe.src = require('/favicon.ico'); iframe.style.display = 'none'; let fn = function () { setTimeout(function () { iframe.removeEventListener('load', fn); document.body.removeChild(iframe); console.log('title', document.title); }, 0); }; iframe.addEventListener('load', fn); document.body.appendChild(iframe);
原理: iframe是內聯框架元素,可以將另一個html元素嵌入到當前頁面,當異步獲取到數據后,動態創建的iframe根據指定src發送請求,從而觸發title的監聽,加載完后移除不會對頁面造成影響。
針對ios:由於只是部分ios的微信瀏覽器有此現象,所以不需要對所有設備進行此操作,可進行判斷
iphone8P 微信 useragent: Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.8(0x17000820) NetType/WIFI Language/zh_CN
var ua = navigator.userAgent.toLowerCase(); if(ua.match(/MicroMessenger/i)=="micromessenger" && !!ua.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/i)){ ...iframe操作 }
該方案無法解決的問題:
ios safari的地址欄顯示域名,無法通過此方法修改title
安卓部分野雞瀏覽器(安卓低版本自帶瀏覽器)顯示的是完整url