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

如何用JS追蹤用戶(hù)

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

一、同步 AJAX

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

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

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()方法的第三個(gè)參數(shù)是false,表示同步請(qǐng)求。

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

二、異步 AJAX

異步 AJAX 其實(shí)是能用的。前提是unload事件里面,必須有一些很耗時(shí)的同步操作。這樣就能留出足夠的時(shí)間,保證異步 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; }
  }
});

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

三、追蹤用戶(hù)點(diǎn)擊

setTimeout也能拖延頁(yè)面卸載,保證異步請(qǐng)求發(fā)送成功。下面是一個(gè)例子,追蹤用戶(hù)點(diǎn)擊。

// 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毫秒,才讓頁(yè)面跳轉(zhuǎn),因此使得異步 AJAX 有時(shí)間發(fā)出。

四、反彈追蹤

追蹤用戶(hù)點(diǎn)擊,還可以使用反彈追蹤(bounce tracking)。

所謂"反彈追蹤",就是網(wǎng)頁(yè)跳轉(zhuǎn)時(shí),先跳到一個(gè)或多個(gè)中間網(wǎng)址,以便收集信息,然后再跳轉(zhuǎn)到原來(lái)的目標(biāo)網(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'));
});

上面代碼中,用戶(hù)點(diǎn)擊的時(shí)候,會(huì)強(qiáng)制跳到一個(gè)中間網(wǎng)址,將信息攜帶過(guò)去,處理完畢以后,再跳到原始的目標(biāo)網(wǎng)址。

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

五、Beacon API

上面這些做法,都會(huì)延緩網(wǎng)頁(yè)卸載,嚴(yán)重影響用戶(hù)體驗(yàn)。

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

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

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

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

六、ping 屬性

HTML 的<a>標(biāo)簽有一個(gè)ping屬性,只要用戶(hù)點(diǎn)擊,就會(huì)向該屬性指定的網(wǎng)址,發(fā)出一個(gè) POST 請(qǐng)求。

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

上面代碼中,用戶(hù)點(diǎn)擊跳轉(zhuǎn)時(shí),會(huì)向/log這個(gè)網(wǎng)址發(fā)一個(gè) POST 請(qǐng)求。

ping屬性無(wú)法指定數(shù)據(jù)體,似乎只能通過(guò) URL 的查詢(xún)字符串?dāng)y帶信息。

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

相關(guān)文章

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

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

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

    JS實(shí)現(xiàn)水平移動(dòng)與垂直移動(dòng)動(dòng)畫(huà)

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

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

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

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

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

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

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

    Next.js入門(mén)使用教程

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

    JavaScript ES6中CLASS的使用詳解

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

    原生js編寫(xiě)貪吃蛇小游戲

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

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

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

    JS實(shí)現(xiàn)公告上線滾動(dòng)效果

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

最新評(píng)論

开封县| 松江区| 揭东县| 大新县| 克拉玛依市| 吴忠市| 沽源县| 盐山县| 交城县| 尚义县| 塘沽区| 宣武区| 定结县| 乌苏市| 福泉市| 普安县| 马龙县| 武鸣县| 郯城县| 新晃| 六盘水市| 彩票| 博爱县| 南昌县| 牙克石市| 临沧市| 乾安县| 海淀区| 鹤山市| 太仆寺旗| 雅江县| 峨边| 垦利县| 科尔| 政和县| 手游| 临澧县| 安塞县| 岫岩| 厦门市| 广南县|