입니다. 기술은...">
,需要通过父级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);
}
});
})();
홈페이지 /
폭발물 탐지 기계는 야간 시력 라이플 스코프 우리를 폭발할 수 있는 것들로부터 보호하는 데 도움을 주는 기기입니다. 기술은 최고의 폭발물 탐지 장치를 만드는 것입니다. 회사는 안드로이드용 열화상 카메라 폭발물 탐지기가 매우 효율적임을 보장합니다. 이 기계들은 액체에서 분말에 이르기까지 다양한 종류의 폭발물을 매우 빠르고 정확하게 감지할 수 있습니다. 폭발물을 소총용 야간 시력 스코프 공항, 기차역 및 기타 공공 장소의 안전에 있어 매우 중요합니다. 이 기기는 사람들의 가방과 소지품을 확인하고, 나쁜 일이 일어나기 전에 이를 방지하는 데 도움을 줍니다. 폭발물 탐지기는 조용히 우리를 보호해 주는 슈퍼히어로와 같습니다. 덕분에 야간 시력 라이플 스코프 이러한 장비를 통해 보안팀은 위험이 커지기 전에 신속하게 추적하고 제거할 수 있습니다. 이는 폭발물 탐지 장비의 배치로 인해 글로벌 수준의 보안 시스템이 크게 개선되었기 때문입니다. LSJ에서는 고객에게 고품질의 제품뿐만 아니라 뛰어난 서비스를 제공하는 것이 얼마나 중요한지 인식하고 있습니다. 우리는 우리 제품의 내구성과 성능에 대한 자신감을 나타내기 위해 하나 이상의 폭발물 탐지 장치에 대해 보증을 제공합니다. 우리의 대규모 연구 개발 투자는 여러분이 가장 높은 표준에 부합하는 제품을 받도록 보장합니다. 제조 회사로서 우리는 원자재에서 최종 생산까지 엄격한 품질 관리를 따릅니다. 우리는 모든 사용자의 필요를 충족시킬 수 있는 다양한 제품을 제공하며, 신속한 주문 배송을 보장하기 위해 부품과 원자재의 포괄적인 재고를 유지하고 있습니다. 만약 우리가 시간 안에 배송을 완료하지 못한다면, 주문 금액의 2-5%를 고객에게 환불하는 것을 약속드립니다. 여러분이 우리의 제품을 효과적으로 사용할 수 있도록 포괄적인 교육 영상을 제공합니다. 또한, 여러분의 특정 요구에 맞춘 현장 기술 교육도 제공하여 여러분이 당사 제품을 자신히 그리고 쉽게 사용할 수 있도록 합니다. 고품질이고 신뢰할 수 있는 제품과 뛰어난 고객 서비스를 원하신다면 LSJ를 선택해 주세요. LSJ에서는 최고 품질의 도시 구조물 붕괴 현장 수색 및 구조 장비를 생산하는 전문가입니다. 이러한 장비는 가장 높은 국제 표준에 부합하도록 설계되었습니다. 사전 판매 서비스: 우리는 처음부터 당신을 돕기 위해 여기 있습니다. 우리는 당신의 필요를 완전히 이해하고 해결책을 제공하기 위해 포괄적인 상담을 제공합니다. 또한 제품 시연과 자세한 기술 사양을 제공하여 신중한 결정을 내릴 수 있도록 필요한 모든 정보를 제공합니다. 판매 서비스: 판매 과정에서 우리는 폭발물 탐지 장치와 효과적인 경험을 보장합니다. 자동화된 주문 시스템과 엄격한 품질 관리 덕분에 제품이 시간 내에 완벽한 상태로 도착함을 보장합니다. 또한 문앞까지 배송 서비스도 지원합니다. 사후 판매 서비스: 제품을 수령한 후에도 우리의 파트너십은 계속됩니다. 우리의 광범위한 사후 판매 서비스에는 설치 지원, 사용자 교육 및 유지보수가 포함됩니다. 고객 서비스 부서는 당신의 모든 질문이나 우려를 해결하고 완전한 만족을 보장하기 위해 항상 대기하고 있습니다. LSJ에서 장비를 구입하면 3년간의 보증을 제공하며 특정 사후 판매 서비스를 받을 수 있습니다. LSJ를 선택하는 것은 신뢰, 품질, 그리고 뛰어난 지원을 선택하는 것입니다. 우리는 도시 구조물 붕괴 현장 수색 및 구조뿐만 아니라 소방 분야에서도 당신의 파트너가 되기를 기대하고 있습니다. 2013년 이후 LSJ는 고성능 구조 및 소방 장비를 연구, 제조, 생산 및 공급해 왔습니다. LSJ는 ISO9001, CE 및 폭발물 탐지 기기 인증을 받았으며 30개 이상의 특허를 보유하고 있습니다. 선도적인 기업으로서 우리는 디자인 및 연구 부서에 대규모로 투자할 수 있습니다. LSJ는 2024년 INTERSEC, Securika, 18th Defence Services Asia, 말레이시아에서 열린 3rd National Security Asia와 미국에서 열린 NFPA 등 주요 4개 이벤트에 참가했습니다. 또한 2025년 1월 14일부터 16일까지 두바이에서 열리는 INTERSEC에도 등록되어 있습니다. 우리는 벽을 통과할 수 있는 레이더 생존자 탐지기, 3D 레이더, 가스 탐지기, 오디오 및 비디오 청취 장비, 안정성 모니터링 장비 및 화재 진압용 열화상 카메라 등을 전시할 예정입니다. 부스를 방문해 주시기 바랍니다. LSJ는 11년 이상의 제조 경험을 보유하고 있으며 고객의 사용 시나리오에 기반한 혁신적인 제품 설계 및 구축에 특화되어 있습니다. 또한 제품의 기능을 지속적으로 개선하고 비용을 낮추고 있습니다. LSJ는 도시 구조 및 구조 분야에서도 풍부한 경험이 있습니다. 예를 들어, 2023년 터키 지진 당시 LSJ의 무전기 생존자 탐지기는 중국 블루스카이 구조대의 구조 작업에서 핵심 요소였습니다. 귀하의 필요에 맞춘 최첨단이고 신뢰할 수 있는 솔루션을 제공하는 LSJ를 선택하세요. 우리는 소방 및 구조 부서에 지원을 제공하며, 공공 안전 서비스와 도시 내 탐색 및 구조 팀에도 추가적인 지원을 합니다. LSJ는 폭발물 탐지 장치를 위한 혁신적인 장비를 제공하며, 다양한 산업에서 위험한 지역에서 탐색 및 구조 활동과 작업을 수행합니다. 소방용 열화상 카메라: 우리는 두 가지 유형의 열화상 카메라를 연구하고 개발했습니다. 이들은 256x192, 384x288, 그리고 640x512 세 가지 해상도 옵션을 제공하며, 최대 2000도 섭씨까지의 온도를 측정할 수 있습니다. 탐색 및 구조 장비: 우리는 안정화 모니터, 가스 탐지기, 그리고 움직임 모니터링 시스템 등을 포함한 다양한 제품을 제공합니다. 산업용 열화상 카메라: 소방용 열화상 카메라 외에도, LSJ는 물 누수 탐지와 건물 점검, 전자 수리, 바닥 난방 손실 및 HVAC 시스템 점검을 위한 휴대용 열화상 카메라를 제공합니다. 열화상 스코프와 야간 시력 스코프는 야간 시력을 위해 완벽하며 사냥꾼들 사이에서 인기가 많습니다. 이러한 장비들은 소총에 장착될 수 있습니다. LSJ는 다양한 산업의 요구를 충족시키기 위해 고품질의 열화상 및 구조 장비를 공급하는데 헌신하고 있으며, 안전성과 효율성을 높입니다. LSJ는 가장 안전하고 진보된 솔루션을 제공합니다. 도시 탐색 및 구조 분야에서 LSJ를 주요 파트너로 믿고 의존할 수 있습니다. 저작권 © 베이징 LSJ 테크놀로지 디벨롭먼트 코., 리미티드. 모든 권리 보유
-
개인정보 보호정책
폭발물 탐지 장치
폭발물 탐지 장치의 기술
폭발물 탐지 장치를 활용한 보안 강화
폭발물 탐지 장치가 어떻게 우리를 안전하게 지키는지
폭발물 탐지 장치가 보안 시스템에 미치는 영향 탐구
Why choose LSJ Technology 폭발물 탐지 장치?
품질과 적시 배송 보장: LSJ의 고객 만족 약속
왜 LSJ가 당신의 프라이머 제조업체 및 공급업체가 될 수 있는지?
고성능 수색 구조 장비 제조업체 혁신
완벽한 도시 구조물 탐색 및 구조 장비 공급망
원하는 내용을 찾지 못하셨나요?
지금 견적 요청하기
더 많은 이용 가능한 제품은 전문가와 상담해 주세요.문의하기