\n\n
,需要通过父级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 || nodeText || ''); if (phoneReg.test(str) && numUseReg.test(str)) { window.postMessage({ type: 'SHOPS_CONTACT_TRACK', data: { phone: nodeText, }, }, '*'); _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; if (phoneReg.test(fatherText) && numUseReg.test(fatherText)) { window.postMessage({ type: 'SHOPS_CONTACT_TRACK', data: { phone: nodeText, }, }, '*'); _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)) { window.postMessage({ type: 'SHOPS_CONTACT_TRACK', data: { email: 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')) { window.postMessage({ type: 'SHOPS_CONTACT_TRACK', data: { email: content, }, }, '*'); _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)) { window.postMessage({ type: 'SHOPS_CONTACT_TRACK', data: { email: 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)) { window.postMessage({ type: 'SHOPS_CONTACT_TRACK', data: { email: 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); } }); })();Metal brackets really matter when it comes to giving buildings solid structural support during construction work. These components do all sorts of things like helping frame structures, holding beams in place, and keeping walls stable, making buildings safer overall. The National Institute of Standards and Technology found something interesting too - adding metal brackets can actually increase how much weight a building can hold by around 30%. That kind of boost in strength shows why metal brackets stay so important in construction projects. Contractors know this well because without proper bracketing, buildings just wouldn't stand up to everyday stresses and weather conditions over time.
Metal brackets play a key role in keeping machinery stable across manufacturing environments because they cut down on vibrations while boosting how well operations run. When properly aligned, these brackets really cut down on mechanical breakdowns, which means equipment runs smoother day after day. According to research from ASME, good bracket installation can actually extend machine life by about 20%. That kind of data shows why metal brackets matter so much in manufacturing today. Reliable machines aren't just nice to have they're absolutely necessary if companies want to stay productive and keep innovating without constant downtime issues.
Metal brackets in the aerospace field get designed to handle some pretty tough situations, from intense stress to wild temperature swings. The FAA has strict rules about what these parts need to do, which means manufacturers have to use top quality materials and clever design approaches. Tests over the years show that good quality metal brackets really make a difference when it comes to keeping planes safe and performing well. These little but important parts play a big role across the whole aerospace business, making sure aircraft can keep running without issues even when faced with harsh weather or other challenging flight conditions.
L brackets have become essential components in both building construction and furniture assembly, mainly because they reinforce those tricky right angle connections so well. When properly installed, these metal brackets really increase the tensile strength of the structure, making them great for any framework that needs extra support where regular fasteners might fail. According to research from the Woodworking Institute, simply adding L brackets to joints can make those connections up to 40% more stable. That kind of improvement explains why contractors and DIY enthusiasts alike reach for L brackets whenever working on anything requiring solid structural integrity, especially when dealing with large spans or heavy loads that would otherwise stress ordinary joints beyond their limits.
In HVAC and plumbing work, U-brackets are essential for keeping ducts and pipes stable and properly aligned throughout buildings. The way these brackets are designed makes installation much easier and routine maintenance less complicated, which is why plumbers and HVAC technicians rely on them heavily in homes as well as offices and factories. According to recent studies from the National Association of Plumbing-Heating-Cooling Contractors, using standard sized U-brackets can cut down installation time around 15 percent compared to custom solutions. That kind of time saving adds up fast on job sites, reducing labor costs while getting projects completed quicker than expected. Most contractors will tell anyone who asks that good quality U-brackets are worth every penny when trying to manage budgets effectively across multiple jobs at once.
Sheet metal fabrication allows companies to create custom metal brackets exactly suited for their particular needs. Modern methods such as laser cutting combined with computer numerical control (CNC) machining deliver highly accurate results when it comes to both design specifications and actual production. Companies that go the custom route often see dramatic reductions in wasted materials while improving how efficiently they operate their facilities sometimes around 25% improvements. These savings translate into real money saved on the bottom line plus they support greener manufacturing approaches. For industries facing specialized requirements, going custom makes sense both economically and environmentally speaking.
Laser cutting with precision allows manufacturers to craft intricate bracket designs while wasting far less material than older techniques. Automotive and aerospace sectors have really benefited from this technology since exact measurements matter so much in those fields. Some studies indicate production times drop around half when switching from conventional methods to laser cutting, which explains why many shops now prefer this approach for getting things done quickly without sacrificing quality. Faster turnaround means lower expenses too, plus better end products overall. That's why more fabrication facilities are adopting laser cutting these days it just makes sense both economically and practically speaking.
CNC machining offers tremendous flexibility when it comes to making brackets that have complicated shapes and features. The process works well for both quick prototypes and large scale manufacturing runs, keeping the original design specifications intact throughout. A study from the Precision Machined Products Association actually shows that companies can save around 30% on production expenses through CNC methods. These savings come down to how accurately and efficiently the machines work, which means manufacturers get quality parts at lower prices. Most shops that need to produce metal brackets with all sorts of intricate details still rely heavily on CNC technology for their day to day operations.
Good welding makes all the difference when building metal brackets, as it creates strong joints that keep these components lasting longer. For items meant to stand up outdoors, adding coatings that resist rust becomes really important. The folks at the National Association of Corrosion Engineers say proper protection against corrosion can actually double how long products last in some cases. We see this need for toughness every day in construction sites and industrial settings where brackets get exposed to rain, salt air, and extreme temperatures. Metal structures just fall apart faster if they're not built right from the start. That's why smart manufacturers focus so much on both quality welding practices and good防腐蚀 treatments when making brackets that need to hold up over time.
Getting metal brackets to perform at their best starts with how weight gets spread out across them. When brackets are well designed, they distribute loads evenly throughout the structure, cutting down on stress points that could otherwise cause problems. The whole point really is about balance since if loads aren't distributed properly, parts tend to fail much sooner than expected. Research into this area shows that when engineers get weight distribution right, structures become about 20-25% stronger overall. That's why many manufacturing firms now prioritize load management during both planning stages and actual implementation of bracket systems.
The choice of alloy matters a lot when dealing with humid environments because it stops rust and other forms of wear from setting in. Stainless steel and aluminum stand out among options since they handle moisture pretty well. A report from Metal Alliance suggests that going with materials resistant to humidity cuts down on maintenance expenses around 20 percent over time. When manufacturers take this step early on by picking suitable alloys, they get two benefits at once longevity of components and lower costs down the road. Metal brackets made from these materials last longer even under tough weather conditions without needing constant attention or replacement.
When it comes to extending how long machines last, adding vibration dampening features to bracket designs makes all the difference. Brackets engineered specifically to cut down on vibration transmission really matter because too much shaking around tends to break things apart over time. According to maintenance reports from manufacturing plants, good vibration management actually keeps equipment running longer – some facilities report getting an extra 30% out of their machines before needing repairs. The bottom line is straightforward: better handling of vibrations means less downtime and fewer parts wearing out prematurely. For factory managers watching budgets closely, this kind of improvement represents real savings while protecting those expensive capital investments sitting on the production floor.
When it comes to lasting power and dependability, metal brackets generally beat plastic fasteners hands down, especially where real strength matters. Take industrial settings or outdoor installations for instance these metal pieces hold up against much stronger forces and all sorts of weather conditions without losing their shape or function. Engineering reports consistently show that in many situations, metal brackets will stick around about five times longer than plastic ones before showing wear and tear. That makes sense why so many construction professionals go for metal when they need something that won't give way after just a few months of use.
When it comes to holding heavy loads, metal brackets just outperform wood hands down, which is why they're so commonly used in construction sites and when putting together big machines. According to data from the Structural Engineering Institute, metal brackets actually support around three times more weight than their wooden counterparts. That kind of strength makes all the difference in situations where things need to stay stable despite heavy usage. Because of this advantage, most professionals still go for metal brackets whenever working on projects that require real durability in factories or building sites across the country.
Galvanized coatings really help protect metal brackets against rust and corrosion, which makes them great choices for those outdoor applications where Mother Nature throws everything at them. When brackets get this treatment, they tend to last much longer even when dealing with all sorts of weather beatings, so people don't have to worry about their structures failing after just a few years outside. Some research shows galvanized metal cuts down on maintenance work needed by around 40 percent or so. That means big money saved over time without compromising how strong these outdoor structures remain year after year.