JS實現點擊事件統計的簡單一實例_javascript技巧

來源:互聯網
上載者:User

JS實現網網站擊事件的統計功能。

點擊事件上報,分為立即上報和延時上報,延時上報通過cookie儲存。

一、配置參數,主要用於定義上報的一些配置資訊。通過在外部定義_clickc對象重設參數。

參數名稱       類型          預設值             說明
    selector:      string        '_click_rp'        點擊觸發的選取器,支援ID、class
    prefix:        string        '_rp_'             需要上報的參數屬性名稱首碼,如_rp_type,表示要上報type參數的值
    cookie:        string        '_click_rp'        延遲上報時的cookie名稱
    domain:        string        '.skye.com'    cookie儲存的網域名稱(可以通過使用的網站來獲得)
    delay:         boolean       false              是否延遲上報,延遲上報通過cookie實現
    delay_attr:    string        _delay             標籤中指定是否延遲上報,優先順序最高,ture延時,其他不延時。 

二、外部參數,主要用於定義上報的參數。通過在外部定義_clickq數組增加參數。

三、標籤參數,使用首碼_rp_定義,上報的時候會將所有_rp_開頭的參數上報。參數的格式分為兩種,1種純字元,1中回呼函數。

<a class="_click_rp" href="" _rp_a="aa" _rp_b="bb">a</a>,表示上報時的參數為a=aa&b=bb

1,純字元,直接定義字元,表示需要上傳參數的值。

2,回呼函數,以javascript:開頭。只需定義函數體,在函數體中返回參數的值。

如,<a href="/qa_question/press.html" id="ques_search_btn" class="_click_rp" _rp_act="javascript:if($('#ques_search_btn').text()=='提問'){return 'act_qa_ques';}else{return 'act_search';}"><span>提問</span></a>

四、延時上報,分為三種優先順序,如下由高到低

1,標籤屬性_delay是否指定為true,如果是表示延遲上報。

2,是否為特定標籤,如a標籤本視窗開啟(target等於"_self"或空),submit按鈕。

3,配置參數中指定的delay參數。

五、支援:需要依賴jQuery外掛程式。

六、使用案列

1,引入JS

var _clickq = _clickq || [];_clickq.push(['param1', 'value1']);var _clickc = {selector:'_click_rps'};(function() { var click = document.createElement("script"); click.src = "//cache.skye.com/js/lib/stat/click.js"; var s = document.getElementsByTagName("script")[0];  s.parentNode.insertBefore(click, s);})();

2,定義選取器和上傳參數

如,<a class="_click_rp" href="" _rp_a="aa" _rp_b="bb">a</a>

(function () {  // 預設參數  var options = {    selector: '_click_rp',    prefix: '_rp_',    cookie: '_click_rp',    domain: '.skye.com',    delay: false,    delay_attr: '_delay'  };  var params = {};  var _params = {};  var clickObj = null; // 當前點擊對象  // 獲得對象  var getObject = function(selector) {    if (typeof(selector) == 'object') {      return selector;    } else {      var obj = $('#'+selector);      if (obj.length) {        return obj;      }      obj = $('.'+selector);      if (obj.length) {        return obj;      }      return null;    }  }  // 獲得選取器  var getSelector = function(selector) {    return '#' + selector + ',.' + selector;  }  // 操作cookie函數  var getCookie = function(c_name) {    if (document.cookie.length>0) {      c_start = document.cookie.indexOf(c_name + "=")      if (c_start!=-1) {         c_start=c_start + c_name.length+1         c_end=document.cookie.indexOf(";",c_start)        if (c_end==-1) c_end=document.cookie.length        return unescape(document.cookie.substring(c_start,c_end))      }    }    return "";  }  var setCookie = function(c_name,value,expiredays,path,domain) {    var exdate = new Date()    exdate.setDate(exdate.getDate()+expiredays)    var cookie = c_name+ "=" +escape(value)+((expiredays==null) ? "" : ";expires="+exdate.toGMTString());    if (path) cookie = cookie + ";path=" + path;    if (domain) cookie = cookie + ";domain=" + domain;    document.cookie = cookie;  }  // 獲得標籤中的參數  var getAttrParam = function() {    if ( clickObj ) {      var attrs = clickObj.get(0).attributes;      $.each(attrs, function(i) {        var name = attrs[i].name;        if ( name.indexOf(options.prefix) == 0 ) {          name = name.replace(options.prefix, '');          var value = attrs[i].value;          if ( value.indexOf('javascript:') == 0 ) {            // 執行js獲得參數值            value = value.replace('javascript:', '');            eval('var valFun = function() {'+ value +'};');            value = valFun();          }          params[name] = value;        }      });    }  }  // 獲得預設參數  var getDefaultParam = function() {    if(document) {      params.url = document.URL || '';      params.referrer = document.referrer || '';    }    // 時間    var date = new Date();    params.ltime = date.getTime() / 1000;    // 時間戳記    params.t = date.getTime();  }  var getParamStr = function() {    getAttrParam();    getDefaultParam();    // 合并配置參數    for(var key in _params) {      params[key] = _params[key];    }    //拼接參數串    var args = '';     for(var i in params) {      if(args != '') {        args += '&';      }        args += i + '=' + encodeURIComponent(params[i]);    }    return args;  }  // 清空參數  var clearParam = function() {    params = {};  }  // 是否立即上報,如果跳轉頁面,則計入延時上報  var getIsDelay = function() {    if ( clickObj ) {      // 有具體指定      if ( clickObj.attr(options.delay_attr) == 'true' ) {        return true;      }      // 特定標籤      // a標籤      if ( clickObj.is('a') ) {        if ( clickObj.attr('href').indexOf('javascript:') == 0 ) {          return false;        }        if ( clickObj.attr('target') && clickObj.attr('target') != '_self' ) {          return false;        }        return true;      }      // submit按鈕      if ( (clickObj.is('input') || clickObj.is('button')) && clickObj.attr('type') == 'submit' ) {        return true;      }    }    return options.delay;  }    // 加入cookie,下次上報  var setDelayCookie = function() {    // 獲得參數    var args = getParamStr();    var cookieStr = getCookie(options.cookie);    if ( cookieStr == '' ) {      cookieStr = args;    } else {      cookieStr = cookieStr + ',' + args;    }    setCookie(options.cookie, cookieStr, 7, '/', options.domain);    clearParam();  }  // 上報cookie  var rpCookie = function() {    // 獲得cookie,迴圈操作    var cookieStr = getCookie(options.cookie);    if ( cookieStr ) {      var cookieArr = cookieStr.split(',');      for(var key in cookieArr){         rpClick(cookieArr[key]);      }       setCookie(options.cookie, '', 7, '/', options.domain);    }  }  // 上報  var rpClick = function(args) {    if ( args == undefined ) {      args = getParamStr();    }    var img = new Image(1, 1);    img.src = 'http://data.skye.com/stat/click?' + args;    console.info(img.src);    clearParam();  }  // js上報函數  var rpComm = function(obj) {    console.info('click');    clickObj = obj;    if ( getIsDelay() ) {      setDelayCookie();    } else {      rpClick();    }  }  //解析外部配置  if(_clickc) {    for(var i in _clickc) {      options[i] = _clickc[i];    }    }    //解析外部參數  if(_clickq) {    for(var i in _clickq) {      _params[_clickq[i][0]] = _clickq[i][1];    }  }  // 提供外部js函數  $.rpComm = function(obj) {    rpComm(obj);  }  $.fn.rpComm = function() {    rpComm($(this));  }  // cookie中的上報  rpCookie();  // 初始化資訊  var _time = new Date().valueOf();  var selector = getSelector(options.selector);  $('body').delegate(selector,'click',function() {    // 連續點擊限制    if(new Date().valueOf() - _time < 300) {      return;    }    _time = new Date().valueOf();    rpComm($(this));  });})();

以上這篇JS實現點擊事件統計的簡單一實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援雲棲社區。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.