You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Synchronous XMLHttpRequest outside of workers is in the process of being removed from the web platform as it has detrimental effects to the end user's experience. (This is a long process that takes many years.) Developers must not pass false for the async argument when entry settings object's global object is a Window object. User agents are strongly encouraged to warn about such usage in developer tools and may experiment with throwing an InvalidAccessError exception when it occurs.
智能Beacon
GA监控脚本一般都放在开发者的网页上。域名往往和Google不一样,这样发送请求到Google服务器的时候会涉及到跨域。普通的Ajax请求是做不到的,通常称这种请求为beacon或是ping。业内常用的一个方案是发送一个图片请求(GET方式),将请求参数放在图片请求的地址后面。例如:
因为通常第三方监控请求没有很强的安全要求(不会发送密码、密钥之类的信息),所以使用图片请求将请求参数放在地址里面也是OK的。示例代码如下:
图片请求是GET请求,参数放在URL地址中,而URL地址的长度是有一定限制的。规范对URL长度并没有要求,但是浏览器、服务器、代理服务器都URL对长度有要求。例如:IE6、7、8(部分)的URL长度不能超过2083的字符长度,URL中的path部分不能超过2048。这就导致有些请求会发送不完全。
为了解决这个问题可以使用
XMLHttpRequest
(简称XHR)来发送跨域POST请求。当然这需要浏览器的跨域支持。发送POST请求时,参数都放在请求的payload中,不会受到URL长度所限制。但因为是POST请求,所以需要协议头部比GET方法多一点点,消耗也稍高。示例代码如下:除了这两种方法之外,浏览器还提供了一个标准的用于发送beacon的方法:
[navigator.sendBeacon](http://)
。这个方法本质上和跨域的XHR请求没有多大区别,但是sendBeacon
方法能够确保在页面关闭的时候还能发送成功。这也是它的最大优势。示例代码如下:在
sendBeacon
出现之前,为了能够在页面关闭时发送beacon,常用的方法是两种:先发送一个图片的beacon,然后死循环200ms左右来提高beacon请求发送成功的概率
发送同步的XHR请求,确保页面要等到XHR请求结束后才能关闭。不过同步XHR已经被W3C标准定义为不推荐使用了:
综合上面的讨论给出如下的对比表格:
2. 支持广
2. 需要延迟关闭才能用于unload发送
sendBeacon
2. 支持发送更多数据
2. 旧浏览器支持少
2. 旧浏览器支持少
3. unload时不能使用
如果没有指定发送方法,那么GA会在URL字符长度不超长时使用图片beacon的方式发送。如果超过了则尝试使用
sendBeacon
方法发送beacon请求,如果不支持sendBeacon
则会采用跨域XHR发送。如果跨域XHR不支持则最后fallback到图片发送。实际代码如下:当然GA的做法并非最优,因为非IE6、7的浏览器图片请求发送的数据可以超过2083。如果真的有很多数据需要发送,那么我们可以合并短请求、拆分长请求。
资料:
我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=t0ien3e6ws9r
The text was updated successfully, but these errors were encountered: