imweb-report
Version:
report to tdw width cgi;you can report one data at least;if you have some question;please contact herbertliu
198 lines (178 loc) • 7 kB
JavaScript
/**
* @author herbertliu
* @date 2014-04-12 version 0.1
* @description TDW数据上报,用来设置通过设置属性来进行上报,依赖report,jquery >= 1.7
* @example report.getReportAttr([id,][isCloseReport,][clear,]data) //获取上报的属性字符串
* params id {Boolean} 可选,如果不传id,可以通过返回值拿到id; 可以是选择器,用来表示当前字符串所对应的字符串cache id,唯一标识,用来多次改变某个属性的时候,保持其他属性不变
* params isCloseReport {Boolean} 可选,是否上报,上报开关,默认打开
* params clear {Boolean} 可选,是否清除历史属性,默认不清除
* params data {Object} 可选,上报的数据字段值,参见DC上报所需的字段,例如:{'uin':'','ts':'','opername':'','module':'','action':'','obj1':'','obj2':'','obj3':'','action':'','ver1':'','ver2':'','ver3':'','ver4':''},这里ts表示时间戳,不传使用服务器时间戳,objs表示用户ip,也不需要传
*
* @example report.setReportAttr(id, [isCloseReport,][clear,]data) //设置上报属性字符串,参数含义同@see getReportAttr
* @example <div report-tdw="uin=624005743&ts=ts&opername=opername" report-close="0">我要上报</div> report-tdw:需要上报的tdw属性值字符串,report-close:标识是否需要上报
*/
;(function(root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD loading: define module named "badjs" with dependencies and build it
define(['report','jquery'],factory);
} else {
// traditional browser loading: build badjs object with dependencies and inject it into window object
root['report'] = factory(root['report'],root['jQuery']);
}
})(this, function(report,$) {
report = report || {};
var _MATCH_SERIALIZES = /[^\|]+/ig,//以竖线隔开的一组上报值
_MATCH_SERIALIZE = /(^|&)?([^&=]*)=([^&]*)(&|$)/ig,//每一条上报支持
_MATCH_KEY_VALUE = /(?:^|&)([^&=]*)=([^&]*)(?:&|$)/i;//获取属性以及属性值
function parseReportAttr(str){
//解析节点数据
if(!str) return ;
var DATA_OBJ;
var _mathes = str.match(_MATCH_SERIALIZES);
if(_mathes){
DATA_OBJ = [];
for(var m=0,lens = _mathes.length; m < lens ; m++){
var _match = _mathes[m].match(_MATCH_SERIALIZE);
if(!_match) continue;
var _DATA_OBJ = {};
for(var i =0,len = _match.length; i < len; i++){
if(_match[i]){
var _key_match = _match[i].match(_MATCH_KEY_VALUE);
if(_key_match[1]){
//key and value
_DATA_OBJ[_key_match[1]] = _key_match[2] || '';
}
}
}
DATA_OBJ.push(_DATA_OBJ);
}
}
return DATA_OBJ;
}
function decodeReportAttr(DATA_OBJ){
if(!DATA_OBJ) return;
var DATA_OBJ_STRS = [];
for(var j =0,ls = DATA_OBJ.length; j < ls ;j++){
var DATA_OBJ_STR = [];
for(var i in DATA_OBJ){
if(!DATA_OBJ[i] && DATA_OBJ[i] !== 0) continue;
DATA_OBJ_STR.push(i + '=' + DATA_OBJ[i]);
}
DATA_OBJ_STRS.push(DATA_OBJ_STR.join('&'));
}
return DATA_OBJ_STRS.join('|');
}
var _document = $(document);//全局的document节点
if(_document.on){
//上报属性
$(document).on('click','*[report-tdw]',function(e,param){
var _target = $(this)//当前点击源
,report_tdw = _target.attr('report-tdw')
,report_close = _target.attr('report-close');//获取上报属性
report_close = report_close?+report_close:0;
if(report_tdw){
//需要进行上报
var _DATA_OBJ;
if(!(_DATA_OBJ = _target.data('_DATA_OBJ'))){
_DATA_OBJ = parseReportAttr(report_tdw) || [];
}
if(param){
//通过trigger触发事件,修改上报参数值,支持trigger修改该参数值,param格式同@see getReportAttr
if(param.isCloseReport){
report_close = param.isCloseReport;
_target.attr('report-close',+(!!param.isCloseReport));//设置是否上报属性值
}
if(param.data){
for(var i in param.data){
var OBJ;
for(var j = 0 , ls = _DATA_OBJ.length; j < ls ; j++){
OBJ = _DATA_OBJ[j] || (_DATA_OBJ[j] = {});
OBJ[i] = param.data[i];//赋值替换
}
}
}
}
_target.data('_DATA_OBJ',_DATA_OBJ);//保存数据
//console.log(_DATA_OBJ);
if(!report_close){//需要上报
report.tdw && report.tdw(_DATA_OBJ);//进行数据上报
}
}
})
}
/**
* 设置上报属性
* @params id {Boolean} 可选,如果不传id,可以通过返回值拿到id; 可以是选择器,用来表示当前字符串所对应的字符串cache id,唯一标识,用来多次改变某个属性的时候,保持其他属性不变
* @params isCloseReport {Boolean} 可选,是否上报,上报开关,默认打开
* @params clear {Boolean} 可选,是否清除历史属性,默认不清除
* @params data {Object}可选,上报的数据字段值,参见DC上报所需的字段,例如:{'uin':'','ts':'','opername':'','module':'','action':'','obj1':'','obj2':'','obj3':'','action':'','ver1':'','ver2':'','ver3':'','ver4':''},这里ts表示时间戳,不传使用服务器时间戳,objs表示用户ip,也不需要传
*/
function setReportAttr(id, isCloseReport , clear , data){
switch(arguments.length){
case 0:
throw 'Need target id and data';
return this;
case 1:
isCloseReport = false;
clear = false;
data = {};
break;
case 2:
data = isCloseReport || {};
isCloseReport = false;
clear = false;
break;
case 3:
data = clear || {};
clear = false;
break;
}
var $id = $(id);
$id.attr('report-close',+(!!isCloseReport));
if($id){
//默认保留属性
if(!clear){
var _DATA_OBJ = [];
if(!(_DATA_OBJ = $id.data('_DATA_OBJ'))){
_DATA_OBJ = parseReportAttr($id.attr('report-tdw')) || [];
}
for(var i in data){
var OBJ;
for(var j = 0 , ls = _DATA_OBJ.length; j < ls ; j++){
OBJ = _DATA_OBJ[j] || (_DATA_OBJ[j] = {});
OBJ[i] = data[i];
}
}
data = _DATA_OBJ;
}
var _DATA_OBJ_STR = decodeReportAttr(data);
if(!_DATA_OBJ_STR) return this;
$id.attr('report-tdw',_DATA_OBJ_STR);//赋值
$id.data('_DATA_OBJ',data);
}
return this;
}
report.setReportAttr = setReportAttr;
//TODO 预留接口
function getReportAttr(id, isCloseReport , clear ,data){
switch(arguments.length){
case 0:
throw 'Need target id';
return this;
case 1:
break;
case 2:
case 3:
this.setReportAttr.apply(this,arguments);
break;
}
var $id = $(id);
var _DATA_OBJ = {};
if(!(_DATA_OBJ = $id.data('_DATA_OBJ'))){
_DATA_OBJ = parseReportAttr($id.attr('report-tdw')) || {};
}
return _DATA_OBJ;
}
report.getReportAttr = getReportAttr;
return report;
});