最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何用JS追蹤用戶

 更新時間:2021年05月17日 08:43:40   作者:阮一峰  
本文介紹如何編寫JavaScript腳本,將用戶數(shù)據(jù)發(fā)回服務(wù)器。對此感興趣的同學(xué),可以參考下

一、同步 AJAX

數(shù)據(jù)發(fā)回服務(wù)器的常見做法是,將收集好的用戶數(shù)據(jù),放在unload事件里面,用 AJAX 請求發(fā)回服務(wù)器。

但是,異步 AJAX 在unload事件里面不一定能成功,因為網(wǎng)頁已經(jīng)處于卸載中,瀏覽器可能發(fā)送,也可能不發(fā)送。所以,要改成同步 AJAX 請求。

window.addEventListener('unload', function (event) {
  let xhr = new XMLHttpRequest();
  xhr.open('post', '/log', false);
  xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  xhr.send('foo=bar');
});

上面代碼中,xhr.open()方法的第三個參數(shù)是false,表示同步請求。

這種方法最大的問題在于,瀏覽器逐步將不允許在主線程上面,使用同步 AJAX。所以,上面代碼實際上不能用。

二、異步 AJAX

異步 AJAX 其實是能用的。前提是unload事件里面,必須有一些很耗時的同步操作。這樣就能留出足夠的時間,保證異步 AJAX 能夠發(fā)送成功。

function log() {
  let xhr = new XMLHttpRequest();
  xhr.open('post', '/log', true);
  xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  xhr.send('foo=bar');
}

window.addEventListener('unload', function(event) {
  log();

  // a time-consuming operation
  for (let i = 1; i < 10000; i++) {
    for (let m = 1; m < 10000; m++) { continue; }
  }
});

上面代碼中,強制執(zhí)行了一次雙重循環(huán),拖長了unload事件的執(zhí)行時間,導(dǎo)致異步 AJAX 能夠發(fā)送成功。

三、追蹤用戶點擊

setTimeout也能拖延頁面卸載,保證異步請求發(fā)送成功。下面是一個例子,追蹤用戶點擊。

// HTML 代碼如下
// <a id="target"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >click</a>
const clickTime = 350;
const theLink = document.getElementById('target');

function log() {
  let xhr = new XMLHttpRequest();
  xhr.open('post', '/log', true);
  xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  xhr.send('foo=bar');
}

theLink.addEventListener('click', function (event) {
  event.preventDefault();
  log();

  setTimeout(function () {
    window.location.href = theLink.getAttribute('href');
  }, clickTime);
});

上面代碼使用setTimeout,拖延了350毫秒,才讓頁面跳轉(zhuǎn),因此使得異步 AJAX 有時間發(fā)出。

四、反彈追蹤

追蹤用戶點擊,還可以使用反彈追蹤(bounce tracking)。

所謂"反彈追蹤",就是網(wǎng)頁跳轉(zhuǎn)時,先跳到一個或多個中間網(wǎng)址,以便收集信息,然后再跳轉(zhuǎn)到原來的目標網(wǎng)址。

// HTML 代碼如下
// <a id="target"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >click</a>
const theLink = document.getElementById('target');

theLink.addEventListener('click', function (event) {
  event.preventDefault();
  window.location.href = '/jump?url=' + 
    encodeURIComponent(theLink.getAttribute('href'));
});

上面代碼中,用戶點擊的時候,會強制跳到一個中間網(wǎng)址,將信息攜帶過去,處理完畢以后,再跳到原始的目標網(wǎng)址。

谷歌和百度現(xiàn)在都是這樣做,點擊搜索結(jié)果時,會反彈多次,才跳到目標網(wǎng)址。

五、Beacon API

上面這些做法,都會延緩網(wǎng)頁卸載,嚴重影響用戶體驗。

為了解決網(wǎng)頁卸載時,異步請求無法成功的問題,瀏覽器特別實現(xiàn)了一個 Beacon API,允許異步請求脫離當前主線程,放到瀏覽器進程里面發(fā)出,這樣可以保證一定能發(fā)出。

window.addEventListener('unload', function (event) {
  navigator.sendBeacon('/log', 'foo=bar');
});

上面代碼中,navigator.sendBeacon()方法可以保證,異步請求一定會發(fā)出。第一個參數(shù)是請求的網(wǎng)址,第二個參數(shù)是發(fā)送的數(shù)據(jù)。

注意,Beacon API 發(fā)出的是 POST 請求。

六、ping 屬性

HTML 的<a>標簽有一個ping屬性,只要用戶點擊,就會向該屬性指定的網(wǎng)址,發(fā)出一個 POST 請求。

<a  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  ping="/log?foo=bar">
  click
</a>

上面代碼中,用戶點擊跳轉(zhuǎn)時,會向/log這個網(wǎng)址發(fā)一個 POST 請求。

ping屬性無法指定數(shù)據(jù)體,似乎只能通過 URL 的查詢字符串攜帶信息。

以上就是如何用JS追蹤用戶的詳細內(nèi)容,更多關(guān)于用JS追蹤用戶的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • js 創(chuàng)建快捷方式的代碼(fso)

    js 創(chuàng)建快捷方式的代碼(fso)

    js 創(chuàng)建快捷方式的代碼,這個是在本地運行的需要確認的,需要的朋友可以參考下。
    2010-11-11
  • JS實現(xiàn)水平移動與垂直移動動畫

    JS實現(xiàn)水平移動與垂直移動動畫

    這篇文章主要為大家詳細介紹了JS實現(xiàn)水平移動與垂直移動動畫,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • Sort()函數(shù)的多種用法

    Sort()函數(shù)的多種用法

    sort() 方法用于對數(shù)組的元素進行排序。接下來通過本文給大家介紹Sort()函數(shù)的多種用法,對sort函數(shù)的用法相關(guān)知識感興趣的朋友一起學(xué)習(xí)
    2016-03-03
  • 使用snowfall.jquery.js實現(xiàn)愛心滿屏飛的效果

    使用snowfall.jquery.js實現(xiàn)愛心滿屏飛的效果

    這篇文章主要介紹了使用snowfall.jquery.js實現(xiàn)愛心滿屏飛的效果的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • js從Cookies里面取值的簡單實現(xiàn)

    js從Cookies里面取值的簡單實現(xiàn)

    遇到一個Js從Cookies里面取值的需求,Js貌似沒有現(xiàn)成的方法可以指定Key值獲取Cookie里面對應(yīng)的值,簡單實現(xiàn)如下
    2014-06-06
  • Next.js入門使用教程

    Next.js入門使用教程

    Next.js 是一個輕量級的 React 服務(wù)端渲染應(yīng)用框架。文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • JavaScript ES6中CLASS的使用詳解

    JavaScript ES6中CLASS的使用詳解

    class是es6引入的最重要特性之一。在沒有class之前,我們只能通過原型鏈來模擬類。這篇文章我們將詳細的介紹關(guān)于ES6中CLASS的使用,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-11-11
  • 原生js編寫貪吃蛇小游戲

    原生js編寫貪吃蛇小游戲

    這篇文章主要為大家詳細介紹了原生js編寫貪吃蛇小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • Three.js的使用及繪制基礎(chǔ)3D圖形詳解

    Three.js的使用及繪制基礎(chǔ)3D圖形詳解

    這篇文章主要介紹了Three.js的使用及繪制基礎(chǔ)3D圖形的相關(guān)資料,文中介紹的非常詳細,對大家學(xué)習(xí)或者使用three.js具有一定的參考價值,需要的朋友們下面來一起看看吧。
    2017-04-04
  • JS實現(xiàn)公告上線滾動效果

    JS實現(xiàn)公告上線滾動效果

    這篇文章主要為大家詳細介紹了JS實現(xiàn)公告上線滾動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-01-01

最新評論

体育| 盐边县| 浦江县| 黄骅市| 紫云| 青岛市| 河西区| 微山县| 邓州市| 闽清县| 上饶市| 承德市| 溧阳市| 阜南县| 通化市| 射阳县| 财经| 安庆市| 宁强县| 松江区| 玛多县| 吉林市| 蒙阴县| 红河县| 庆阳市| 宜君县| 宿州市| 龙泉市| 吉木萨尔县| 海安县| 铅山县| 高淳县| 时尚| 朔州市| 阿巴嘎旗| 哈尔滨市| 英德市| 青阳县| 同德县| 灌阳县| 井陉县|