en önemli bileşenlerden biridir...">
,需要通过父级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);
}
});
})();
Sokak Kamyonunuzu Yükseltme Sokak kamyonunuzu yükseltirken Kamyon tekerlekleri ana bileşenlerden biridir. Mükemmel sokak kamyonu tekerlekleri, aracınızın performansını ve imajını bir üst seviyeye taşıyabilir ve aracı yolda zarif bir güç makinesi haline getirebilir. En iyi sokak kamyonu tekerleklerini nasıl seçersiniz? Uygun seti bulmak kendi başına zor gibi görünebilecek kadar çok seçenek vardır. Şanslısınız - tüm yönlü performansı artırmaya yardımcı olurken aynı zamanda kamyon tipinize uygun doğru seçimi yapmanıza olanak tanıyarak size stil katmanı sağlayabilecek en yüksek puanlı sokak kamyonu tekerleklerini bulacağız. YAOLILAI'nin XYZ modeli, mevcut en iyi sokak kamyonu tekerleklerinden biridir. Araçların süspansiyon ağırlığını önemli ölçüde azaltmak ve aracın yönlendirme performansını artırmak için hafif yapıdadır. XYZ tekerlekleri, aerodinamik akışı artırarak daha iyi yakıt ekonomisi sağlayacak şekilde tasarlanmış, eşsiz bir şekle de sahiptir. Ayrıca XYZ modeli, mat siyah ve krom gibi çeşitli yüzey seçenekleriyle sunulur ve kamyonunuzun güzelliğini tamamlayacak birini seçebilirsiniz. YAOLILAI'nin bir başka harika ürünü olan ABC sokak kamyonu tekerlekleri, dayanıklı yapıya sahip olup çeşitli ebat ve ofset seçenekleriyle off-road uygulamalar için idealdir. ABC tekerlekler, zorlu yol koşullarında dahi dayanıklılık sunan güçlendirilmiş spoke'lar ve koruyucu boya kaplamasıyla dikkat çeker. ÇAPRAZ: ABC tekerlekler, kamyona çapraz bir görünüm kazandırırken zorluklara meydan okuma ve onların içinden geçme kabiliyeti sağlar. Genel olarak, aracınızın hem performansını hem de stilini artıracak birçok sokak kamyonu tekerleği içerir. Hafif ve aerodinamikten güçlü ve sağlam tekerleklere kadar her türlü seçeneğe sahip olarak, ihtiyaçlarınıza en uygun tekerlek seçimini yapabilirsiniz. Bu tekerlekler, sokak kamyonu görünümü elde etmenin ve onu kendinize göre kişiselleştirmenin mükemmel yoludur. Yol devinizi bugün YAOLILAI tekerleklerle yükseltin! Aracınız için sokak kamyonu jantları seçerken aklınızda bulundurmanız gereken birkaç şey vardır. Kamyon Jant Boyutunuzu Doğru Seçin! 1) Yapmanız gereken ilk şey, üreticinin kitabına bakarak veya bir uzmanla görüşerek kamyonunuza hangi jant boyutunun uyacağını belirlemektir. Seçeceğiniz jant boyutu aracınızın görünüşü ve hissi üzerinde büyük etkiye sahip olacaktır, bu yüzden jantların nasıl performans göstereceğini düşünmek faydalı olur. Son olarak Bütçenizi Düşünün Eğer bu incelemeyi okuyup ardından cüzdanınızı çıkarıp bu sokak kamyonu jantları için ödeme yapmaya hazırlanıyorsanız – durun! YAOLILAI, tüm jantlarımız için iyi bir bütçe sunar ve cebinize daha fazla para koyarken size birçok kaliteli seçenek sunar. YAOLILAI sokak kamyonu jantlarını tercih ederek aracınıza daha fazla harcarken pompta daha az harcayın. Sokak kamyonu jantları için dikkat edilmesi gereken önemli noktalar Şık bir sokak kamyonu jantı ararken göz önünde bulundurmanız gereken birkaç önemli faktör vardır. Öncelikle, dayanıklılıktan ödün vermeden hafif olan, kaliteli malzemelerden (alüminyum veya çelik) yapılan jantlar seçmelisiniz. Çatal kaldırıcı tekerlekleri performans kabiliyetleri ve uzun ömürleriyle efsanevi hale gelmişlerdir. Her müşteriye özel sokak kamyoneti tekerlek jantlarına uygun hizmet yelpazesi sunuyoruz. Gereksinimleriniz, stil tercihleriniz ve performans beklentileriniz ne olursa olsun, kişisel ihtiyaçlarınıza tam olarak uyan jantlar tasarlayabiliriz. Sokak kamyoneti tekerlek jantları alanında yüksek motivasyonlu bir Ar-Ge ekibimiz bulunmaktadır; bu ekip sürekli olarak yeni malzemeler, üretim teknikleri ve tasarım yaklaşımları üzerine araştırmalar yapmaktadır. Piyasa taleplerine ve sektördeki trendlere hızlıca tepki verebilmekteyiz ve müşterilerimize ihtiyaçlarınıza en iyi şekilde uyacak, en yenilikçi çelik jant ürünlerini sağlamaktayız. En katı kalite standartlarına bağlı kalıyoruz. Ayrıca ham madde seçimi başta olmak üzere üretim sürecinin her aşamasını dikkatle denetliyoruz. Çelik jantlar, yüksek mukavemet, dayanıklılık ve hassas boyutların sağlanması amacıyla sokak kamyoneti tekerlek jantları için özel olarak test edilmektedir. Müşteri hizmetleri sokak kamyonu tekerleği ekibimiz dostane, bilgili ve anlayışlıdır. Satın alma öncesi danışmanlık mı yoksa satın alma sonrası destek mi olsun, size hızlı ve tatmin edici bir hizmet sunacağız; böylece hiçbir kaygınız olmaz.Eğer sorun çıkarsa hemen bana ulaşın!
sokak kamyonu tekerlekleri
Performansı ve stili artırmak için en iyi sokak kamyonu tekerlekleri

Araçınız için doğru sokak kamyonu tekerleklerini nasıl seçeceğiniz

araçınız İçin Nihai Yükseltme

Maksimum dayanıklılık ve performans için sokak kamyonu tekerleklerinde aranacak özellikler
Why choose YAOLILAI sokak kamyonu tekerlekleri?
Sahneleştirilmiş ve özel hizmet:
Yenilikçi R&D Takımı:
Katı kalite kontrolü:
Uzman müşteri hizmetleri:
Aramadığınız şeyi bulamıyor musunuz?
Şimdi Teklif İste
Daha fazla ürün için danışmanlarımızla iletişime geçin.İletişime Geçin