`
dingdingfm
  • 浏览: 50702 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

用new Image().src作LOG统计的一个注意事项

 
阅读更多
转载:http://blog.csdn.net/fudesign2008/article/details/6772108
用new Image().src作LOG统计的一个注意事项
2009-08-06 17:40

在大型网站做很多用户行为分析、产品的策划方案基本上都是通过分析用户的访问等信息而做出的,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下未发现丢失

 

因此 保险的做法是用一个非局部变量持有

 

[javascript] view plaincopy
 
  1. var unique = (function () {  
  2.     var time= (new Date()).getTime()+'-', i=0;  
  3.     return function () {  
  4.        return time + (i++);  
  5.     }  
  6. })();  
  7.   
  8. var imgLog = function (url) {  
  9.     var data = window['imgLogData'] || (window['imgLogData'] = {});  
  10.     var img = new Image();  
  11.     var uid = unique();  
  12.     img.onload = img.onerror = function () {//销毁一些对象  
  13.         img.onload = img.onerror = null;  
  14.         img = null;  
  15.         delete data[uid];  
  16.     }  
  17.     img.src = url + '&_uid=' + uid;  
  18. };  


原文:http://blog.csdn.net/fudesign2008/article/details/6772108

 

分享到:
评论

相关推荐

    js判断图片加载完成后获取图片实际宽高的方法

    在Web开发过程中,获取...以上就是使用JavaScript获取图片实际尺寸的基本方法和注意事项。通过理解这些知识点,我们可以在Web开发中更加灵活和准确地处理图片尺寸相关的问题,从而改善用户的视觉体验和页面的适应性。

    【JavaScript源代码】JavaScript 如何在浏览器中使用摄像头.docx

    - 用户授权后,浏览器会显示一个提示框询问用户是否同意摄像头访问请求。 - `constraints`对象可以进一步自定义以满足不同的需求,例如设置视频分辨率、帧率等参数。 #### 二、使用摄像头流实现实时预览 一旦获得...

    javascript将相对路径转绝对路径示例.docx

    - 创建一个新的`&lt;img&gt;`元素,并将其`src`属性设置为需要转换的相对路径。 - 当`&lt;img&gt;`元素的`src`属性被设置后,浏览器会自动解析并将其转换为绝对路径。 - 最后获取该`&lt;img&gt;`元素的`src`属性值,即为转换后的...

    jquery图片拖拽排序.rar

    **五、优化与注意事项** 1. **防止闪烁**:在拖动过程中,可以使用CSS3的`transition`属性减少图片闪烁。 2. **边界检测**:添加边界检测以确保图片只能在容器内拖动。 3. **事件阻止**:阻止默认的`dragstart`事件...

    简单jsQR识别二维码例子

    在本文中,我们将深入探讨如何使用jsQR库来识别二维码,这是一个纯JavaScript实现的二维码读取库。这个库特别适合那些刚开始接触二维码识别并希望在Web应用中集成此功能的新手开发者。通过以下内容,您将了解到jsQR...

    jquery的attr方法使用

    本文将深入探讨`attr`方法的使用、功能以及注意事项。 ### 一、attr方法的基本用法 `attr`方法的基本语法如下: ```javascript $(selector).attr(attributeName[, value]) ``` - `selector`:用于选择元素的...

    javascript 常用代码

    console.log("这是一个测试输出"); ``` ##### 8. 日志记录 日志记录对于跟踪程序运行状态至关重要。 - **示例**: ```javascript console.error("这是一个错误日志"); console.warn("这是一个警告日志"); ...

    JQuery基础.docx

    - 使用`wrapAll`方法将所有匹配的元素包裹在一个新元素中。 ```javascript $("li").wrapAll("&lt;b&gt;&lt;/b&gt;"); ``` #### 四、事件处理 1. **Click事件** - 当用户点击元素时触发。 ```javascript $("button")....

    Screenshot-JS屏幕截图插件脚本

    五、注意事项与优化 - 对于大型或复杂的网页,截图可能需要较长时间,需考虑用户体验。 - 部分浏览器可能不支持所有相关API,需进行兼容性检测和降级处理。 - 为了保护用户隐私,注意处理可能包含敏感信息的页面元素...

    android+javaCV环境配置

    在Android平台上进行计算机视觉开发时,JavaCV是一个非常重要的库,它为开发者提供了与OpenCV、FFmpeg等库的交互接口。JavaCV使得在Android应用中实现图像处理、视频分析等功能变得更为简单。本文将详细介绍如何配置...

    jquery头像截取jcrop

    ### 五、注意事项 1. **浏览器兼容性**:虽然`jCrop`支持大部分现代浏览器,但老版本的IE(尤其是IE8及以下)可能需要额外的处理,如使用`jQuery UI`的`draggable`替代`jCrop`的拖动功能。 2. **图片版权**:确保...

    jQuery实现input[type=file]多图预览上传删除等功能

    由于可能涉及到异步操作,使用一个标志变量`flag`来控制上传状态,当所有文件上传完成时,标志变量的值与文件列表长度一致。 ```javascript clickUpload: function() { var that = this; var filesList = this....

    网管教程 从入门到精通软件篇.txt

    INT:中间代码,当一个源程序经过语法检查后编译产生一个可执行代码 IOF:Findit文档 IQY:Microsoft Internet查询文件 ISO:根据ISD 9660有关CD-ROM文件系统标准列出CD-ROM上的文件 ISP:X-Internet签字文件 ...

    css批量图片路径替换

    JS文件中,可能会有动态加载的资源路径,如 AJAX 请求的URL,或者通过 `new Image()` 创建的图片对象的 `src` 属性。 5. **批量替换工具** - **正则表达式**:利用正则表达式匹配和替换字符串,可以快速定位和...

    javascript实现移动端 HTML5 图片上传预览和压缩功能示例

    5. **注意事项**: - 图片压缩时要注意不要过度压缩,以免影响图片质量。 - 由于浏览器安全限制,跨域图片无法直接在canvas上操作,除非服务器配置了CORS策略。 - 文件读取和图片压缩都是异步操作,需使用Promise...

    图片上传

    当用户选择一个图片文件后,JavaScript可以通过`&lt;input type="file"&gt;`元素获取到这个文件。通过`FileReader` API,我们可以读取文件内容并生成预览图像,这对于用户体验是非常友好的,因为用户可以在上传之前查看...

    判断file框选择的是否为图片

    ### 知识点三:File API 实用技巧与注意事项 #### 文件类型的精确匹配 除了简单的字符串比较之外,还可以利用正则表达式进行更复杂的类型匹配: ```javascript function isImage(file) { const regex = /^image\/...

    Android 加载asset文件夹下边的图片

    3. **注意事项** - 记得在操作完输入流后关闭它,防止内存泄漏。 - `IOException`需要捕获并处理,因为打开或读取文件时可能会出现错误。 - `getDrawableFromAsset()`或类似的辅助方法可以帮助简化代码,使其更...

Global site tag (gtag.js) - Google Analytics