">
,需要通过父级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)
}
})
})();
العنوان: "قبعات الـ Dapper Dad لـ يويو تشيانشون النساء الأنيقات" تبحثين عن إكسسوار أنيق يعزز من مظهر الملابس المريحة؟ نظرة على قبعات الـ "Dad Hats" للنساء! هذه يويو تشيانشون القبعات أصبحت شائعة بشكل متزايد بين النساء اللواتي يهتممن بالموضة بسبب تنوع تصاميمها وأسلوبها الأنيق. لماذا لا نستكشف قبعات الآباء للرجال المزايا التي تقدمها قبعات الـ "Dad Caps" وكيف يمكن استخدامها لرفع مستوى أناقتك. قبعات الـ "Dad Hats" ضرورية للسيدات اللواتي يرغبن في الحفاظ على شعرهن تحت السيطرة مع الظهور بمظهر رائع. هذه يويو تشيانشون القبعات تناسب أي حجم رأس بسهولة مع حواف منحنية Adjustable Band ومرنة. بالإضافة إلى ذلك، تأتي قبعات الـ "Dad Hats" بعدد كبير من الألوان والأنماط والمATERIALS قبعة الآباء القديمة تتناسب مع أي مزاج أو زي. سواء كانت من الجينز أو القطن، الجلد أو السويدي، فإن قبعات الـ "Dad Caps" عملية وأنيقة في نفس الوقت. قدّم المطوّرون العديد من الأفكار الابتكارية التي جعلت قبعات الآباء أكثر جاذبية للنساء. تحتوي بعض قبعات الآباء على رسومات مطرزة أو مطبوعة تُعتبر غالبًا فنًا يبرز بين الحشود. يويو تشيانشون تشمل قبعات الآباء الأخرى زخارف لامعة، أو شرائح لامعة، أو تفاصيل معدنية مضيئة تضيف لمسة من الفخامة إلى أسلوبك الشخصي. الخيارات قبعات الآباء للنساء لا حدود لها استخدام قبعة الآباء لا يرفع فقط مستوى إطلالتك، بل يحميك أيضًا من الشمس. قبعات الآباء عادة ما تكون ذات حافة واسعة تغطي الوجه وتظلل العينين من الأشعة فوق البنفسجية الضارة. يويو تشيانشون تم إنتاجها بواسطة هذا أفضل قبعات الآباء مثالية لأنشطة الهواء الطلق مثل التrekking والتخييم أو التنزه. بالإضافة إلى ذلك، فإن قبعات الآباء مريحة للغاية بحيث لن تشعر بأنك ترتدي قبعة. يشعرون بالفخر بصنع قبعات عالية الجودة تكون عصرية وعملية ومتينة. قبعات البيسبول مصنوعة من مواد ذات جودة عالية وتقدم راحة عالية الجودة. القبعات المنسوجة تأتي بنطاق واسع من الأنماط والأنماط التي يمكن تكييفها وفقًا لاحتياجات العملاء المختلفين. قبعات القش مصنوعة من التحنيك الدقيق. يمكنك اختيار مجموعة متنوعة من قبعات الآباء للنساء وقبعات. قبعات الآباء للنساء بشكل منتظم يطلبها عملاؤنا لمعرفة تفضيلاتهم واحتياجاتهم. يتضمن ذلك إجراء أبحاث السوق، وحضور المعارض التجارية، وطلب التعليقات. توفر الشركة خيارات قبعات مخصصة تتيح للعملاء تخصيص القبعات بناءً على المتطلبات المحددة مثل刺brodered الشعار والتخصيص اللوني. لدى صناع قبعات الـ "Dad hats for women" فريق كفء ومهر الذي يعمل معًا لتحقيق أهداف الإنتاج. يتمتع كل عضو في الفريق بمهارات ومعرفة متخصصة، بدءًا من مرحلة التصميم الأولية وحتى التحكم في جودة الإنتاج، حيث يعمل الفريق معًا لإنتاج قبعات تلبي أعلى المعايير. عملية الشحن الخاصة بقبعات الـ "Dad hats for women" تضمن تسليم المنتجات في الوقت المناسب للعملاء حول العالم. نتعاون مع شركات معروفة لشحن القبعات عبر البحر والجو والبر. يمتلك فريق اللوجستيات خبرة في التعامل مع الشحنات الدولية، مما يضمن وصول القبعات إلى الوجهة في الوقت المناسب وفي حالة مثالية. تناسب قبعات الاب مع أي يوم خاص، سواء كنت تقوم بالمهام اليومية، أو لقاء الأصدقاء، أو التخطيط لحضور حفلة موسيقية، أو السفر. يمكنك تنسيقها مع الجينز، أو القصيرة، أو التنورات، أو الفساتين، أو حتى الملابس البحرية لإنشاء مظهر يويو تشيانشون هو بالتأكيد عصري. كما أن قبعات الاب تكمل مختلف تسريحات الشعر، مثل ذيل الحصان، الضفائر، الكعكات، أو الأمواج التي قبعة الآباء هي فضفاضة. يمكن ارتداؤها في أي وقت لأنها قد تحافظ على رأسك دافئًا في الشتاء أو باردًا في الصيف. استخدام قبعات الاب منطقي وبسيط. أولاً، اختر قبعة تناسب مزاجك أو ملابسك. بعد ذلك، ضبط يويو تشيانشون الحزام ليتناسب مع رأسك بشكل مريح. إذا كنت تريد ارتداء القبعة إلى الخلف، قم بقلب الحافة أولاً وضبط الحزام إذا لزم الأمر. إذا كنت ترتدي نظارات، تأكد من أن القبعة قبعة البيسبول للآباء لا تعوقها. وأخيراً، استمتع بإظهار قبعتك الجديدة هذه. عند التسوق لقبعات الاب، تأكد من اختيار علامة تجارية موثوقة توفر حلًا لهذا الأمر يويو تشيانشون هذا بالتأكيد جيد جدًا. ابحث عن العلامات التجارية التي تقدم مجموعة واسعة من التصاميم، ومجموعة واسعة من المواد والألوان، بالإضافة إلى التسليم السريع، والإرجاع السهل، والخدمة العملاء هذه قبعة شاحنة الاب بالتأكيد ودية. يمكنك قراءة تعليقات العملاء أو طلب الإرشادات من الأصدقاء لضمان حصولك على منتج جيد. قبعات الآباء للنساء
مقدمة:

الفوائد:

الابتكار:

الأمان:
Why choose يويو تشيانشون قبعات الآباء للنساء?
مجموعة متنوعة من منتجات القبعات ذات الجودة العالية
خدمة شاملة من محطة واحدة
فريق محترف وكفؤ
نظام لوجستي كفؤ وملائم
فئات المنتجات ذات الصلة
الاستخدام:
طريقة الاستخدام:
الخدمة:
هل لم تجد ما تبحث عنه؟
اطلب عرض سعر الآن
تواصل مع مستشارينا للحصول على منتجات متاحة أخرى.