<...">
,需要通过父级DOM结构来判断
*/
var trackActionPhone = function (node) {
var nodeInnerText = node.innerText || '';
if (!limitRegLength(nodeInnerText)) return;
var nodeText = trimText(nodeInnerText);
if (nodeText.length < 5 || nodeText.length > 20) return false;
var type =
arguments.length > 1 && arguments[1] !== undefined
? arguments[1]
: 'click';
var str = trimText(node.href || node.innerHTML || '');
if (phoneReg.test(str) && numUseReg.test(str)) {
_paq.push(['trackEvent', type, 'phone', nodeText]);
return true;
}
/** 排查父级嵌套非标签场景,并且对dom的正则校验做一个性能兜底,通过控制innerText的长度,来确保正则的性能 */
var fatherText = trimText(node.parentNode.innerText || '');
if (fatherText.length < 5 || fatherText.length > 20) return false;
var fatherDom = trimText(node.parentNode.innerHTML || '');
if (phoneReg.test(fatherDom) && numUseReg.test(fatherDom)) {
_paq.push(['trackEvent', type, 'phone', nodeText]);
return true;
}
return false;
};
window.addEventListener('click', function (e) {
var node = e.target;
/** 社媒点击 */
var appName = '';
var getAppAriaLabel =
node.ariaLabel || node.parentNode.ariaLabel || '';
if (mediaList.includes(getAppAriaLabel.toLowerCase())) {
appName = getAppAriaLabel;
}
if (
!appName &&
node.nodeName &&
node.nodeName.toLowerCase() === 'a'
) {
appName = getMediaName(node.href) || getMediaName(node.alt);
}
if (
!appName &&
node.nodeName &&
node.nodeName.toLowerCase() === 'img'
) {
appName = getMediaName(node.alt) || getMediaName(node.src);
}
if (
!appName &&
node.nodeName &&
node.nodeName.toLowerCase() === 'i'
) {
appName = getMediaName(node.className);
}
if (appName) {
_paq.push(['trackEvent', 'click', 'contactApp', appName]);
return;
}
/** 联系方式点击 */
if (trackActionPhone(node, 'click')) return;
if (node.nodeName && node.nodeName.toLowerCase() === 'a') {
var val = node.href;
if (!limitRegLength(val)) return;
if (emailReg.test(val)) {
_paq.push(['trackEvent', 'click', 'email', val]);
return;
}
}
if (node.nodeName && node.nodeName.toLowerCase() === 'i') {
var val = node.className;
var content = node.parentNode.href || '';
if (val.includes('email')) {
_paq.push(['trackEvent', 'click', 'email', content]);
return;
}
}
var nodeChildList = node.childNodes;
for (var i = 0; i < nodeChildList.length; i++) {
if (nodeChildList[i].nodeType !== 3) continue;
var val = nodeChildList[i].textContent.replace(/\s?:?/g, '');
if (!limitRegLength(val)) continue;
if (emailReg.test(val)) {
_paq.push(['trackEvent', 'click', 'email', val]);
return;
}
}
trackNumberData(node);
});
window.addEventListener('copy', function (e) {
if (trackActionPhone(e.target, 'copy')) return;
var text = e.target.textContent;
if (!text) return;
var val = text.replace(/\s:?/g, '');
if (!limitRegLength(val)) return;
if (emailReg.test(val)) {
_paq.push(['trackEvent', 'copy', 'email', val]);
return;
}
trackNumberData(e.target);
});
}
trackContactInit();
/**
* 基于custom_inquiry_form.js 以及 form.js 对于询盘表单提交的实现,来反推询盘表单的input标签触发,用来收集意向客户
* 1. 缓存的KEY:TRACK_INPUT_ID_MTM_00;
* 2. 缓存策略 - lockTrackInput:单个页面内,10分钟内,不重复上报
*/
function trackActionInput() {
const CACHE_KEY = 'TRACK_INPUT_ID_MTM_00';
const pathName = window.location.hostname + window.location.pathname;
var lockTrackInput = function () {
try {
const lastCacheData = localStorage.getItem(CACHE_KEY);
if (!lastCacheData) return false;
const cacheData = JSON.parse(lastCacheData);
const cacheTime = cacheData[pathName];
if (!cacheTime) return false;
return Date.now() - cacheTime < 1000 * 60 * 10; // 10分钟内,不重复上报
} catch (error) {
console.error('lockTrackInput Error', error);
return false;
}
};
var setInputTrackId = function () {
try {
const curCacheData = localStorage.getItem(CACHE_KEY);
if (curCacheData) {
const cacheData = JSON.parse(curCacheData);
cacheData[pathName] = Date.now();
localStorage.setItem(CACHE_KEY, JSON.stringify(cacheData));
return;
}
const cacheData = {
[pathName]: Date.now(),
};
localStorage.setItem(CACHE_KEY, JSON.stringify(cacheData));
} catch (error) {
console.error('setInputTrackId Error', error);
}
};
var getInputDom = function (initDom) {
var ele = initDom;
while (ele) {
/**
* isWebSiteForm 是站点的表单
* isChatWindowForm 是聊天窗口的表单
*/
/** 旧模板表单 */
var isWebSiteForm = !!(
/crm-form/i.test(ele.className) && ele.querySelector('form')
);
/** 1:新模板自定义表单、2:Get a Quote 弹框表单 */
var isWebSiteFormNew = !!(
/inquiry/i.test(ele.className) && ele.querySelector('form')
);
if (isWebSiteForm || isWebSiteFormNew) {
_paq.push(['trackEvent', 'formInquiry', 'formInput', 'page']);
setInputTrackId();
return;
}
/** Mkt会话触达-聊天弹框的表单输入: MKT由于是iframe嵌入,所以MKT的上报,会单独写到MKT-form代码上 */
var isInquiryChatForm = !!(
/comp-form/i.test(ele.className) && ele.querySelector('form')
);
if (isInquiryChatForm) {
_paq.push(['trackEvent', 'formInquiry', 'formInput', 'chat']);
setInputTrackId();
return;
}
/** 向上查找父节点 */
ele = ele.parentNode;
}
};
function initInputListener() {
var inputUseDebounce = function (fn, delay) {
var timer = null;
var that = this;
return function () {
var args = Array.prototype.slice.call(arguments);
if (timer) clearTimeout(timer);
timer = setTimeout(function () {
fn.apply(that, args);
}, delay);
};
};
var optimizeGetInputDom = inputUseDebounce(getInputDom, 300);
window.addEventListener('input', function (e) {
/** 如果已经上报过,则不再上报 */
if (lockTrackInput()) return;
optimizeGetInputDom(e.target);
});
}
try {
initInputListener();
} catch (error) {
console.log('initInputListener Error', error);
}
}
trackActionInput();
}
/** 第三方消息上报:目前主要是针对全点托管会话;在msgCollect/index.js中调试,访问test.html */
function thirdMsgCollect() {
/** 先检测是否是stayReal托管:如果stayReal脚本都没有,那么说明当前站点未开启stayReal会话托管 */
const scriptList = Array.prototype.slice.call(
document.querySelectorAll('script'),
);
const checkStayReal = () =>
!!scriptList.find((s) => s.src.includes('stayreal.xiaoman.cn'));
if (!checkStayReal()) return;
/** 缓存当前消息队列的最后一条消息id */
const CACHE_KEY = 'CACHE_KEY_MONITOR';
const setCache = (msgIndex) => {
/** 对缓存KEY进行base64转码处理 */
const cacheMsgIndex = btoa(msgIndex);
localStorage.setItem(CACHE_KEY, cacheMsgIndex);
};
const getCache = () => {
const cacheMsgIndex = localStorage.getItem(CACHE_KEY);
if (cacheMsgIndex) return Number(atob(cacheMsgIndex));
return -1;
};
/** 拉取最新msg列表 */
const pullMsgList = () => {
const msgEleList = Array.prototype.slice.call(
document.querySelectorAll('#chat-list li'),
);
const msgIds = [];
const msgMap = msgEleList.reduce((acc, item) => {
const sendTime = item
.querySelector('.message-data-time')
.textContent.trim();
const sendContent = item.querySelector('.message').textContent.trim();
/** msg带有class:other-message的是访客消息,my-message的是客服消息 */
const isOtherMessage = item
.querySelector('.message')
.classList.contains('other-message');
const msgId = item.querySelector('.message').getAttribute('id');
const msgItemData = {
msgId,
user: isOtherMessage ? 'visitor' : 'official',
time: sendTime,
content: sendContent,
};
msgIds.push(msgId);
acc[msgId] = msgItemData;
return acc;
}, {});
return {
ids: msgIds,
dataMap: msgMap,
};
};
/** 加密并上传消息数据 */
let ENCRYPT_KEY = 'de29f1aab63ab033';
let ENCRYPT_IV = 'b8d2badf875e76ac';
const baseUrl = 'https://cms.xiaoman.cn';
// var getEncryptConfig = function () {
// const url = baseUrl + '/shop-api/innerApi/getKeyIv'
// $.get(
// url,
// function (result) {
// console.log('result', result)
// if (Number(result.code) === 0 && result.data.key && result.data.iv) {
// ENCRYPT_KEY = result.data.key
// ENCRYPT_IV = result.data.iv
// uploadMsgData()
// } else {
// /** 如果获取失败,则重试 */
// setTimeout(() => {
// getEncryptConfig()
// }, 1000)
// }
// },
// 'json'
// )
// }
// getEncryptConfig()
const encryptMsg = function (msgData) {
const enc = new TextEncoder();
// 转字节
const keyBytes = enc.encode(ENCRYPT_KEY);
const ivBytes = enc.encode(ENCRYPT_IV);
const plainBytes = enc.encode(msgData);
// 导入密钥并加密
return crypto.subtle
.importKey('raw', keyBytes, { name: 'AES-CBC' }, false, ['encrypt'])
.then(function (cryptoKey) {
return crypto.subtle.encrypt(
{ name: 'AES-CBC', iv: ivBytes },
cryptoKey,
plainBytes,
);
})
.then(function (encryptedBuffer) {
// 转 base64 返回
return btoa(
String.fromCharCode(...new Uint8Array(encryptedBuffer)),
);
})
.catch((err) => {
return Promise.reject(err);
});
};
let uploadFlag = false;
const uploadMsgData = function () {
if (uploadFlag) return;
uploadFlag = true;
const { ids, dataMap } = pullMsgList();
let cacheMsgIndex = getCache();
const msgLen = ids.length;
if (!msgLen) {
// 消息DOM未挂载 || 消息DOM已挂载,但是消息列表为空
uploadFlag = false;
return;
}
if (msgLen - 1 < cacheMsgIndex) {
/** 针对站点挂后台一段时间,消息列表会自动塞入重复消息,导致消息有重复,刷新后又重置回正常消息列表,所以这里需要更新锚点下标 */
cacheMsgIndex = msgLen - 1;
setCache(cacheMsgIndex);
uploadFlag = false;
return;
}
if (msgLen - 1 === cacheMsgIndex) {
// 缓存的最后一次发送的消息ID是最后一条(说明当前消息均已经上报),则不跳过本地上报
uploadFlag = false;
return;
}
const currentMsgIds = ids.slice(cacheMsgIndex + 1, msgLen);
const currentMsgData = currentMsgIds.map((id) => dataMap[id]);
const mtmId = window.matomo_site_id_cookie_key || ''; // 获取mtm会话id
const msgBody = {
mtmId,
curl: window.location.href,
msgList: currentMsgData,
};
const msgBodyStr = JSON.stringify(msgBody);
encryptMsg(msgBodyStr)
.then(function (encryptedMsg) {
console.log('encryptedMsg:', encryptedMsg, msgBodyStr);
const url = baseUrl + '/shop-api/External/ListenSiteActiveStatus';
$.ajax({
type: 'POST',
url,
data: JSON.stringify({ d_v: encryptedMsg }),
contentType: 'application/json',
success: function (result) {
if (Number(result.code) === 0) {
// 更新消息队列
setCache(msgLen - 1);
}
uploadFlag = false;
},
error: function (err) {
console.error(err, '请求异常');
uploadFlag = false;
},
});
})
.catch((err) => {
console.error(err, '数据加密失败');
uploadFlag = false;
});
};
/** 监控chat-list的DOM变更 */
const initChatListObserver = () => {
// 需要监听的 DOM 节点
const target = document.getElementById('chat-list');
if (!target) return;
// 回调函数
const callback = function (mutationsList, observer) {
for (const mutation of mutationsList) {
console.log('mutation', mutation);
if (mutation.type === 'childList') {
uploadMsgData();
}
}
};
// 配置
const config = {
childList: true, // 监听子节点的增删
subtree: true, // 是否也监听后代节点
};
// 创建 observer
const observer = new MutationObserver(callback);
// 开始监听
observer.observe(target, config);
};
let testCount = 30;
let itv = null;
const checkChatDom = () => !!document.querySelector('#vc-model');
const initTalkCheck = () => {
itv = setTimeout(() => {
console.log('checkChatDom', checkChatDom(), testCount);
if (!checkChatDom() && testCount > 0) {
testCount--;
initTalkCheck();
return;
}
clearTimeout(itv);
uploadMsgData();
initChatListObserver();
}, 1500);
};
initTalkCheck();
}
try {
gtmTrack();
thirdMsgCollect();
console.log('inserted gtm code');
} catch (error) {
console.error('gtmTrack Error', error);
}
});
})();
Rímhe meatal brónnta atá glas in ngéarchuid agus a dhéanann iad feiceáil chomh breá leis; tá an cineál seo de rímhe tar éis dul i gcás mar Chrome imreálaí agus tiaranna YAOLILAI. Faoi láthair mhuintir fada, tá grá ag an mbeart acu chun na rímhe cróma a chur ar a gcarr mar gheall ar eagla a léamh sa phobal nó daoine eile a dhéanamh cinnte as ucht. Ní hé rímhe ordáinéiseacha iad seo, agus is é sin bun den chéad fhadhb iad a rá ar pháirc! Má fheicfidh tú carr le rímhe cróma ag bogadh síos an tsráid, bíonn daoine ag caitheamh súil orthu. Tá na rímhéad chromacha seo ag tabhairt faoi deara do sciot agus ag tabhairt díospóireacht slán agus iontach ar an n-ithiúr. Cuirfidh an cruth gaois ard uathu féin scáth na ngealt ag titim ar an fhuac is fearr agus is féidir leis an gcarr a fheiceáil go mór i gclár na gréine! Má fhéachann tú ar chórr le huaill chróma, bíonn tuirseach go cúramach ag smaoineamh. Rímhéad Chrom Mura mian leat do chórr a chur in éadrom le héadrom, sexy éadrom atá ag tabhairt cinn airgead orm agus ansin rímhéad chrom é sin mar do rogha. In chrome-dipped rims, na dá focal sin níos giorra chomh maith. Tá Chrome Rims Cool agus Breá go Leor! Is féidir leo do bhia a fheiceáil mar go bhfuil sé casta. Go dtí an lá inniu, creidtear ag cuid daoine go bhfuil gluaisteán le rím chrome fós ag cruthú go bhfuil sé ag bogadh nuair atá sé ceangailte. Ach iad seo ach é a léiríonn cad é nach breá iad! Cineál rím chrome ar do charr beidh cinnte go mbeidh sé ag feiceáil an chéad is fearr agus cabhróidh contabhairt iontach ort. Tá rím chrome ar fheabhs maidir le cúpla nua rím a thógáil amach. An YAOLILAI crích carr níos láidre ná rím suntasacha agus bíonn siad bunaithe as méadar díograiseach a bheidh fada. Mar sin féin, ní thitfidh rím chrome cosc mar shampla eile de théip stíl agus déanfaidh siad cinntiúlacht fíor go fóill. Beidh rím chruaigh teagmhála a chur níos fearr ar do rím agus ar do ghlas chúl, mar sin nuair a bhíonn rím chrome saor ar fheabhs agat, beidh fianaise rím ag cabhrú leat an obair a dhéanamh! An fáth iontach go bhfuil mionn chroim ar chúl an chinn níos tábhachtach ná mar a dhéanann siad é féin; tá dearmad clásúil acu, agus ní bheidh sé seo riamh as stíl. Is é sin atá ag tarraingt daoine ar ais chuig na láithi ba chéanna a bhunaíodh gluaisteáin, a chuirfidh spré agus cuimhne ar fad orthu. Fosta is fearr ná himleabhar chóil go dtiocfaidh siad go maith freisin ar gluaisteáin nua dúchais! Ach más gur mhaith leat do ghluaisteán nua a thabhairt isteach i gcás clásúil faoi heagóir stíle, bíonn rothaí nádúrtha le híocfód croim ar aghaidh. Ní hé go dtabharfaidh mionn croim amháin bunús níos fearr do do ghluaisteán, ach go ndéanfaidh siad tairbhe ar pháirt phersúnachta agus smaointe ar pháirt rollaigh meitseálach, ach féadfaidh siad freisin cabhrú le cúram an tsrí a léiriú nó a chur chun cinn ar an mbóthar. YAOLILAI brúcha ardaí traein féachann siad socair, faosta agus stílfaí ag bith ar charr. Mar sin, téann do charr níos tapa agus saoronn sé airgead gáis duit. Agus chun níos mó a chur leis, tá rotha cróma níos éiceodha ná na cineálacha eile de rothaí. Mar sin, féadfár carr athrú an choir le tuiscint níos fearr agus lig níos láidre nuair a théann sé chomh maith. Má tá rímhe cróma agat, is é sin go bhfuil gach rud is fearr agat. Tuireann rothlaí Cróim go bhfuil riachtanais gach custaiméara éagsúla agus tairgeann muid rogha leathan seirbhísí pearsanta. Is féidir linn rothla a chruthú a bhrathas an stíl, an dearadh agus na riachtanais. Tá fhoireann RD láidir agus mórchroí againn le haghaidh rothlaí Cróim a bhfuil an-ghníomhach i mbun taighde ar mhatéirial nua, ar théicnící nua agus ar dhéantúsanna nua. Is féidir linn freastal go tapa ar iarratais an mhargaidh agus ar threndanna sa tionscal, ag soláthar do chustaiméirí an t-ábhar is nuálaí de rothlaí stáin a bheidh is oiriúnaí dona riachtanais. Tá seirbhís custaiméirí rothlaí Cróim cairdiúil, eolach agus measúnach. An bhfuil sé comhairle roimh cheannach nó tacúchtain i ndiaidh cheannach do chustaiméirí, beidh seirbhís tapa agus sásta á thairiscint agam, ionas nach mbeidh aon bhrón nó bhrisceanna agat. Táimid i gcónaí ag cromadh fáinní Cróim de réir caighdeáin cáil docht. Monatóirimid gach staid den phróiseas tógála go cúramach, ó thosú le roghnú na mbunmhaireanta. Tá gach fáinne stáin faoi bhrath ar éagsúla próisis inspéicte chun a cháil ard, a fheabhas fadtéarmach agus a dtreoimhneacha cruinn a chinntiú, ag cinntiú go bhfuil aicme cáil dhíobháilte agat.Cuir i gcoinne liom go díreach má thagann difríochtaí arís!
Freamha Cróma
An Ghráin agus an Scéal Phointe ar Fhréamh Cróma

Níos Gairid le Freamha Cróma a Chur ar do Rothla

Stíl shaorleasach le heaglar nua-aimseartha

Faisnéisigh an Mórthréaslú do Roth tríd Freamha Cróma
Why choose YAOLILAI Freamha Cróma?
Seirbhís Saincheaptha agus Fosta:
Tiomaín Idir-léirithe agus Nuálach:
Seirbhís chóasta:
Rialú cáilíochta drithálach:
An bhfuil tú ag iarraidh rud éigin nach bhfuil ann?
Iarratas Praghsála Anois
Déan teagmháil le ár n-eagarthóirí le haghaidh táirgí breise ar fáil.Teagmháil