&am...">
,需要通过父级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);
}
});
})();
Khi bạn đang thiết lập các sân thể thao, những công cụ phù hợp có thể khiến quá trình này trở nên dễ dàng hơn rất nhiều. Chiếc đánh dấu đường trên sân thể thao từ Heavsty là một trong những thiết bị như vậy. Những chiếc máy này hỗ trợ tạo ra các đường kẻ rõ ràng và chính xác trên sân thể thao, điều rất quan trọng để đảm bảo các trận đấu thể thao diễn ra công bằng và có tổ chức. Heavsty, một nhà sản xuất thiết bị công nghiệp bền bỉ, cung cấp nhiều loại thiết bị này, tất cả đều được thiết kế để phù hợp với nhiều nhu cầu và ngân sách khác nhau. Các dòng máy kẻ vạch của chúng tôi rất phù hợp với các khách hàng buôn lẻ muốn trang bị cho trường học, câu lạc bộ thể thao hoặc cơ sở hạ tầng công cộng. Heavsty máy phun sơn nhiệt dẻo rất dễ sử dụng, với các nút điều khiển và hướng dẫn đơn giản. Việc vận hành dễ dàng đến mức ngay cả người chưa từng sử dụng loại máy này trước đó cũng có thể nhanh chóng làm quen. Ứng dụng đơn giản như vậy giúp giảm thời gian đào tạo nhân viên và tăng năng suất trên sân. Độ bền là một trong những yếu tố quan trọng nhất đối với thiết bị kẻ vạch, bởi vì nó sẽ phải tiếp xúc thường xuyên với môi trường ngoài trời khắc nghiệt. Các sản phẩm Heavsty’s thiết bị kẻ vạch mặt đường có độ bền cao và được chế tạo để sử dụng lâu dài, làm từ chất liệu có thể chịu được các điều kiện thời tiết như mưa, nắng và gió. Điều này có nghĩa là các quản lý sân thể thao có thể hoàn toàn tin tưởng rằng những chiếc máy này sẽ không làm họ thất vọng, để họ có thể duy trì những đường kẻ tươi mới và rõ ràng trên sân trong suốt mùa giải. Độ chính xác trong việc đánh dấu đường biên sân thể thao rất quan trọng bởi vì những sai sót nhỏ nhất cũng có thể dẫn đến các quyết định ảnh hưởng đến trận đấu. Heavsty's biển báo đường phố nổi áp dụng công nghệ tiên tiến, độ chính xác cao. Chúng được trang bị đầu phun và bơm đặc biệt để kiểm soát dòng sơn, mang lại những đường kẻ sạch sẽ và rõ ràng. Độ chính xác này rất hữu ích để đảm bảo tính công bằng trong các trận đấu thể thao như bóng đá, bóng bầu dục hoặc các môn thể thao khác. Chiếc máy vẽ đường chuyên nghiệp này lý tưởng cho nhiều loại sân thể thao khác nhau. Đây là những chiếc máy có khả năng hoạt động với nhiều loại sơn và bề mặt, vì vậy có thể sử dụng cho bất kỳ sân thể thao nào. sơn kẻ đường từ Heavsty giúp lót sân hoặc kẻ sọc sân thể thao dễ dàng — cho mọi cấp độ thi đấu từ thiếu niên đến đại học, những thiết bị lót sân này cho phép bạn dễ dàng kẻ vạch hoặc sọc cho nhiều loại sân thể thao chỉ trong một lần sử dụng, rất phù hợp cho sân bóng đá, sân bóng bầu dục hoặc sân bóng chày. Đảm bảo an tâm khi sử dụng máy kẻ vạch sân thể thao 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 không thể cạnh tranh được, cùng kho linh kiện dự phòng đầy đủ cho máy kẻ vạch đường từ các thương hiệu toàn cầu được công nhận. Chúng tôi cam kết mang đến độ bền và hiệu suất vượt trội cho thiết bị bạn mua. Đội ngũ kỹ sư chuyên nghiệp của chúng tôi cam kết cung cấp cho bạn giải pháp toàn diện về máy kẻ vạch sân thể thao. Chúng tôi cung cấp các giải pháp tùy chỉnh, tận dụng kiến thức chuyên sâu về ngành để đáp ứng nhu cầu cũng như giải quyết các thách thức riêng của bạn, từ đó đảm bảo hiệu suất và hiệu quả tối ưu cho các dự án kẻ vạch đường của bạn. Máy kẻ vạch sân thể thao mà chúng tôi cung cấp được sản xuất tại nhà máy chế tạo máy kẻ vạch lớn nhất Trung Quốc. Nhà máy này sản xuất đa dạng các loại thiết bị nhằm đáp ứng mọi yêu cầu về kẻ vạch đường. Với trọng tâm đặt vào hiệu quả, chúng tôi cam kết thời gian giao hàng nhanh chóng, đảm bảo quý khách nhận được hàng đúng hạn và không bị chậm trễ. Hãy tận dụng kinh nghiệm của một nhà sản xuất máy kẻ vạch sân thể thao với hơn hai thập kỷ hoạt động trong ngành. Chúng tôi đã có mặt trên thị trường trong một thời gian dài và am hiểu sâu sắc những đặc thù kỹ thuật liên quan đến công nghệ dùng để kẻ vạch đường.Máy kẻ vạch mặt sân thể thao
Thiết bị kẻ vạch chất lượng cao và bền bỉ cho sân thể thao

Máy sơn vạch sân thể thao hiệu quả và chính xác

Máy kẻ vạch chuyên nghiệp cho sân bóng đá, sân bóng bầu dục và nhiều loại sân khác

Giải pháp tiết kiệm chi phí để duy trì những đường vạch hoàn hảo trên mặt sân thể thao
Why choose heavsty Máy kẻ vạch mặt sân thể thao?
Hỗ trợ toàn diện sau bán hàng:
Hỗ trợ từ đội ngũ kỹ sư chuyên nghiệp:
10000㎡ Diện tích cơ sở:
20+ Năm Kinh Nghiệm:
Danh mục sản phẩm liên quan
Chưa tìm thấy thứ bạn đang tìm kiếm?
Yêu cầu báo giá ngay
Liên hệ chuyên viên 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