12 changed files with 339 additions and 13 deletions
Binary file not shown.
@ -0,0 +1,29 @@ |
|||||
|
// 读取unimpsdk,由于不同版本unimp对App&Page覆写场景不同。
|
||||
|
// 此处页面级别监控暂不做统一管理
|
||||
|
import QDTracker from '../packages/QDTracker-app'; |
||||
|
const QDTMini = { |
||||
|
// 提供扩展性
|
||||
|
instance: QDTracker, |
||||
|
// 平台
|
||||
|
uniPlatform: 'mp', |
||||
|
// 小程序分类
|
||||
|
mpPltf: '', |
||||
|
// 提供初始化和配置参数
|
||||
|
init(opt) { |
||||
|
QDTMini.adaptGlobalApi(); |
||||
|
// 预留空间uni参数支持预加工
|
||||
|
// 初始化
|
||||
|
QDTracker.init({ |
||||
|
...opt, |
||||
|
mpPltf: QDTMini.mpPltf, |
||||
|
}); |
||||
|
}, |
||||
|
// 覆写小程序全局应用
|
||||
|
adaptGlobalApi() { |
||||
|
// #ifdef APP
|
||||
|
QDTMini.mpPltf = 'uni'; |
||||
|
// #endif
|
||||
|
}, |
||||
|
}; |
||||
|
|
||||
|
export default QDTMini; |
@ -0,0 +1,30 @@ |
|||||
|
const validMessage = '该平台缺少'; |
||||
|
const QDTracker = { |
||||
|
instance: null, |
||||
|
// 通用方法
|
||||
|
init: () => { |
||||
|
console.log(`QDT|uni|init ${validMessage} 初始化方法`); |
||||
|
}, |
||||
|
setAccountInfo: () => { |
||||
|
console.log(`QDT|uni|setAccountInfo ${validMessage} 设置自定义身份方法`); |
||||
|
}, |
||||
|
setCommonData: () => { |
||||
|
console.log(`QDT|uni|setCommonData ${validMessage} 设置自定义属性方法`); |
||||
|
}, |
||||
|
track: () => { |
||||
|
console.log(`QDT|uni|track ${validMessage} 自定义上报方法`); |
||||
|
}, |
||||
|
setAes: () => { |
||||
|
console.log(`QDT|uni|track ${validMessage} 自定义上报方法`); |
||||
|
}, |
||||
|
|
||||
|
// 小程序方法
|
||||
|
getIDs: () => { |
||||
|
console.log(`QDT|uni|getIDs ${validMessage} 获取用户账号信息`); |
||||
|
}, |
||||
|
addParamsToUrl: () => { |
||||
|
console.log(`QDT|uni|addParamsToUrl ${validMessage} 给路径地址添加参数`); |
||||
|
}, |
||||
|
}; |
||||
|
|
||||
|
export default QDTracker; |
@ -0,0 +1,77 @@ |
|||||
|
// 读取小程序原版sdk
|
||||
|
import QDTracker from '../packages/QDTracker-mp'; |
||||
|
const QDTMini = { |
||||
|
// 提供扩展性
|
||||
|
instance: QDTracker, |
||||
|
// 平台
|
||||
|
uniPlatform: 'mp', |
||||
|
// 小程序分类
|
||||
|
mpPltf: '', |
||||
|
// 提供初始化和配置参数
|
||||
|
init(opt) { |
||||
|
QDTMini.adaptGlobalApi(); |
||||
|
// 预留空间uni参数支持预加工
|
||||
|
// 初始化
|
||||
|
QDTracker.init({ |
||||
|
...opt, |
||||
|
mpPltf: QDTMini.mpPltf, |
||||
|
}); |
||||
|
}, |
||||
|
// 覆写小程序全局应用
|
||||
|
adaptGlobalApi() { |
||||
|
// 确定全局变量
|
||||
|
// #ifdef MP-WEIXIN || MP-ALIPAY || MP-BAIDU
|
||||
|
// #ifdef MP-WEIXIN
|
||||
|
QDTMini.mpPltf = 'wx'; |
||||
|
// #endif
|
||||
|
|
||||
|
// #ifdef MP-BAIDU
|
||||
|
QDTMini.mpPltf = 'smart'; |
||||
|
// #endif
|
||||
|
|
||||
|
// #ifdef MP-ALIPAY
|
||||
|
QDTMini.mpPltf = 'alipay'; |
||||
|
// #endif
|
||||
|
|
||||
|
// 通过额外绑定进行补充
|
||||
|
// console.log('onload');
|
||||
|
// #endif
|
||||
|
}, |
||||
|
// 覆写小程序页面应用
|
||||
|
adaptPageApi(pageOpt) { |
||||
|
QDTracker.startPageMonitor(pageOpt, QDTracker); |
||||
|
}, |
||||
|
// uni的页面page级别操作,专门用于页面级混入
|
||||
|
QDTMixin: { |
||||
|
methods: { |
||||
|
// 重写的方法,例如 onLoad
|
||||
|
customOnLoad(pageVm) { |
||||
|
// 在这里添加您的自定义逻辑
|
||||
|
// 1. 页面包含自定义组件时,需要额外注册(自定义组件嵌套同理)
|
||||
|
const traverseChildren = children => { |
||||
|
(children || []).forEach(child => { |
||||
|
QDTMini.adaptPageApi(child); |
||||
|
if (child.$children && child.$children.length) { |
||||
|
traverseChildren(child.$children); |
||||
|
} |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
traverseChildren(pageVm.$children); |
||||
|
|
||||
|
// 2. 注册主页面
|
||||
|
// 新版uniapp中,vue3下将$mp调整为$scope,为非向前兼容场景
|
||||
|
// 故此处根据vue版本不同,针对性做相应调整
|
||||
|
if (!pageVm.$mp.page) return; |
||||
|
QDTMini.adaptPageApi(pageVm.$mp.page); |
||||
|
}, |
||||
|
}, |
||||
|
// 使用 Vue 生命周期钩子来调用重写的方法
|
||||
|
onLoad() { |
||||
|
// 此处同步需要更新页面生命周期的注册
|
||||
|
this.customOnLoad(this); |
||||
|
}, |
||||
|
}, |
||||
|
}; |
||||
|
|
||||
|
export default QDTMini; |
@ -0,0 +1,23 @@ |
|||||
|
// 读取小程序原版sdk
|
||||
|
import QDTracker from '../packages/QDTracker-web'; |
||||
|
const QDTWeb = { |
||||
|
// 提供扩展性
|
||||
|
instance: QDTracker, |
||||
|
// 平台
|
||||
|
uniPlatform: 'web', |
||||
|
mpPltf: 'web', |
||||
|
// 提供初始化和配置参数
|
||||
|
init(opt) { |
||||
|
QDTWeb.adaptGlobalApi(); |
||||
|
// 预留空间uni参数支持预加工
|
||||
|
// 初始化
|
||||
|
return QDTracker.init(opt); |
||||
|
}, |
||||
|
// 覆写小程序全局应用
|
||||
|
adaptGlobalApi() { |
||||
|
// 确定全局变量
|
||||
|
}, |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
export default QDTWeb; |
@ -0,0 +1,75 @@ |
|||||
|
/* |
||||
|
* 2023.12.06 uniApp 兼容版本主入口 |
||||
|
* */ |
||||
|
// 兜底通用版本所有接口
|
||||
|
import blankAPI from './adapter/blankApi'; |
||||
|
|
||||
|
// 参照环境变量设置当前环境
|
||||
|
// #ifdef H5
|
||||
|
import adaptApi from './adapter/web' |
||||
|
// #endif
|
||||
|
|
||||
|
// #ifdef MP-WEIXIN || MP-BAIDU || MP-ALIPAY
|
||||
|
import adaptApi from './adapter/mp'; |
||||
|
// #endif
|
||||
|
|
||||
|
// #ifdef APP
|
||||
|
import adaptApi from './adapter/app'; |
||||
|
// #endif
|
||||
|
|
||||
|
let QDTracker = {}; |
||||
|
|
||||
|
const refactTrack = function (QDTracker, key) { |
||||
|
if (key === 'track') { |
||||
|
const oldTrack = QDTracker.track; |
||||
|
QDTracker.track = function () { |
||||
|
const arr = [].slice.call(arguments, 0); |
||||
|
|
||||
|
// 留有拓展uni后台感知逻辑
|
||||
|
return oldTrack.apply(QDTracker, arr); |
||||
|
}; |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
// 平台检测,目前支持H5 & MP & App
|
||||
|
if (typeof adaptApi === 'undefined') { |
||||
|
console.error('该平台尚未兼容敬请期待'); |
||||
|
QDTracker = blankAPI; |
||||
|
} else { |
||||
|
QDTracker = adaptApi; |
||||
|
// 单独抽离适配器init
|
||||
|
const initFn = QDTracker.init |
||||
|
/* |
||||
|
由于小程默认跨三种小程序平台,先遍历所有uni版本中需要暴露的api |
||||
|
1. 对应api中有适配版本,优先使用适配版本 |
||||
|
2. 没有适配版本,则默认兼容,从实例中直接获取默认接口 |
||||
|
3. web版本无需通过 |
||||
|
*/ |
||||
|
// #ifdef H5 || APP
|
||||
|
QDTracker = { |
||||
|
...QDTracker, |
||||
|
...adaptApi.instance, |
||||
|
init: initFn |
||||
|
}; |
||||
|
// #endif
|
||||
|
// #ifdef MP-WEIXIN || MP-BAIDU || MP-ALIPAY
|
||||
|
Object.keys(blankAPI).forEach((key) => { |
||||
|
if (!(key in adaptApi)) { |
||||
|
if (typeof adaptApi.instance === 'object' && typeof adaptApi.instance[key] === 'function') { |
||||
|
QDTracker[key] = adaptApi.instance[key].bind(adaptApi.instance); |
||||
|
} else { |
||||
|
QDTracker[key] = blankAPI[key].bind(blankAPI); |
||||
|
} |
||||
|
} |
||||
|
// track更新逻辑
|
||||
|
refactTrack(QDTracker, key); |
||||
|
}); |
||||
|
// #endif
|
||||
|
} |
||||
|
|
||||
|
const QDTMixin = adaptApi.QDTMixin; |
||||
|
|
||||
|
export { |
||||
|
QDTracker, |
||||
|
QDTMixin, |
||||
|
} |
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -0,0 +1 @@ |
|||||
|
const e={A:!0,BUTTON:!0,INPUT:!0,TEXTAREA:!0};let t={};const n=["MARK","STRONG","B","EM","I","U","ABBR","INS","DEL","S","SUP"];let r=["data-qidian-click"],o=[],a=!0;const c=window.TOLERANCE_TAGS||["BUTTON"],i=window.TOLERANCE_LEVEL||5;let s=!0,l=!1;function f(n){if(!n)return!1;const r=function(n){const r=(n.tagName||"").toUpperCase();return Object.assign({},e,t)[r]}(n);if(!0===r)return!0;if("object"==typeof r){let e=parseInt(r.max_level,10);isNaN(e)&&(e=1);return g(n)<=e}return!1}function u(e){if(!s||!e)return;if(!e.target)return;const{target:t}=e;let o=!1;t.tagName&&n.includes(t.tagName.toUpperCase())&&function(e){if(!e||!e.tagName||"DIV"!==e.tagName.toUpperCase())return!1;const{children:t}=e;if(!t.length)return!1;for(let e=0;e<t.length;e++){if(!t[e]||!t[e].tagName)return!1;if(!n.includes(t[e].tagName.toUpperCase()))return!1}return!0}(t.parentElement)&&(console.log("[QDTRACKER] div只包含样式标签"),!o&&m(QDTracker,d,t),o=!0),function(e){for(let t=0;t<r.length;t++)if(e.hasAttribute(r[t]))return!0;return!1}(t)&&(console.log("[QDTRACKER] track_attr 中自定义属性"),!o&&m(QDTracker,d,t),o=!0),f(t)&&(console.log("[QDTRACKER] interceptTags 中配置标签"),!o&&m(QDTracker,d,t),o=!0)}const m=function(e,n,r){if(!e.tracker||!e.tracker.track)return;const s=e.tracker.track;if("function"!=typeof s)return;const l=function(e){const n=e,r=n.id,s=n.innerText,l=n.getAttribute("name"),f=n.className,u=n.tagName?n.tagName.toLowerCase():"",m=function(e){const t=[];let n=e;function r(e){let t=1;for(;e.previousSibling;)1===(e=e.previousSibling).nodeType&&(t+=1);return t}for(;n&&n!==e.ownerDocument;){let e=n.tagName?n.tagName.toLowerCase():"";if(n.id)e+=`[@id='${n.id}']`;else if(n.className){let t="";t=n instanceof SVGElement?n.className.baseVal:n.className,e+=`[contains(@class, '${t.replace(/\s+/g," ")}')]`}else"html"!==e&&"body"!==e&&(e+=`[${r(n)}]`);t.unshift(e),n=n.parentNode}return`/${t.join("/")}`}(n),d=n.getBoundingClientRect().left+n.offsetWidth/2,g=n.getBoundingClientRect().top+n.offsetHeight/2,p={};o.forEach((e=>{const r=n.getAttribute(e);if(r)p[e]=r;else if(a){let r=n.parentNode,o=0;for(;r&&o<i;){const n=r.tagName.toUpperCase();if(c.includes(n)||t[n]){const t=r.getAttribute(e);if(t){p[e]=t;break}}r=r.parentNode,o+=1}}}));const N={element_id:r,element_content:s,element_name:l,element_class_name:f,element_type:u,element_path:m,touch_x:parseInt(d,10),touch_y:parseInt(g,10)};return Object.keys(p).forEach((e=>{p[e]&&(N[e]=p[e])})),N}(r);s("$WebClick",l)};let d="";function g(e,t=1){if(!e.children||0===e.children.length)return t;let n=t;for(const r of e.children){const e=g(r,t+1);n=Math.max(n,e)}return n}var p={apply:function(e,n){d=n;const c=((e.getCommonParams()||[])[0]||{}).heatmap||{},i="default"===c.clickmap;function s(e){try{e.contentWindow.document.removeEventListener("click",u,!0),e.contentWindow.document.addEventListener("click",u,!0)}catch(e){console.error("无法为 iframe 添加点击事件监听器:",e)}}if(a=!c.disabledToleracnce,t=c.collect_tags,c.track_attr&&(r=c.track_attr.concat(r)),c.tag_attr&&(o=c.tag_attr.concat(o)),l=c.iframeEnable,i&&(document.removeEventListener("click",u,!0),document.addEventListener("click",u,!0),l)){const e=document.getElementsByTagName("iframe");for(const t of e)s(t);new MutationObserver((e=>{for(const t of e)for(const e of t.addedNodes)e&&e.tagName&&"IFRAME"===e.tagName.toUpperCase()&&s(e)})).observe(document.body,{childList:!0,subtree:!0})}},startIntercepting:function(){s=!0},stopIntercepting:function(){s=!1},startInterceptingIframe:function(){l=!0},stopInterceptingIframe:function(){l=!1}};export{p as default}; |
Loading…
Reference in new issue