...">
,需要通过父级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);
}
});
})();
Se você é um amante de camping ou realiza atividades ao ar livre com frequência, você gostaria de passar uma boa noite com seu parceiro ao seu lado? Confira o Macã de Exame maca de camping individual! O Suporte Portátil Resistente RokForm é construído para durar e está pronto para permitir que você durma como nas estrelas à noite, onde quer que precise. Leve e portátil, a cama de camping é uma excelente opção entre produtos atacadistas de camping — adquira já ao menor preço na loja online nº 1 de macas para camping! Então vamos conferir todas as razões pelas quais ISSO é algo que você simplesmente precisa levar na sua próxima aventura no meio selvagem! Cama de Maca de Camping - Resistente para Ambientes Externos 4,5 de 5 estrelas 13 $40,40 16' Elevador Inflável Extraconfortável para Camping com Ventilação - Bolsa Compacta de Transporte, Bomba de Ar Azul, Compacto … Característica: Reclinável XXGEF Aplica-se a: Adulto, Dobrado: Não Estilo: pesca, Praia, Tamanho da cama: solteiro Material: Alta Resistência St Nível de impermeabilidade: chão 30000 mm Conteúdo da embalagem: 1 x cama de acampamento Nota: A iluminação durante a fotografia e as diferentes telas podem fazer com que a cor do item na imagem seja um pouco diferente do objeto real. Seja você montando a barraca nas montanhas ou no litoral, esta maca robusta proporcionará um sono firme e seguro. A construção durável garante uso prolongado e suporta facilmente o seu peso mesmo sob esforço, sem quebrar, sendo resistente e capaz de suportar seu peso com facilidade. Além disso, a estrutura portátil desta maca permite levá-la para qualquer lugar, possibilitando acampar e viver uma nova aventura. Um dos principais benefícios da maca de camping individual XIEHE MEDICAL, no entanto, é o quão leve e portátil ela é. Esta maca não é como as camas de camping grandes e pesadas; pode ser dobrada e colocada em uma pequena bolsa de transporte. Isso é ótimo para mochileiros e campistas que precisam reduzir o peso e o tamanho de seu equipamento. Seja você acampando na floresta ou apenas indo para a casa de um amigo para uma noite de sono, mantenha esta cama de lona à mão, e uma boa noite de sono nunca estará longe. Uma noite de sono tranquila é essencial após um dia cheio de aventuras ao ar livre, e nós cuidamos disso com a melhor cama de descanso da natureza. A nossa maca de camping individual XIEHE MEDICAL foi projetada pensando no seu conforto; a cama ampla e de largura total é feita com uma superfície de tecido respirável que torna o sono mais confortável. A ergonomia cuidadosamente pensada desta maca oferece excelente suporte, permitindo que você relaxe e se recarregue para encarar as aventuras do próximo dia! Chega das difíceis e desconfortáveis colchonetes para dormir e boas-vindas a uma boa noite de sono (sim, existe UMA MACA DE DORMIR PARA VOCÊ com este confortável colchão de camping). Quando se trata de equipamentos para atividades ao ar livre em geral, o fator mais importante é a durabilidade e qualidade. A maca de camping individual da XIEHE MEDICAL é construída com materiais de qualidade para garantir um uso duradouro. Seja acampando em climas quentes e úmidos ou em uma noite fria, esta maca suportará as intempéries. Esta maca de camping superior manterá você confortável em todas aquelas ótimas experiências ao ar livre pelos anos vindouros, com os devidos cuidados e manutenção. Adquira uma maca durável e confortável para um sono tranquilo com a Maca de Camping Individual XIEHE MEDICAL! Se você é um comprador atacadista em busca de equipamentos de camping baratos, então a maca de camping XIEHE MEDICAL single é a sua escolha perfeita. Não é um preço ruim... é um ótimo custo-benefício por um produto sólido – resistente no design, mas ainda portátil – uma cama que balança!! Seja para equipar sua loja de varejo ou serviço de aluguel, esta maca de camping irá satisfazer seus clientes sem pesar no bolso. Projetada para impressionar os clientes com um pacote de camping acessível e durável que completará sua experiência ao ar livre. Xiehe Medical Apparatus Instruments — maca de acampamento individual para comercialização e vendas globais. Ao longo dos últimos 10 anos de trabalho e com o apoio de parceiros, atualmente contamos com mais de 30 distribuidores em todo o mundo. Nossos produtos estão disponíveis em mais de 120 países. Concentramo-nos em criar parcerias de longo prazo com integradores e distribuidores, a fim de construir juntos o futuro. A Hehe Medical Equipment prioriza a satisfação do cliente e esforça-se para cumprir, com excelência e confiabilidade, a maca de acampamento individual dos clientes. Nossos funcionários entusiasmados e nossa tecnologia colaborativa permitem-nos prestar serviços próximos e atentos aos clientes, assegurando que suas necessidades sejam eficazmente atendidas. Esforçamo-nos para estabelecer uma cooperação de longo prazo e estável com nossos clientes e fornecer-lhes produtos e serviços de alta qualidade por meio de trabalho em equipe e suporte técnico. A Xiehe Medical Apparatus & Instruments dedica-se continuamente à pesquisa e desenvolvimento criativos, comprometendo-se a oferecer produtos com pontos de venda competitivos. Patentes e propriedade intelectual protegidas abrangem macas de acampamento individuais, itens de primeiros socorros, mobiliário hospitalar e produtos funerários. Os produtos são projetados para acompanhar as tendências atuais e atender às necessidades de nossos clientes. São apreciados tanto por clientes nacionais quanto internacionais. Como fabricante profissional de equipamentos médicos, a Xiehe Medical Apparatus Instruments fornece produtos de alta qualidade e serviços especializados. Implementamos rigorosamente o sistema de controle de qualidade ISO13485, e todos os nossos produtos são certificados pelo TUV, CE, FDA, entre outros. Temos uma equipe dedicada à maca de camping individual que pode responder rapidamente às necessidades dos clientes, fornecendo produtos de alta qualidade e estáveis. Quando você precisar de uma maca de ambulância ou mobiliário dobrável para hospitais e itens funerários, a Xiehe Medical Equipment tem a solução.macã de camping individual
Design Leve e Compacto para Fácil Transporte

Macio de Acampamento Confortável para uma Noite Repousante de Sono

Qualidade Confiável e Material Durável para Uso em Ambientes Externos

Solução Ideal para Compradores Atacadistas que Buscam Equipamentos de Acampamento Acessíveis
Why choose - Não.
macã de camping individual?
Rede de comercialização global e parceiros estáveis
Serviço pós-venda rápido e apoio técnico centrado no cliente
Pontos de venda de I&D inovadores e produtos
Produtos de alta qualidade e serviços especializados
Categorias de produtos relacionadas
Não encontrou o que procura?
Solicitar Orçamento Agora
Entre em contato com nossos consultores para mais produtos disponíveis.Entre em contato