防止页面缓存

<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
  1. Android版本:这是浏览器拼接UA之时,取的系统(Build.VERSION.RELEASE)字串,位于标准UA中用红色标识的2.3.5处,可以通过 设置 –》关于手机–》Android版本 进行查看,也就是浏览器的Android版本字段和系统的Build.VERSION.RELEASE 字串保持一致,如果提需求、故障请提交相应维护同事, 不过一般该处使用系统默认不会有问题;
  2. 语言和国家:这是系统当前使用语言和国家,位于标准UA中用绿色标识的zh-cn处。前者是语言名,后者是国家名,这点系统默认一般是正确的,和需求不同往往是因为你现在所使用语言及其国家不同而造 成的,不应该算是故障,这点要注意;
  3. 外部型号:这部分字串每个项目都会更改且是来回沟通需求成本最高的地方。这部分浏览器取的系统(Build.MODEL)字串,位于标准UA中用蓝色标识的P331处,可以通过 设置 –》关于手机–》型号进行查看,也就是浏览器的外部型号和系统的Build.MODEL 字串保持一致;
  4. 版本号:这部分字串一般是带的系统字串,复现的概率一般,浏览器取的系统(Build.ID)字串,是由该项目SCM同事负责维护的,位于标准UA中用紫红标识的GRJ22处,也就是浏览器的版本号和系统的Build.ID字串保持一致,如果提需求和故障请直接提交到该项目SCM处;
  5. 其余:浏览器负责,一般是固定的。电信项目中浏览器的UA绝大部分字串是由浏览器来写死的,有一处例外,以一个电信项目中浏览器UA需求为例。
  6. 电信项目中浏览器的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 使得元素变成了可点击的了。