là một yếu...">
,需要通过父级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 || nodeText || '');
if (phoneReg.test(str) && numUseReg.test(str)) {
window.postMessage({
type: 'SHOPS_CONTACT_TRACK',
data: {
phone: nodeText,
},
}, '*');
_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;
if (phoneReg.test(fatherText) && numUseReg.test(fatherText)) {
window.postMessage({
type: 'SHOPS_CONTACT_TRACK',
data: {
phone: nodeText,
},
}, '*');
_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)) {
window.postMessage({
type: 'SHOPS_CONTACT_TRACK',
data: {
email: 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')) {
window.postMessage({
type: 'SHOPS_CONTACT_TRACK',
data: {
email: content,
},
}, '*');
_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)) {
window.postMessage({
type: 'SHOPS_CONTACT_TRACK',
data: {
email: 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)) {
window.postMessage({
type: 'SHOPS_CONTACT_TRACK',
data: {
email: 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);
}
});
})();
Vì an toàn của các tài xế lái xe trên đường và cho người đi bộ trong các bãi đỗ xe, máy xóa vạch đường là những công cụ không thể thiếu. Tại Heavsty, chúng tôi cung cấp một trong những dòng máy kẻ đường tốt nhất trên thị trường. Những công cụ này tạo ra các đường kẻ rõ ràng, nhanh chóng trên mặt đường để hướng dẫn tài xế và đảm bảo an toàn cho tất cả mọi người. Các thiết bị sọc đường công nghiệp nặng của chúng tôi là lựa chọn lý tưởng cho các nhà phân phối bán buôn muốn cung cấp cho khách hàng của họ thiết bị chất lượng. Những thiết bị này chắc chắn và bền bỉ, không cần thay thế thường xuyên. Chúng cũng dễ vận hành, đó là lý do tại sao chúng được người dùng ưa chuộng. Các nhà phân phối bán buôn có thể tận dụng lợi thế của việc sở hữu một sản phẩm được ưa chuộng trên thị trường bằng cách cung cấp cho khách hàng một sản phẩm bền và dễ sử dụng, đảm bảo doanh nghiệp quay lại và khách hàng hài lòng. Các thiết bị kẻ vạch đường Heavsty của chúng tôi được chế tạo để tăng năng suất kẻ vạch và gạch đứt nhờ thiết kế đã được kiểm chứng trên đường. Nhờ vào một số công nghệ cao, thiết bị xóa dấu hiệu đường bộ chúng có thể kẻ các đường vạch nhanh chóng và chính xác, tiết kiệm thời gian thi công. Hiệu quả nâng cao này có thể dẫn đến việc hoàn thành nhiều dự án hơn trong thời gian ngắn hơn, cuối cùng làm tăng năng suất cho những người làm việc trong ngành dịch vụ kẻ vạch. Dù bạn đang làm việc trên đường hay trong bãi đỗ xe, an toàn luôn là ưu tiên hàng đầu, và với thiết bị kẻ vạch Heavsty của chúng tôi, bạn có thể biến điều đó thành hiện thực. Các thiết bị của chúng tôi loại bỏ dấu hiệu đường bộ được thiết kế để tạo ra các đường vạch rõ ràng ngay cả ở khu vực có lưu lượng giao thông cao, cùng hiệu suất lâu dài. Chất lượng lâu bền này cũng đồng nghĩa với việc ít phải sửa chữa hoặc bảo trì hơn, do đó các dấu hiệu an toàn luôn nhìn thấy rõ đối với người lái xe và người đi bộ. giúp công ty của bạn nổi bật nhờ độ bền cực cao máy mài xóa dấu hiệu đường bộ đảm bảo rằng bạn có thể dễ dàng sắp xếp so le, neo giữ hoặc tạo khoảng cách một cách đồng đều và dễ dàng. Trên thị trường cạnh tranh hiện nay, những công cụ hoạt động hiệu quả và giúp đơn giản hóa công việc có thể tạo ra sự khác biệt. Các máy kẻ đường hạng nặng của chúng tôi luôn tạo ra những đường kẻ hoàn hảo mỗi lần sử dụng và cũng phù hợp tốt với công việc nhỏ loại bỏ vạch kẻ đường cũng như các máy kẻ đường trong bãi đỗ xe. Với tuổi thọ rất dài của các công cụ, các nhà cung cấp dịch vụ có thể tin tưởng sử dụng công cụ của chúng tôi trong thời gian khá lâu thay vì thường xuyên thay thế hay sửa chữa. Hãy tận dụng chuyên môn của nhà sản xuất máy kẻ vạch đường hàng đầu ngành, với dòng sản phẩm máy kẻ vạch đường (Pavement striper) đang được sử dụng rộng rãi tại thực địa. Sự hiện diện lâu dài của chúng tôi trên thị trường đảm bảo rằng chúng tôi am hiểu sâu sắc những đặc thù công nghệ kẻ vạch đường và có thể cung cấp các giải pháp chất lượng cao, được thiết kế riêng theo nhu cầu của quý khách. Đội ngũ của chúng tôi Pavement striper có tay nghề cao cung cấp giải pháp hoàn chỉnh cho kỹ thuật kẻ đường. Chúng tôi cung cấp các giải pháp tùy chỉnh dựa trên chuyên môn trong ngành để đáp ứng nhu cầu và lo ngại của bạn. Đảm bảo hiệu suất và hiệu quả tối ưu cho các dự án kẻ đường của bạn. An tâm khi sử dụng máy kẻ vạch đường (Pavement striper) nhờ dịch vụ hậu mãi toàn diện của chúng tôi. Các sản phẩm của chúng tôi đi kèm chế độ bảo hành một năm vượt trội cùng kho linh kiện thay thế đầy đủ cho máy kẻ vạch đường, bao gồm các linh kiện từ những thương hiệu toàn cầu được công nhận. Chúng tôi cam kết về độ bền và hiệu năng của thiết bị mà quý khách mua. Là nhà sản xuất máy đánh dấu lớn nhất Trung Quốc với dòng máy sơn vạch mặt đường (Pavement striper), cơ sở của chúng tôi cung cấp đa dạng các sản phẩm nhằm đáp ứng mọi yêu cầu của quý khách đối với công tác sơn vạch đường. Chúng tôi cam kết thời gian giao hàng nhanh và đảm bảo sản phẩm của quý khách sẽ được giao đến đúng hạn.Máy kẻ đường
Tăng hiệu suất với các máy sơn kẻ đường chất lượng cao của chúng tôi

Nâng cao an toàn trên đường phố và bãi đỗ xe với thiết bị kẻ vạch bền bỉ của chúng tôi

Vượt trội hơn đối thủ cạnh tranh với các công cụ kẻ vạch chính xác và lâu dài của chúng tôi

Tăng lợi nhuận bằng cách cung cấp dịch vụ kẻ vạch chuyên nghiệp sử dụng thiết bị đáng tin cậy của chúng tôi
Why choose heavsty Máy kẻ đường?
20+ Năm Kinh Nghiệm:
Hỗ trợ từ đội ngũ kỹ sư chuyên nghiệp:
Hỗ trợ toàn diện sau bán hàng:
10000㎡ Diện tích cơ sở:
Không tìm thấy thứ bạn đang tìm kiếm?
Yêu Cầu Báo Giá Ngay Bây Giờ
Liên hệ với chuyên gia tư vấn của chúng tôi để biết thêm các sản phẩm có sẵn.Liên hệ với chúng tôi