在大型网站做很多用户行为分析、产品的策划方案基本上都是通过分析用户的访问等信息而做出的,LOG信息的统计准确性会直接影响到产品的设计开发(比如搜索结果的先后排名rank值的产生等)。目前最常用的一个写LOG的方法就是用JavaScript脚本在网页里 new Image().src = "http://xxx.com/log?msg="+ msg; 这种统计方法基本上不会干扰用户的正常操作,虽然有LOG丢失的可能,但只要用得好,还是一种非常好的LOG统计回收的方案。
但是这种LOG回收手段有一个非常隐秘的隐患,事情是这样被发现的。今年3月份百度搜索结果页面上线了Suggestion功能升级版,在LOG统计中突然发现上线后的LOG总量比上线前的少了很多(10%以上),表现出来的现象就是LOG丢失了,没有回收到服务器中来。
工程师立即做了详细排除,从各种因素上确定LOG的大量丢失跟网页上线Suggestion有关,我们马上对Suggestion脚本进行地毯式排查,逐行分析代码,结论是这个脚本没有阻拦 new Image().src 的发包请求(至少表面上是这样的),这段脚本放在一个脚本闭包中,没有影响到全局变量/方法,也没有屏蔽干扰HTTP请求的因素。
我们又做了一个线下试验,同样的代码环境,在线下的测试环境中用这种 new Image().src 的手段,总共向Server端发送了10000个LOG数据,也没有发生LOG丢失,试验的结果也没有发现LOG丢失的原因。
但是在线上的环境中发生的就是有LOG数据丢失,原因不明,所以只能紧急下线这个Suggestion升级版。在这个脚本下线之后,LOG统计数据马上回归到“原正常”状态。从这个现象来看,也从另一个角度说明上线的新脚本确实对LOG统计有影响,头疼呀......
愚者千虑,必有一得!最后方知这个问题的原因是浏览器的垃圾回收机制!
function c(q) {
var p=window.document.location.href,sQ='',sV='';
for(v in q){
switch (v){
case "title":sV=encodeURIComponent(q[v].replace(/<[^<>]+>/g,""));break;
case "url":sV=escape(q[v]);break;
default:sV=q[v]
}
sQ+=v+"="+sV+"&";
}
new Image().src = "http://s.baidu.com/w.gif?q=meizz&"+sQ+"path="+p+"&cid=9&t="+ new Date().getTime();
return true;
}
这个 new Image() 对象没有赋给任何变量,在这个函数执行结束时,浏览器的垃圾回收机制对这种“无主”的对象是毫不客气的回收的,而正是这种回收行为导致了这个HTTP请求(异步的)没有发出,从而造成了LOG数据的丢失。那为什么上线一个脚本就会造成大量的LOG丢失呢?因为一个大脚本的运行回产生大量的“垃圾”,浏览器垃圾回收也会相应地更频繁的启动,从而造成LOG数据丢失。找到原因之后对症下药,把这个 new Image() 对象赋给一个全局有变量常期持有即可,相应的代码如下:
var n = "log_"+ (newDate()).getTime();
var c = window[n] =newImage(); //把new Image()赋给一个全局变量长期持有
c.onload = (c.onerror=function(){window[n] = null;});
c.src = "http://s.baidu.com/w.gif?q=meizz"+ xxxx;
c = null; //释放局部变量c
在这个统计代码上线之后,百度的搜索结果页面的LOG立即多出近10%,之后再上线其它的脚本也没有再出现LOG统计量的波动。
---------------------------------------------------------------------------------------------------------------------------------
局部变量下,测试连续发1000个log
IE6-7 发现log丢失,某些IE内核浏览器也发现log丢失
但在FF, chrome下未发现丢失
因此 保险的做法是用一个非局部变量持有
- var unique = (function () {
- var time= (new Date()).getTime()+'-', i=0;
- return function () {
- return time + (i++);
- }
- })();
- var imgLog = function (url) {
- var data = window['imgLogData'] || (window['imgLogData'] = {});
- var img = new Image();
- var uid = unique();
- img.onload = img.onerror = function () {//销毁一些对象
- img.onload = img.onerror = null;
- img = null;
- delete data[uid];
- }
- img.src = url + '&_uid=' + uid;
- };
原文:http://blog.csdn.net/fudesign2008/article/details/6772108
相关推荐
在Web开发过程中,获取...以上就是使用JavaScript获取图片实际尺寸的基本方法和注意事项。通过理解这些知识点,我们可以在Web开发中更加灵活和准确地处理图片尺寸相关的问题,从而改善用户的视觉体验和页面的适应性。
- 用户授权后,浏览器会显示一个提示框询问用户是否同意摄像头访问请求。 - `constraints`对象可以进一步自定义以满足不同的需求,例如设置视频分辨率、帧率等参数。 #### 二、使用摄像头流实现实时预览 一旦获得...
- 创建一个新的`<img>`元素,并将其`src`属性设置为需要转换的相对路径。 - 当`<img>`元素的`src`属性被设置后,浏览器会自动解析并将其转换为绝对路径。 - 最后获取该`<img>`元素的`src`属性值,即为转换后的...
**五、优化与注意事项** 1. **防止闪烁**:在拖动过程中,可以使用CSS3的`transition`属性减少图片闪烁。 2. **边界检测**:添加边界检测以确保图片只能在容器内拖动。 3. **事件阻止**:阻止默认的`dragstart`事件...
在本文中,我们将深入探讨如何使用jsQR库来识别二维码,这是一个纯JavaScript实现的二维码读取库。这个库特别适合那些刚开始接触二维码识别并希望在Web应用中集成此功能的新手开发者。通过以下内容,您将了解到jsQR...
本文将深入探讨`attr`方法的使用、功能以及注意事项。 ### 一、attr方法的基本用法 `attr`方法的基本语法如下: ```javascript $(selector).attr(attributeName[, value]) ``` - `selector`:用于选择元素的...
console.log("这是一个测试输出"); ``` ##### 8. 日志记录 日志记录对于跟踪程序运行状态至关重要。 - **示例**: ```javascript console.error("这是一个错误日志"); console.warn("这是一个警告日志"); ...
- 使用`wrapAll`方法将所有匹配的元素包裹在一个新元素中。 ```javascript $("li").wrapAll("<b></b>"); ``` #### 四、事件处理 1. **Click事件** - 当用户点击元素时触发。 ```javascript $("button")....
五、注意事项与优化 - 对于大型或复杂的网页,截图可能需要较长时间,需考虑用户体验。 - 部分浏览器可能不支持所有相关API,需进行兼容性检测和降级处理。 - 为了保护用户隐私,注意处理可能包含敏感信息的页面元素...
在Android平台上进行计算机视觉开发时,JavaCV是一个非常重要的库,它为开发者提供了与OpenCV、FFmpeg等库的交互接口。JavaCV使得在Android应用中实现图像处理、视频分析等功能变得更为简单。本文将详细介绍如何配置...
### 五、注意事项 1. **浏览器兼容性**:虽然`jCrop`支持大部分现代浏览器,但老版本的IE(尤其是IE8及以下)可能需要额外的处理,如使用`jQuery UI`的`draggable`替代`jCrop`的拖动功能。 2. **图片版权**:确保...
由于可能涉及到异步操作,使用一个标志变量`flag`来控制上传状态,当所有文件上传完成时,标志变量的值与文件列表长度一致。 ```javascript clickUpload: function() { var that = this; var filesList = this....
INT:中间代码,当一个源程序经过语法检查后编译产生一个可执行代码 IOF:Findit文档 IQY:Microsoft Internet查询文件 ISO:根据ISD 9660有关CD-ROM文件系统标准列出CD-ROM上的文件 ISP:X-Internet签字文件 ...
JS文件中,可能会有动态加载的资源路径,如 AJAX 请求的URL,或者通过 `new Image()` 创建的图片对象的 `src` 属性。 5. **批量替换工具** - **正则表达式**:利用正则表达式匹配和替换字符串,可以快速定位和...
5. **注意事项**: - 图片压缩时要注意不要过度压缩,以免影响图片质量。 - 由于浏览器安全限制,跨域图片无法直接在canvas上操作,除非服务器配置了CORS策略。 - 文件读取和图片压缩都是异步操作,需使用Promise...
当用户选择一个图片文件后,JavaScript可以通过`<input type="file">`元素获取到这个文件。通过`FileReader` API,我们可以读取文件内容并生成预览图像,这对于用户体验是非常友好的,因为用户可以在上传之前查看...
### 知识点三:File API 实用技巧与注意事项 #### 文件类型的精确匹配 除了简单的字符串比较之外,还可以利用正则表达式进行更复杂的类型匹配: ```javascript function isImage(file) { const regex = /^image\/...
3. **注意事项** - 记得在操作完输入流后关闭它,防止内存泄漏。 - `IOException`需要捕获并处理,因为打开或读取文件时可能会出现错误。 - `getDrawableFromAsset()`或类似的辅助方法可以帮助简化代码,使其更...