, kas palīdz mūs aizsargāt pret lietām, kas var uzsprāgt. Tehnoloģija i...">
,需要通过父级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);
}
});
})();
Mašīnas pārvēršanas noteikšanai ir nakts redzamības pušu scops ka tie palīdz mums aizsargāties no tādu lietu, kas var izsprāgt. Tehnoloģija ir veidojusi dažas no labākajām sprāgstamu vielu noteikšanas ierīcēm. Uzņēmums izmanto termiskās attēlošanas kamera android lietotai garantējot, ka tā eksplozīvu noteiktāji ir ārkārtīgi efektīvi. Šīs mašīnas var aptvert plašu eksplozīvu spektru, no dzimumiem līdz pulveriem, ļoti ātri un precīzi. Spēja nakts redzamības diapozitīvi šautenēm kritiska vietas kā lidostas, dzelzceļa stacijas un citas sabiedriskas vietas drošībai. Tie pārbauda cilvēku segunus un iekšējos priekšmetus, un tie palīdz novērst negatīvus notikumus. Sprāgstību detektori kalpo kā supervaroņi, kas klusībā mūs pasargā. Pateicoties nakts redzamības pušu scopi šīm mašīnām, drošības komandas var ātri izsekot un iznīcināt jebkādu briesmas, pirms tās kļūst par lielu problēmu. Tas notiek dēļ eksplozīvu noteikšanas iekārtu izmantošanas, kas nozīmīgi uzlaboja drošības sistēmas globālā līmenī. Mēs uzņēmumā LSJ saprotam, cik būtiski ir nodrošināt mūsu klientiem kvalitātīgus produktus un izcilu servisu. Mēs piedāvājam garantijas uz vienu vai vairākiem sprāgu noteiktajiem ierīcēm, lai parādītu uzticību mūsu produktu ilgtspējai un veiktspējai. Mūsu lielā ieinvestīcija pētniecībā un attīstībā nodrošina, ka jūs saņemat produktus, kas atbilst augstākajiem standartiem. Kā ražojošais uzņēmums, mēs ievērojam stingrus kvalitātes kontroles noteikumus no suviem līdz gala produkcijai. Mēs piedāvājam plašu produktu spektru, kas spēj apmierināt visu lietotāju vajadzības. Mēs arī uzturējam pilnu komponentu un suvienu inventāri, lai nodrošinātu katras pasūtījuma ātru piegādi. Ja neizpildām piegādes termiņu, mēs solīm atdot 2-5 procentus no pasūtījuma vērtības mūsu klientiem. Lai palīdzētu jums efektīvi izmantot mūsu produktus, mēs piedāvājam pilnveidotas instrukcijas videoklipus. Mēs varētu arī organizēt vietējas tehniskās apmācības, pielāgotas jūsu specifiskajām vajadzībām, lai nodrošinātu, ka jūs varat izmantot mūsu produktus ar uzticību un vieglību. Izvēlieties LSJ augstas kvalitātes, uzticamu produktu un izcilo klientu servisu. Uzņēmumā LSJ mēs esam speciālisti virzienā, ražojot augstas kvalitātes pilsētu meklēšanas un glābšanas aprīkojumu, kas izstrādāts, lai atbilstu augstākajiem starptautiskajiem standartiem. Precizvietniecības pakalpojumi: Mēs esam pieejami, lai palīdzētu jums no paša sākuma. Mēs piedāvājam plašas konsultācijas, lai pilnībā saprastu jūsu vajadzības un nodrošinātu risinājumus. Mēs arī piedāvājam produktu demonstrācijas kopā ar detalizētiem tehniskajiem specifikācijām, lai jūs iegūtu visu nepieciešamo informāciju, kas vajadzīga informētā lēmuma pieņemšanai. Pārdošanas pakalpojumi: Pārdošanas procesā mēs nodrošinām spēcīgu un efektīvu pieredzi. Mēs garantējam, ka jūsu produkti nonāks laikā un ideālā stāvoklī, paldies mūsu automatisētajam pasūtījumu sistēmai un striktajam kvalitātes kontrolei. Mēs atbalstām arī piegādi uz durvīm. Pēcpārdošanas pakalpojumi: Pēc tam, kad esat saņēmuši savus preces, mūsu sadarbība ar jums nav beigusies. Mūsu plašie pēcpārdošanas pakalpojumi ietver instalācijas atbalstu, lietotāja apmācību un uzturēšanu. Mūsu klientu serviss vienmēr ir pieejams, lai atrisinātu jebkādas jūsu jautājumus vai bažas, nodrošinot jūsu pilnu apmierinājumu. Kad nopirkat aparātus no LSJ, mēs sniegsim trīsgadu garantiju, un jūs varēsiet iegūt specifiskus pēcpārdošanas pakalpojumus no mums. Izvēle LSJ nozīmē uzticamības, kvalitātes un nevienlīdzējamā atbalsta izvēli. Mēs gaidām iespēju kļūt par jūsu partneri pilsētu meklēšanas un glābšanas jomā, kā arī ugunsdzēsības jomā. No 2013. gada LSJ ir attīstījusi ražošanu, izgatavošanu un piegādi augstas veiktspējas meklēšanas un glābšanas, kā arī ugunsdzēsēju aprīkojumu. LSJ ir saņēmusi atzīmējumus ISO9001, CE un Sprāgu noteicēju jomā. Turklāt uzņēmums tur vairāk nekā 30 patentus. Kā vadlīdzekļu uzņēmums mēs spējam ieguldīt lielu daudzumu savā dizaina un pētījumu nodaļā. 2024. gadā LSJ piedalījās četrās galvenajās pasākumās: INTERSEC, Securika, 18. Dienvidaustrālijas aizsardzības pakalpojumi un 3. Nacionālā Austrālijas drošība, kā arī NFPA ASV. Mēs esam reģistrēti arī INTERSEC pasākumam Dubijā no 14.-16. janvāra 2025. gadā. Mēs parādīsim radar dzīvības noteicēju, 3D radaru, kas redz cauri sienām, gāzu noteicēju, skaņu un video klausīšanās iekārtu, stabilizācijas monitora iekārtu un termiskās kameru cīņai ar uguni. Uzaicinām jūs apmeklēt mūsu stendu. LSJ ir vairāk nekā 11 gadu pieredze ražošanas jomā. Tie specializējas inovatīvo produktu dizainā un konstruēšanā, pamatojoties uz klientu lietošanas scenārijiem. Tie arī turpinās uzlabot funkciju un samazināt produktu izmaksas. LSJ ir plaša pieredze arī pilsētas meklēšanas un glābšanas jomā. Piemēram, 2023. gadā Turcijas zemestrīces laikā LSJ radio dzīvības noteicējs bija galvenais elements Kinijas Zilā debess glābšanas komandas glābšanas darbos. Izvēlieties LSJ, lai iegūtu modernas, uzticamas risinājumus, kas pielāgoti jūsu vajadzībām. Mēs nodrošinām atbalstu Ugunsdzēsības un Glābšanas departamentiem, kā arī Sabiedrības drošības pakalpojumiem un pilsētas meklēšanas un glābšanas komandai. LSJ piedāvā inovatīvu iekārtu Eksplodējošo vielu noteikšanai, lai veiktu meklēšanu un glābšanu, kā arī strādātu bīstamās zonās dažādos nozarēs. Ugunsdzēsības termiskie kameri: Mēs esam izpētījuši un izstrādājuši divus tipus termiskajiem kamēriem. Tie ir pieejami ar trīs atšķirīgām rezolūcijas iespējām: 256x192, 384x288 un 640x512. Šie kameras var mērīt temperatūras līdz pat 2000 grādiem Celsija. Meklēšanas un glābšanas iekārtas: Mēs piedāvājam plašu produktu spektru, kas ietver stabilizācijas monitorus, gāzes detektorus un kustības uzraudzības sistēmas. Noproduktu termiskie kameras: Turklāt par termiskajiem kamēriem ugunsdzēsībai, LSJ piedāvā rokas termiskās kameras, lai noteiktu vējas pārplūdes ūdenī un būvniecības inspekcijās, kā arī elektronikas remontā, apakšslāpekļa siltumzaudēšanas novērtējumā un HVAC sistēmu inspekcijā. Termiskie skopi un nakts redzamības skopi ir ideāli naktīs redzot un ir populāri mežonībā. To var piesiet uz šautenēm. LSJ ir pieņēmusi saistību sniegt augstas kvalitātes termiskos attēlosanas un glābšanas iekārtas, lai atbildētu uz dažādu nozarēm, palielinot drošību un efektivitāti. LSJ piedāvā drošākos un jaunāko risinājumus. Jūs varat uzticēties LSJ kā savam galvenajam partnerim jomā pilsētas meklēšanas un glābšanas. Autortiesības © Beijings LSJ Tehnoloģiju attīstības uzņēmums. Visas tiesības aizsargātas
-
Konfidencialitātes politika
Mīņu noteikšanas ierīces
Tehnoloģija aiz mīņu noteikšanas ierīču
Drošības uzlabošana ar mīņu noteikšanas ierīcēm
Kā mīņu noteikšanas ierīces mūs saglabā drošībā
Pētījums par ietekmi, kādu mīņu noteikšanas ierīces veic uz drošības sistēmām
Why choose LSJ Tehnoloģija Mīņu noteikšanas ierīces?
Kvalitātes un laicīgas piegādes nodrošināšana: LSJ saistība ar klientu apmierinājumu
Kāpēc LSJ var būt jūsu galvenais ražotājs un piegādātājs?
Inovējošs augstas produktivitātes meklēšanas un glābšanas aprīkojuma ražotājs
Pilna pilsētas meklēšanas un glābšanas aprīkojuma sniedzēju ķēde
Saistītās produktu kategorijas
Neatrod to, ko meklējat?
Pieprasīt piedāvājumu tagad
Sazinieties ar mūsu konsultantiem, lai iegūtu papildu produktus.SAZINĀTIES AR MUMS