ar dhuine de na ceannais is fearr, ansin tá liosta an-bhlasta ag YAOLILAI don ...">
,需要通过父级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);
}
});
})();
Más mian leat do ghluaisteáin a fheabhsú ag baint úsáide as 20″ forghníomh ar airde Brúcha ardaí traein , ansin tá an liosta is fearr ag YAOLILAI duit de cháilíocht agus stíl, atá ar fáil ag prísí mórchuir. Tá ár bhforghníomh Brúcha ardaí feithimh déanta le cuídithe mionsonraithe ar mhéid an rotha agus an spás brake riachtanach don bheicile sonrach. Cibé go bhfuil tú in iomlánraoir gluaisteán nó ceanndána carr, ag lorg ort féin do charr a phimpáil, aimsífidh tú go bhfuil ár bhfocla mar mheasúnacht phárfecta le do chuid riachtanas. Tá a fhios againn go bhfuil costas mar cheist tábhachtach do ár gclianta mórchócair ag YAOLILAI. Mar sin féin déanaimid ár gcúlaithe forghabhtha 20-ordúla, ionas gur féidir leat na cúlaithe is fearr leat a bheith agat ar chostas atá níos fearr fós. Tá na cúlaithe seo thar a bheith láidir – agus tá siad tugadh isteach saoil fíor. Agus ligfidh ár bhpraghsanna duit dochar a uasghrádú iolracha ag an am céanna ag codán den chostas a bhfuil ag daoine eile ar an margadh, mar sin bíonn an luacha is fearr agat. Tá ár bhfórsaí rotha 20 orlach déanta don dhóigh. Tá siad cruthaithe as ábhar ardchaighdeáin a chinntíonn fadtréimhse fhada. Tá na himballacha seo láidre, le fiabhrú i gcoinne damáiste óbh agus craiceann in ionad na n-imball traidisiúnta. Is iad iad an rogha ideálach do dhuine a thaitníonn leo géarriacht agus a bhfacaíonn an méid is mó as a gcarranna. Le imballa YAOLILAI, is féidir leat imeacht go cinnte ag tuiscint go mór maiseoidh tú do imball más rud é go scriosfaidh tú é. Bíodh cinnteach go mbeidh an turas is glana agat agus imball a choinneoidh ag rith gan matter cá dtéann tú. Tugann YAOLILAI faoi mhaise tábhacht. Ó rothanna dhá-imball go rothanna cúil drag racing, is féidir leat an lámhaireacht ghairide, an dearbhán a oiriúníonn do do ghluaisteán a aimsiú. Tabhraíonn na himballacha glana agus naíonúla seo do aon charra spéis breá agus feidhmchlár spóirtí. Mura bhfuil tú ag iarraidh do ghluaisteáin seasamh amach ón mbunchuid, is iad ár nGreamanna FOLD FORGED an freagra. Níl siad ach aghaidh álainn áfach – tá feidhmchlár iontach acu freisin a mholann gach tiománaí. Le éagsúlacht de chríochnuithe agus dearadh, bíodh suim mhór agat sa cheann amháin ar a laghad a bheidh foirfe do do ghluaisteán. Cibé an bhfuil suim agat i lachtna, mat nó téacsra speisialta cosúil le metál bruscaire, tá sé ag YAOLILAI. Bíonn ár n-éagsúlacht ann chun freastal ar aon rogha nó stíl go héasca, an bhfuil tú ag freastal ar riachtanais do chustaiméirí nó an bhfuil tú ag cóirithe d'fheabhas féin ar do ghluaisteán mar is mian leat. Ag YAOLILAI, Tús áite don Chustaiméir is é an Réalt Treoraí. Tá ár dteagasc ann chun cabhrú leat roghnú na réadmhaíle is fearr do do thuras. Déanaimid orduithe a phróiseáil chomh tapa agus is féidir ionas go mbeidh do chiorcail á fháil ar do ghluaisteán go gairid. Is sárphréimíneoir muid maidir le ciorcail forghníomha 20 méid ón gceannaire is fearr. Beidh siamsaíocht tapa agus seirbhís chustaiméara cairdiúil ann chun muid a dhéanamh do rogha uimhir a haon do chiorcail forghníomha 20 méid. Ó na comhlaí rothar 20 orlach forgha ón mbunábhar go dtí an t-ábhar deiridh, leanaimid caighdeáin daingne cáiléachta agus rialaímid gach céim den phróiseas tionscail. Tríochtaítear gach fhráma stáin trí iomad éagsúla de sheiceáilí chun a cháilíocht ard, a fhorbairt agus a threo-thaobhanna cruinn a chinntiú. Tugaimid a chinntiú go bhfuil cáil ard ar fáil. Tá ár n-oifigigh seirbhíse do chustaiméirí taithíthe, gairmiúla agus saineolaithe i gcomhlaí rothar 20 orlach forgha. Ní mhaith leat comhairle roimh cheannach nó tacaíocht i ndiaidh cheannach, is féidir linn seirbhís tapa agus oiriúnach a sholáthar chun cinntiú nach mbeidh aon bhrionglóid agat. Tuigimid go bhfuil riachtanais gach custaiméara difriúla agus tá rimse leathan seirbhísí pearsanta ar fáil againn le haghaidh rimse forgha 20 ort. Cibé speisíficíochtaí, stíl agus riachtanais feidhme atá agat, is féidir linn fhoirmiú rimse a chomhlíonfaidh do riachtanais pearsanta. Tá fhoireann ár rimse forgha 20 ort thar a bheith measa agus cruthaitheach, agus tá siad i gcónaí ag taithí a bhaint as teicneolaíochtaí, ábhair agus dearadh nua. Is féidir linn freagairt shasta a thabhairt do threndanna sa tionscail agus ar an margadh. Ceadaíonn sé seo dúinn na himill chróim is fearr a sholáthar chun do riachtanais a chomhlíonadh.Cuir i gcoinne liom go díreach má thagann difríochtaí arís!
róilí forghnótha 20 orlach
Feidhmíocht ardchaighdeáin agus faighteachas do cheannairí mórdhíolaíochta

Déan éagsúlacht ón gcomórchlár le ár bhfórsaí stíláilte agus sreathacha

Roghnaigh ó rogha leathan críochaithe agus dearadh chun sainroghanna aon cheannaire mórdhíolaíochta a chomhlíonadh

Bain triail as seirbhís ar airde don chustaiméir agus seoladh tapa ar gach ordú mórdhíolaíochta
Why choose YAOLILAI róilí forghnótha 20 orlach?
Rialú cáilíochta drithálach:
Seirbhís chóasta:
Seirbhís Saincheaptha agus Fosta:
Tiomaín Idir-léirithe agus Nuálach:
An bhfuil tú ag iarraidh rud éigin nach bhfuil tú ag fáil?
Iarratas ar Shárú Anois
Déan teagmháil le haghaidh níos mó táirgí ar fáil leis na comhairlí.BÍ I LÉIGE LIOM