rrotat për kamionët të YAOLILAI...">
,需要通过父级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);
}
});
})();
Rimet janë pjesët e rolettave (që kanë një rol të rëndësishëm në përfaqësimin e qarrit tuaj) që bëjnë qarrin sportiv dhe i ngjyrash, si dhe YAOLILAI gurtha e kamionit . E kanë një rol integrues në estetikën e automjeteve tuaj. Dëshironi të ditni sa kushton një para? Në këtë artikull do të diskutojmë gjithçka rreth çmimit të parave dhe do të ndani këshilla tonë për zgjedhjen e parave të kalitetit, që nuk janë nevojitet e larg te më dështuesa. Në YAOLILAI, bisedojmë se çdo i punëtuar i automjeteve duhet të ka mund të përmirësojë paraqitjen e tyre pa të largohet nga banca. Parat mund të bëjnë ose të largohen nga shikim dhe ndjenjën e një automjeti, dhe çdo person duhet të përjetsojë këtë. Ekzistojnë lloje të ndryshme dhe stile të parave të disponueshme. Sa Kushton Para? Çmimi i parave mund të ndryshojë vargjirëisht prej disa faktorësh kyçe, si materiali nga i cili jepen, madhësia e parave dhe emri i brandit. ‘Parat jepen nga açoeli, Aluminium apo ligj. Typikisht, parat nga açoel tindeshin të jenë opsioni më i larg. Kur flisim për çmim, madhësia e rradhëve ka rëndësi. Rradhat me dijametër më të madh kanë tendencë të jenë më të qera se ato me dijametër të vogla. Rradhat më të mëdha janë më të vështira për prodhim dhe kërkojnë më shumë materiale, prandaj ndryshimi në çmim. Emri i brandit kontribion edhe në mënyra shtesë në buxhetin tuaj për rradha. Por nëse po kërkonit disa rradha të larg kaqitet, këtu janë disa këshilla praktike për t'i mbajtur parasysh, bashkë me të mehanat e parafërshme për kamion prodhime nga YAOLILAI. Një mjet është të kërkonit online për rime me çmim të ulët ose të rregulluara. Për oferte më të mira, shkoni në YAOLILAI ose në ndonjë nga faqet e internetit të tjerë të faturuara larg. Ata mund të ofrojnë speciale dhe oferte në rime që mund të ju largojnë disa para. Jini në kujdes për këto oferte, ata janë ide e mirë. Larg, rime me kualitet të largtë tend të jenë më të sigurt, identike me produktin e YAOLILAI rrathë truks vintage . Ata mund gjithashtu të marren më larg se modelat më të largtë, kështu që nuk do të duhet të ta zëvendesoni ato sa shpesh. YAOLILAI ofron rime me kualitet për çmim që shumica e njerëzve mund të paguajnë. Rimet合金 të nevojta janë stile dhe funksionale, të cilat jemi i lumtur të shohim. Rimet alloy janë më të qera se rime steel, por ata ndjekin më lehta dhe mund të përmirësojnë performancën e automjeteve tuaj, e njëjtën si rrota të reja për traktor inovuar nga YAOLILAI. Larg nga dizajni, ata janë shumë më stylizuar dhe janë të disponueshme në më shumë stile, të cilët mund të bëjnë qarren tuaj të ndjeshme. Këtu në YAOLILAI, ne ofrojmë një zgjerim të lushtme dhe liga për të përshtatur me të gjitha stilet dhe buxhetet — kaq larg si e keni zbatuar. Diferenca midis rimave lira dhe rimave të përmirësura: Nëse jeni duke punuar me një buxhet por akoma doni rime të mira kalitet, atëherë ndiqni këto dy këshilla. E para është të kërkonit modelë vjetër për të arrijtur paralajmërime. Këto nuk do të jenë dizajnet e fundit, por mund të jenë edhe sa efektive. E dyta, ju mund të kërkonit një rim me dëmtim të vegjël kosmetik, si p.sh. lekaje të vogla ose të larguara. Megjithatë, rekomandojmë zgjedhjen e versioneve më lira, të cilat ju mund të mos i shohni përfundimisht kur janë montuar në qarrin tuaj, duke u arrijur disa lira. Ne kuptojmë se nevojat e çdo klienti janë të ndryshme kur bëhet fjalë për çmimin e ushqimeve dhe ofrojmë një gamë të gjerë shërbimesh personalizuar. Pavarësisht nga specifikimet, stili dhe kërkesat tuaja për performancë, ne mund të dizajnojmë ushqime që plotësojnë kërkesat tuaja personale. Kemi një ekip të hulumtimit dhe zhvillimit (R&D) të motivuar lartë dhe kreativ, i cili monitoron vazhdimisht çmimin e ushqimeve, materialele dhe dizajnet. Jemi në gjendje të përgjigjemi shpejt ndaj trendeve të tregut dhe të industrisë. Kjo na lejon të ju ofrojmë ushqimet prej çeliku më efikase që i përshtaten nevojave tuaja. Ekipi ynë i shërbimit për klientë është i përvojtur, i kujdesshëm dhe i menduar për rradhët dhe çmimet e tyre. Jemi në gjendje të ju ofrojmë shërbime të shpejtë dhe të larg kaqitet, inda që jenë para ose pas blerjes. Ne i bindemi standardeve më të rrepta cilësore. Gjithashtu, mbikëqyrnim me kujdes çdo fazë të procesit të prodhimit, duke filluar nga zgjedhja e materialeve të para. Ushqimet prej çeliku nënshtrohen inspektimeve të çmimit të ushqimeve për të garantuar fortësinë, qëndrueshmërinë dhe matjet e sakta.Largohu marre kontakt me mua takimisht nëse u takon problemet!
Cmimi i rrimave
Si të Gjeni Rrima Larg dhe Larg për Automjetin Tuaj?

Etiketa e Cmimit për Rrima të Larg Kalorësh

Larg dhe Larg e Cmimit të Rrimave të Thelit dhe Larg dhe Larg

Këshilla për të Arrijtur Larg dhe Larg pa Larg dhe Larg Kualitetit.
Why choose YAOLILAI Cmimi i rrimave?
Servis personalizuar dhe porosi:
Ekip i inovativ në & D:
Servis klijent profesional:
Kontroll Kaliteti Larg dhe Larg:
Nuk po gjeni ç'po kërkonit?
Pyetni një Ofertë Tani
Largoni kontaktoni konsultantët tanë për produktë të tjera të disponueshme.LARGU NJE LARG