">
,需要通过父级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)
}
})
})();
Tiêu đề: "Những Chiếc Mũ Dad Hat Tinh Tế Cho Yiwu Qianxun Phụ Nữ Thời Thượng" Đang tìm kiếm một phụ kiện vừa thời trang vừa thoải mái để bổ sung vào trang phục? Hãy xem qua nón ba ba dành cho nữ! Những chiếc Yiwu Qianxun nón này đã trở nên ngày càng phổ biến giữa các quý cô sành điệu về thời trang nhờ tính đa dụng và phong cách có thể rất thanh lịch. Tại sao chúng ta không khám phá ngay? mũ dad dành cho nam giới lợi thế của mũ lưỡi trai và cách chúng có thể được sử dụng để nâng cấp phong cách của bạn Mũ lưỡi trai chắc chắn là món đồ không thể thiếu cho phụ nữ muốn giữ tóc gọn gàng mà vẫn trông tuyệt vời. Những chiếc mũ này Yiwu Qianxun có thể phù hợp với mọi kích cỡ đầu một cách dễ dàng với phần vành cong nhẹ và dải điều chỉnh. Hơn nữa, mũ lưỡi trai có nhiều màu sắc, hoạ tiết và vintage dad cap chất liệu để phù hợp với bất kỳ tâm trạng hay trang phục nào. Từ jean đến cotton, da đến nubuck, mũ lưỡi trai vừa thực dụng vừa thời trang. Các nhà thiết kế đã đưa ra nhiều ý tưởng sáng tạo khiến mũ lưỡi trai trở nên hấp dẫn hơn đối với phụ nữ. Một số mũ lưỡi trai có họa tiết thêu hoặc in mang tính nghệ thuật giúp bạn nổi bật giữa đám đông. Các mũ khác có chi tiết sequin lấp lánh, mảnh váy lấp lánh hoặc chi tiết ánh kim loại thêm chút sang trọng cho phong cách của bạn. Các Yiwu Qianxun loại mũ dad dành cho phụ nữ không giới hạn Việc sử dụng mũ ba không chỉ làm nổi bật phong cách của bạn mà còn giúp bảo vệ bạn khỏi ánh nắng mặt trời. Mũ ba thường có vành rộng che phủ khuôn mặt và bảo vệ mắt bạn khỏi tia UV có hại. Yiwu Qianxun được sản xuất bởi này nón bố tốt nhất là đặc điểm tuyệt vời cho các hoạt động ngoài trời như leo núi, cắm trại hoặc dã ngoại. Ngoài ra, mũ ba rất thoải mái đến mức bạn sẽ không cảm thấy như mình đang đeo mũ. tự hào khi làm ra những chiếc mũ chất lượng cao, vừa thời trang vừa chức năng và bền bỉ. Những chiếc mũ baseball được làm từ vật liệu chất lượng cao mang lại sự thoải mái tốt nhất. Những chiếc mũ len có nhiều kiểu dáng và hoa văn khác nhau có thể được điều chỉnh theo nhu cầu của các khách hàng khác nhau. Những chiếc mũ rơm được làm bằng cách dệt tỉ mỉ. Bạn có thể chọn nhiều loại mũ dad cho phụ nữ hoặc mũ thường. mũ dad cho phụ nữ thường xuyên được khách hàng của chúng tôi đặt hàng để nhận biết được sở thích và nhu cầu của họ. Điều này bao gồm việc nghiên cứu thị trường, tham dự các hội chợ thương mại và yêu cầu phản hồi. Nhà máy cung cấp các tùy chọn mũ tùy chỉnh cho phép khách hàng tùy chỉnh mũ dựa trên các yêu cầu cụ thể, chẳng hạn như thêu logo hoặc tùy chỉnh màu sắc. nón ba ba cho phụ nữ có một đội ngũ hiệu quả và chuyên nghiệp làm việc cùng nhau để đạt được mục tiêu sản xuất. Mỗi thành viên trong đội ngũ có kỹ năng và kiến thức chuyên môn, từ giai đoạn thiết kế ban đầu đến kiểm soát chất lượng sản xuất, đội ngũ làm việc cùng nhau để tạo ra những chiếc nón đáp ứng các tiêu chuẩn cao nhất. quy trình hậu cần của nón ba ba cho phụ nữ đảm bảo sản phẩm được giao đúng thời hạn cho khách hàng trên toàn thế giới. Họ hợp tác với các công ty nổi tiếng để vận chuyển nón qua đường biển, đường hàng không và đường bộ. Đội ngũ hậu cần thành thạo trong việc xử lý các lô hàng quốc tế, đảm bảo rằng các chiếc mũ đến đích đúng giờ và trong tình trạng hoàn hảo. Mũ ba phù hợp cho bất kỳ dịp đặc biệt nào, dù bạn đang đi chợ, gặp gỡ bạn bè, tham dự buổi hòa nhạc hay du lịch. Bạn có thể kết hợp chúng với jean, quần short, váy, đồ bơi để tạo nên một phong cách này Yiwu Qianxun thật sự thời thượng. Mũ ba cũng phù hợp với nhiều kiểu tóc khác nhau, chẳng hạn như đuôi ngựa, bím, búi hoặc sóng tóc đó nón ba lê lỏng lẻo. Chúng có thể được đeo vào bất kỳ mùa nào vì chúng có thể giữ ấm đầu bạn vào mùa đông hoặc làm mát vào mùa hè. Sử dụng mũ dad là điều hợp lý và đơn giản. Trước tiên, chọn một chiếc mũ dad phù hợp với tâm trạng hoặc trang phục của bạn. Sau đó, điều chỉnh Yiwu Qianxun dây đai để vừa vặn thoải mái với đầu bạn. Nếu muốn đeo mũ ngược, hãy lật phần vành mũ trước khi điều chỉnh dây. Nếu bạn đeo kính, hãy đảm bảo rằng mũ baseball phong cách bố không cản trở chúng. Cuối cùng, hãy tự tin khoe chiếc mũ dad mới của mình và tận hưởng niềm vui. Khi mua mũ dad, hãy chắc chắn chọn một thương hiệu uy tín cung cấp giải pháp này Yiwu Qianxun là rất tốt. Tìm kiếm các thương hiệu có nhiều thiết kế, chất liệu và màu sắc đa dạng, cũng như dịch vụ giao hàng nhanh chóng, đổi trả dễ dàng và hỗ trợ khách hàng thân thiện này dad trucker hat là rất đáng tin cậy. Bạn có thể đọc đánh giá từ khách hàng hoặc hỏi ý kiến bạn bè để đảm bảo rằng bạn đang nhận được một sản phẩm tốt. Mũ dad dành cho phụ nữ
Giới thiệu:

Lợi ích:

Đổi mới:

Bảo mật:
Why choose Yiwu Qianxun Mũ dad dành cho phụ nữ?
Nhiều loại sản phẩm mũ chất lượng cao
Dịch vụ toàn diện
Đội ngũ Chuyên nghiệp và Hiệu quả
Hệ thống logistics hiệu quả và thuận tiện
Danh Mục Sản Phẩm Liên Quan
Sử dụng:
CÁCH SỬ DỤNG:
Dịch vụ:
Không Tìm Thấy Thứ Bạn Đang Tìm?
Yêu Cầu Báo Giá Ngay
Liên hệ với các chuyên gia tư vấn của chúng tôi để biết thêm sản phẩm có sẵn.