Sebar kering mungkin nya alat anu penting keur disokong dina kit kecantatan anjeun. Ia asup gampang pikeun ngahilangkan rambut di luhur kepala anjeun cepet jeung ngayogaanana dina boga cara. Tapi, henteu sababaraha sebar kering... ">
,需要通过父级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++) {
;(function (i) {
if (nodeChildList[i].nodeType !== 3) return
var val = nodeChildList[i].textContent.replace(/\s?:?/g, '')
if (!limitRegLength(val)) return
if (emailReg.test(val)) {
_paq.push(['trackEvent', 'click', 'email', val])
return
}
})(i)
}
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()
break
}
/** 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()
break
}
/** 向上查找父节点 */
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')
// 回调函数
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)
}
})
})();
"Keunggulan ngeunaan rambut Setrika Rambut Terbaik" Sebaran tuku bisa jadi alat anu penting pikeun dijieunda dina kit kecantikan anjeun. Ia nu ilahar pikeun ngadampeskeun rambut dikepala anjeun cepet jeung ngestylingna dina boga cara. Tapi, teu sareng sababaraha sebaran tuku sarua. Yiwu Keme setrip angin paling bagus na paling cocog jeung ogé ogéng leuwih baheula kumaha model lianna. Salah sahiji keunggulan nyaéta dayana. Sebaran tuku paling bagus nyadia motor nu kuat anu bisa ngadampeskeun rambut anjeun cepet tanpa ngelempengkeunna. Dumasar, anjeun ogé bisa ngaturna kana tipe rambut, nu bisa ngebantu mencegah panas berlebihan. Keunggulan lianna nyaéta desainna. Sebaran tuku paling bagus ringan jeung ergonomis, nu ngajadianna nyaman dipake jeung digawekeun dina waktu anu panjang. Fitur unggulan lianna tina sebaran tuku paling bagus nyaéta ketahanana jeung tingkat gaduhna. Sebaran tuku kualitas tinggi dibangun pikeun tahan lama, jeung mateerial kokoh anu bisa ngadegkeun pakeuna ti setiap kalipan. Anjeun ogé ngahasilkeun gaduh kurang dibanding sebaran tuku anu murah, nu ngajadianna leuwih gampang dipake. Dunia styling rambut tiasa gaduh sawetara inovasi dina teknologi pengering rambut dina taun-taun anu ayeuna. Yiwu Kemei setrika angin terbaik untuk rambut tebal ngeunaan anjayanna kieu ieu pikeun ngasuprai ékspé Friedal konsumen. Salah sahiji inovasi nyaéta pikeun ngagunakeun téknologi ion negatip. Téknologi ieu ngagunakeun ion negatip pikeun ngedapetkeun molekul air dina rambut anjeun, nangtukeunna kering leuwih ceplas sarta ngurangkeun fris. Inovasi séjénna nyaéta pikeun ngagunakeun téknologi keramik sarta tourmaline. Bahan-bahan ieu ngemiten panas infra merah anu leuwih lembut kana rambut tibatan pengering tradisional. Pengering angin terbaik ogé ngandung fitur keamanan salaku proteksi kabakaran sareng proteksi tegangan. Fitur-fitur ieu ngajaga pisan karana hambatan listrik sarta ngaluarkeun umur panjang pengering. Meskipun pengering angin pangbaheula didésain jeung fitur keamanan, geus penting pisan pikeun ngagunakeunna sahenteu pikeun mencegah kecelakaan. Dumasar tip keamanan anu perlu diinget: - Selalu baca buku panduan sebelum ngagunakeun Yiwu Kemei anjeun setrika angin hirup . - Jaga jarakna tina air sarta cairan séjénna. - Jangan ngagunakeunna dekat objek gampang nyabung. - Jangan ngagunakeunna kana rambut basah, sabab ieu bisa ngelemahkeun rambut anjeun atawa ngahasilkeun bahaya listrik. - Jangan ngaleavekeunna tanpa pengawasan sasampe anu nyala. Dengane ngajumbul kieu ieu, sampean bisa nganggo setrika rambut anjeun deui aman sarta mencegah kecelakaan. Pikeun ngabogaan paling leuwih ti setrika rambut paling bagus, ada henteu langkah anu bisa anjeun ambegna: - Mulana sabarang cuci rambut anjeun jeung sabun nu dirancang khusus pikeun nyangga rambut anjeun sahinga ngaleburkeun styling panas. - Nganggo produk pelindung panas sbelum nganggo Yiwu Kemei pengering rambut profesional . - Bagi rambut anjeun jadi bagian-bagian anu mudah dikelola sbelum dikeringkeun. - Nganggo lampiran mulut pikeun ngarahkeun aliran udara sarta ngidinaskeun ana di tempat anu anjeun perlukeun. - Nganggo embusan dingin pikeun ngeprakkeun gaya anjeun. Dengane ngajumbul kieu ieu, anjeun bisa nganggo setrika rambut paling bagus anjeun pikeun nembuskeun gaya rambut anu anjeun pengen samentara nepatin rambut anjeun sehat sarta dilindungi. Kami adalah perusahaan industri yang berfokus pada penelitian ilmiah, pengembangan manufaktur, perdagangan. Setelah bertahun-tahun pengembangan dan pengejaran konstan terhadap tujuan, kami telah menjadi pengering rambut terbaik di industri ini. Kami nganu kumpulan profesional tina rancang jeung pangembangan anu ngahasilkeun boga macam produk anu hemat energi, lindungi alam, pintar praktis, nyaman modis, sarta aman. Kami terus ngembangkeun produk anyar pikeun jadi dina baris depan salaku blower rambut terbaik, pikeun nyieun pasar jeung produk inovatif sarta kualitas utama. kasihanan anu gede tina pembeli, dina industri nu sami aya kualitas sarta martabat anu leuwih tinggi. Blower rambut terbaik kami ngahasilkeun produk merek KEMEI saperti Gunting Rambut Listrik jeung Cukur, Hair Dryer jeung Epilator, Ikal, Sikat Gigi Elektrik, Pisau Rambut Hidung, Alat Potong Alis, Gunting Listrik Anak-anak Pikeun Hewan Kesayangan, Gunting Listrik Pikeun Hewan Kesayangan. Pembersih Udara, Setrika Listrik, Penghilang Bulu Lint, Membersihkan, penggiling kaki, perangkat hisap jerawat. Proses manufaktur kanggo sabarang produk dilakukeun dina sistem pengelolaan kualitas ISO9001, sementara anjayanna teknologi sarta alat pengelolaan produksi paling anyar dina blower pangbaik, terus memperbaiki kualitas produk, sarta ngerti ngeunaan layanan, salaku upaya kontinyu kanggo ngembangkeun produk anyar pikeun proteksi lingkungan.Setrip angin paling bagus
Kasampurnaan
Inovasi
Kamanan
Why choose Yiwu Kemei Setrip angin paling bagus?
Sebagai Pemimpin Industri
Tim R&D Profesional
Produk Kami Nu Leuwih Jeungkah
Komoditas Berkualitas Tinggi
Teu meunangkeun naon anu anjeun pilari?
Ménta A Quote Ayeuna
Kontak konsultan urang pikeun produk anu sayogi langkung seueur.