微信常見問題彙總及解決方案
防止頁面快取
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="pragma" content="no-cache">
UA= User Agent
用瀏覽器瀏覽網頁時,瀏覽器會發送User Agent到網站伺服器,
伺服器可以根據User Agent識別使用者的作業系統及版本,瀏覽器及版本.
然後判斷使用者瀏覽器可以支援的功能,從而返回給瀏覽器不同的程式碼,
但這種差異一般會很小,甚至沒有,所以我們很難會覺察到它的存在
很多視訊網站比如優酷都有對ipad進行優化,可以選擇觀看高清版視訊,而iphone版就不行,能否在瀏覽器中加入ipad的ua讓這些視訊網站將裝置識別為ipad跳轉到ipad版以便能觀看高清視訊呢?
UA的含義
User Agent中文名為使用者代理,簡稱 UA,它是一個特殊字串頭,使得伺服器能夠識別客戶使用的
作業系統及版本、CPU 型別、瀏覽器及版本、瀏覽器渲染引擎、瀏覽器語言、瀏覽器外掛等。
一些網站常常通過判斷 UA 來給不同的作業系統、不同的瀏覽器傳送不同的頁面,因此可能造成某些頁面無法在某個瀏覽器中正常顯示,但通過偽裝 UA 可以繞過檢測。
通過UA,可以知道使用者的手機型別,是moto的,還是三星的。是moto哪一款的,都可以明白。
通過UA,可以檢視手機型別是什麼的。 根據UA,可以向用戶提供適合於他的機器的相關服務,如大
小合適的圖片,格式準確的鈴聲等。
UA字串
標準格式為:瀏覽器標識 (作業系統標識; 加密等級標識;作業系統或CPU;瀏覽器語言) 渲染引擎標識;版本資訊
瀏覽器標識
手機瀏覽器的標識是針對移動運營商的一個標 志。 某些地區會禁止某些標識的瀏覽器連線網路,因此造成瀏覽器無法聯網。 當你的手機瀏覽器出現無法連線某些網站或者無 法聯網的情況時,可以嘗試修改瀏覽器標識
加密等級標識
N: 表示無安全加密
I: 表示弱安全加密
U: 表示強安全加密
瀏覽器語言
設定 >語言和鍵盤設定>手機中指定的語言
作業系統標識
FreeBSD 類unix 作業系統 Mac 蘋果電腦的作業系統Mac OS系統 Solaris Sun Microsystems研發的計算機作業系統 Linux Windows
渲染引擎
渲染引擎,其實就是網頁瀏覽器的排版引擎,也被稱為樣版引擎。
它負責取得網頁的內容(HTML、XML、影象等等)、整理訊息(例如加入CSS等),以及計算網頁的顯示方式,然後會輸出至顯示器或印表機。所有網頁瀏覽器、電子郵件客戶端以及其它需要編輯、顯示網路內容的應用程式都需要渲染引擎
瀏覽器使用 AppleWebKit 渲染引擎,格式為:AppleWebKit /版本號
版本資訊
顯示瀏覽器真實版本資訊,格式為: Version/版本號
Android標準的手機瀏覽器UA
Mozilla/5.0 (Linux; U;Android 2.3.5;zh-cn;P331Build/GRJ22) AppleWebKit/533.1 (KHTML,like Gecko) Version/4.0 Mobile Safari/533.1
- Android版本:這是瀏覽器拼接UA之時,取的系統(Build.VERSION.RELEASE)字串,位於標準UA中用紅色標識的2.3.5處,可以通過 設定 –》關於手機–》Android版本 進行檢視,也就是瀏覽器的Android版本欄位和系統的Build.VERSION.RELEASE 字串保持一致,如果提需求、故障請提交相應維護同事, 不過一般該處使用系統預設不會有問題;
語言和國家:這是系統當前使用語言和國家,位於標準UA中用綠色標識的zh-cn處。前者是語言名,後者是國家名,這點系統預設一般是正確的,和需求不同往往是因為你現在所使用語言及其國家不同而造 成的,不應該算是故障,這點要注意;
外部型號:這部分字串每個專案都會更改且是來回溝通需求成本最高的地方。這部分瀏覽器取的系統(Build.MODEL)字串,位於標準UA中用藍色標識的P331處,可以通過 設定 –》關於手機–》型號進行檢視,也就是瀏覽器的外部型號和系統的Build.MODEL 字串保持一致;
版本號:這部分字串一般是帶的系統字串,復現的概率一般,瀏覽器取的系統(Build.ID)字串,是由該專案SCM同事負責維護的,位於標準UA中用紫紅標識的GRJ22處,也就是瀏覽器的版本號和系統的Build.ID字串保持一致,如果提需求和故障請直接提交到該專案SCM處;
- 其餘:瀏覽器負責,一般是固定的。電信專案中瀏覽器的UA絕大部分字串是由瀏覽器來寫死的,有一處例外,以一個電信專案中瀏覽器UA需求為例。
- 電信專案中瀏覽器的UA:
Mozilla/5.0 (Linux;U;Android 2.2.2;zh-cn;ZTE-C_N880S Build/FRF91) AppleWebkit/531.1
(KHTML, like Gecko) Version/4.0 Mobile Safari/531.1
標題更新
在切換頁面路由之後需在 body 裡面新增 iframe,隨後移除掉 iframe 即可,程式碼如下
// iPhone,iPod,iPad下無法更新標題
if (/ip(hone|od|ad)/i.test(window.navigator.userAgent)) {
let iframe = document.createElement('iframe')
let body = document.querySelector('body')
iframe.style.display = 'none'
iframe.src = '/favicon.ico'
iframe.onload = () => {
setTimeout(() => {
iframe.remove()
}, 10)
}
body.appendChild(iframe)
}
關於單頁面修改title一事
先道出問題:當頁面載入時,微信頂部 title 獲取並顯示,之後怎麼用JS修改 title ,無效。
這個是針對IOS出現的 hack ,Android是有效的。 貌似是IOS的webview沒有監聽titlechange事件。 目前的處理就是使用重新載入頁面的形式來喚醒頁面的title有關事件。
這裡使用在頁面過載了個iframe的形式:
//解決iOS裝置修改title不起作用的bug
function set_title(title) {
document.title = title;
if (!ua.is_idevice) return;
//隨便訪問iframe訪問一個網頁,title就可以重新整理了
var $iframe = $("<iframe style='display:none;' src='/favicon.ico'></iframe>");
$iframe.on('load',function() {
setTimeout(function() {
$iframe.off('load').remove();
}, 0);
}).appendTo($body);
}
iOS Safari 中繫結點選事件失效的解決辦法
因為專案裡的HTML是使用了模板引擎塞進去的,固然統一的事件會用繫結,也可在模板引擎後面新增。 我這裡使用了全域性事件繫結:
// 是否為系統分發禮包
is_system_activity ? to_system_activity() : distribute_activity();
$("body").on("touchstart", ".explain", function() {
if (_hmt) {
_hmt.push(["_trackEvent", "點選次數", "檢視遊戲規則"])
}
$("#game-info").show();
})
我這裡使用了.on()事件,在IOS測試的時候,無效; 我在想是不是.on事件太新了,啊哈哈哈哈啊哈固然不是啦!!! 我就直接使用了.bind()事件來繫結,測試沒問題。
那麼現在問題來了,到底為什麼會這樣呢?
問題描述 當使用委託給一個元素新增click事件時,如果事件是委託到 document 或 body 上,並且委託的元素是預設不可點選的(如 div, span 等),此時 click 事件會失效。
解決辦法 解決辦法有 4 種可供選擇:
將 click 事件直接繫結到目標元素(即 .target)上 將目標元素換成 或者 button 等可點選的元素 將 click 事件委託到非 document 或 body 的父級元素上 給目標元素加一條樣式規則 cursor: pointer; 推薦後兩種。從解決辦法來看,推測在 safari 中,不可點選的元素的點選事件不會冒泡到父級元素。通過新增 cursor: pointer 使得元素變成了可點選的了。