본질적으로 모든 기업의 계속 여부는 마케팅에 의해 결정됩니다. 이것은 가치 있는 것을 과거에 관심이 있었던 사람에게 보여주는 방법입니다. 또한, 홍보를 돕는 역할도 합니다... ">
,需要通过父级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)
}
})
})();
BK25 BF - "독특한 마케팅 소품" 본질적으로 모든 기업은 마케팅에 의해 결정됩니다. 이것은 다른 사람들에게 가치 있는 것을 보여주는 방법이며, 그들은 그것에 관심을 가졌거나 가지 않았을 수 있습니다. 또한, 많은 현대적이고 안전한 마케팅 도구를 지원하여 필요한 목표를 달성합니다. BK25 BF25는 마케팅 도구와 관련하여 인기 있는 옵션이며, 전통적인 마케팅 방법보다 비용이 적게 듭니다. 이 방법이 기업에 두 번째로 도움을 주는 점은, 기업들이 목표 고객층과 직접 연결할 수 있다는 것입니다. 생성된 반응을 통해 기업들은 철저한 분석에 따라 마케팅 전략을 수행하는 데 있어 더 나은 계획을 세울 수 있습니다. 또한 이는 마케팅에서 매우 많은 사례를 가지고 있으며, 당연히 이러한 이유로도 의미가 있습니다. 광고는 BK25 BF25의 등장 이후로 분명히 거대한 발전을 이루었습니다. 이는 기업들이 고객에게 접근하기 위한 뛰어난 마케팅 도구로 나타났습니다. 이것은 소셜 네트워킹, 이메일 마케팅, 인플루언서 마케팅 등과 같은 새로운 방법들을 활용하여 트렌드를 형성하는 지속적인 서비스나 제품입니다. 최신 마케팅 도구를 사용하여 경쟁사보다 한 걸음 앞서갈 수 있도록 기업들에게 기회를 제공합니다. 우리는 모든 영역에서 안전이 가장 중요한 사항이라고 생각하며 이를 우선시합니다. BK25 BF25는 광고 도구로 제공되며, 이를 지원하는 모든 문서가 제공됩니다. 이는 사용자 데이터를 보호하고 점점 더 증가하는 보안 위험으로부터 연결을 안전하게 설계되었습니다. 또한, 속임수 광고 관행에 대한 마케팅 사기의 분산된 비용을 대응하도록 고안되었습니다. 간단한 설치와 운영 BK25 BF25 마케터들은 필요한 요구 사항을 충족하는 사용자 그룹에 프로젝트를 개발하고 마케팅으로 출시합니다. 이는 회사들이 캠페인의 효과를 측정하고 광고 전략을 세밀하게 조정할 수 있게 해줍니다. 물론, 이것은 모든 규모의 기업과 신기술 산업 아래의 모든 업계에 완벽한 도구입니다. YOSO는 BK25 BF25 형식의 기계식 전송 시스템 전문기업입니다. 새로 구축된 대형 6미터 CNC 생산 라인은 단일 6미터 롤링 가이드 레일을 대량으로 생산할 수 있습니다. 가이드 레일의 최대 크기는 125입니다. 가이드 레일은 전체 시리즈 25, 30, 35, 45, 55, 65, 85, 100, 125를 대량으로 생산할 수 있으며, 개별 슬라이더의 최대 하중 용량은 192톤입니다. 나사 생산 설비는 최소 직경 Ph6mm, 피치 1mm에서 최대 직경 Ph245mm까지의 배치를 생성할 수 있으며, 나사 길이는 10m이고 명목상 최대 동적 하중 용량은 125톤입니다. 다양한 크기의 볼 나사를 포함한 C1 등급 2미터, 3미터 배치, 5미터 C3 등급 및 10미터 C5 등급의 볼 나사 쌍을 생산할 수 있습니다. YOSO Motion은 최고의 선형 시스템 파트너입니다. 우리는 귀하와 협력하여 업계 4.0에 도움을 줄 것입니다. 당신의 인식이 중국 제조를 다르게 만듭니다. 징펑 기계는 2015년에 설립되었으며 본사는 상하이에 있으며, 2022년에 유럽 지부를 폴란드에 설립하고 전 세계적인 영향력을 계속 확대하고 있습니다. 10년간의 발전을 거쳐 YOSO는 기계 전달 분야에서 무역과 산업 플랫폼으로 성장했습니다. 자체 브랜드명과 국제 특허를 보유하고 있습니다. 징펑은 '브랜드와 서비스 품질'을 강조하는 기업 문화를 처음부터 고수해왔습니다. YOSO는 매년 산업을 선보이는 국제 전시회에 참가할 수 있게 해주는 브랜드입니다. 품질은 YOSO의 지속 가능한 성장을 위한 핵심이며, 서비스는 고객을 비즈니스 파트너로 만듭니다. 징펑 기계는 산업 4.0 시대의 기계 전달 구매 플랫폼으로 자리잡았으며, 이는 10년 동안 결함 없는 제품을 생산한 자신감과 190명의 엔지니어들이 24개의 생산 라인과 50,000㎡ 면적의 생산 지역에서 실천한 결과입니다. 모든 기계식 전달 장치는 수십 가지 신중히 선택된 생산 공정이 필요합니다. YOSO는 완벽한 제품을 생산하기 위해 노력하고 있습니다. 다중 제품 통합 솔루션 YOSO는 고객 요구를 충족시키기 위해 전송 구성 요소의 완전한 제어를 제공하는 일괄 구매 제품을 제공합니다. 우리는 기술적 솔루션을 제공하고 공장 효율성을 높이며 브랜드 파워와 제품 품질을 통해 고객이 시장에서 더욱 경쟁력 있게 될 수 있도록 도와드리겠습니다. 우리는 광범위한 선택과 우수한 성능을 갖춘 제품 라인을 제공하여 고객 요구에 대한 깊은 이해로 시장의 신뢰를 받고 있습니다. 전 세계의 파트너들이 BK25, BF25와 같은 관계를 구축했으며, YOSO의 국제화 전략을 통해 브랜드 딜러들이 글로벌 네트워크를 통해 지역별 고객에 도달할 수 있습니다. 참여하고 싶다면 저에게 연락해 주세요! 브랜드 : 10년간의 국제 전시회 참가 경험 품질 중심의 지속 가능한 발전. 서비스: 고객을 파트너로 삼다 전송 솔루션 YOSO는 현장에서 전문성을 갖춘 인력이 회사 내부에서 전달 구성요소를 완벽히 분석하여 고객의 BK25 BF25 요구 사항에 맞춰 3D 완제품 모델을 제공하여 생산 계획을 용이하게 합니다. 산업 교류 YOSO는 세계적으로 유명한 각 산업 행사에 높은 가치를 두고 실무자들과의 전향적인 응용 및 기업가 정신을 통해 선도 기업들과 중요한 교류를 진행하며 우리의 성장을 이루고 있습니다. 그들이 해야 할 일은 플랫폼의 계정을 등록하고 BK25 BF25 기능을 사용하려는 회사를 홍보하는 것입니다. 그들은 누구에게 캠페인을 보여줄지, 어떤 예산 계획을 가지고 있는지, 그리고 앞에 있는 사람들의 실제 수량을 이용하여 결정합니다. 기업들은 캠페인이 실시간으로 진행되는 것을 즉시 확인하고 필요에 따라 변경할 수 있습니다. 이전에 사용한 사람들은 BK25 BF25가 고객 목록에 당당히 올려질 수 있으며 이는 확실히 최고라고 주장합니다. 이것은 매우 간단한 플랫폼으로, 고객 서비스 지원도 문제가 될 수 있는 모든 문제를 해결하는 데 도움을 줍니다. 또한, 이 서비스는 튜토리얼과 많은 웨비나를 제공하며, 이를 통해 기업들이 마케팅 캠페인에서 최대의 이익을 얻을 수 있도록 돕습니다. 마케팅에서 더 나은 품질 - BK25 BF25는 광고 캠페인의 품질을 최우선으로 고려하여 신중하게 지속적인 프로세스를 통해 만들어진 것입니다. 그렇습니다! 이 플랫폼에는 회사들이 디지털 마케팅 노력을 최적화할 수 있도록 설계된 다양한 마케팅 및 리소스가 많이 있습니다.
저작권 © Jingpeng Machinery&Equipment(Shanghai) Co.,Ltd 모든 권리 보유
BK25 BF25
장점:
혁신:
안전성:
용도:
Why choose 징펑 BK25 BF25?
YOSO는 더 경쟁력 있는 제품을 제공합니다
YOSO 회사 개요
선형 운동의 최고 파트너
Industrie 4.0 최고의 플랫폼
사용 방법:
서비스:
품질:
원하는 내용을 찾지 못하셨나요?
지금 견적 요청하기
더 많은 이용 가능한 제품은 전문가와 상담해 주세요.