Dizge tersine çeviri cihazı bir ... ">
,需要通过父级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)
}
})
})();
Bu kategoriyi devam ettirerek, bugün "string inverter" hakkında ve nasıl solar enerjiyi iyi kullanmamıza yardımcı olduklarını daha fazla konuşacağız. String inverter nasıl çalıştığını öğrenin. Belki de bir Kickstarter'in ne olduğunu merak ediyorsunuz. Bir dizge tersine çevirici, güneş panellerimizden elde ettiğimiz elektriği kullanabileceğimiz bir şeye dönüştürmemize yardımcı olan bir ekipman parçasıdır ve aynı zamanda Solarman'ın da olduğu gibi. solar inverter micro1 . Peki, güneş panelleri doğrudan akım (DC) olarak bilinen bir elektrik türü üretir. Bu ev elektrikimiz değil. İşte burada dizge tersine çeviri cihazı görev yapar, bu DC elektriklerini evlerimize gelen elektrik akımı olan AC gücüne dönüştürür. Evlerimize giren ve ışıklarımızı yakıp televizyonumuza izin veren enerji budur. Bir süper kahraman gibi, güneşi enerjiye dönüştürür. O halde kafanda şu soru belki de şu anda: Bu dönüşüm nasıl oluyor? Sana açıklayayım, tam olarak panel güneş paneli solarman tarafından yapıldı. String Inverter - String inverter, güneş panellerinden gelen DC elektrik alır. Bu panellerin bir koleksiyonu, sıralar halinde bağlanarak "string" olarak adlandırdığımız bir yapıyı oluşturur. Paneller ışıkla temasa geldiğinde DC elektrik üretir ve bu enerjiyi depolar. Daha sonra bu elektriği kablolardan geçirerek uzaklara taşır ve sonunda string inverter'da DC'yi AC'ye dönüştürür. Bu şekilde elde edilen AC elektriği, evlerimizdeki her şeyi çalıştırmak için kullanılabilir ve hatta bazı işletmelerin bölümlerini de destekleyebilir. Ayrıca, string inverter tüm güneş panellerimizin performansını izlememizi sağlayan pratik bir bileşen içerir ve her şeyi bir Singer iplik bobini gibi düzgün çalışır durumda tutar. Peki bütün bunlar nasıl yapılır? Arkaya geçme vakti, Solarman ürünleriyle tamamen aynı şekilde. 10 kilowatt inverter . Parlatıcı güneş ışığına sahip olduğumuzda güneş panellerimiz aracılığıyla DC elektrik oluşturuyoruz. Oradan elektriğin bir tersine çeviriciye, bilinen adıyla bir string tersine çeviri donanımına akmasıyla DC'nin AC'ye dönüştürülmesi sağlanıyor. Bu, ışıklar, buzdolapları ve bilgisayarlar gibi günlük eşyaların AC elektriğine bağlı olması nedeniyle büyük bir gelişme. Şimdi bu AC elektriği başka bir kablo vasıtasıyla evlerimize akarak tüm elektrik gereksinimlerimizi karşılamamız için kullanılmaktadır. Harika değil mi? Bu da şu soruyu ortaya çıkarır: Bir string tersine çevirici nedir ve güneşli evlerimizde var olup olmadığından mı umursamalıyız?, beraberinde mikro iğne devre çevirici solarman tarafından geliştirildi. Bu, birçok nedenle pek çok anlam ifade eder. Adım 1 - Bir String Inverter (En Uyumlu ve Standart Seçenek) İlk olarak, bir string inverter, güneş panellerimizden en fazla faydalanmak için kullanılır. Böylece daha fazla elektrik üretir ve elektrik faturalarından dolayı iyi para tasarrufu sağlarız, Peki, kim para tasarrufundan hoşlanmaz? Ayrıca, string inverter bize güneş panellerimizin ne kadar temiz veya kirli olduğunu gösterir. Bu sayede bu sorunları daha büyük bir problem seviyesine ulaşmadan önce erken tespit ediyoruz. Onlar sadece biz yeri terkettikten sonra önemli şeylerden bahsetmemize yardımcı olan bir arkadaş gibi hareket ederler. Deye ve LONGi gibi endüstri devlerinin deneyimi ve yeteneklerine güveniyoruz. String tersine çeviri ünitelerimizle ürün portföyümüzü geliştirmekteyiz. Bu ünlü şirketlerle çalışmak bize modern teknolojiye ulaşmamızı ve çözümlerimize en yeni gelişmeleri entegre etmemizi sağlar, bu da eşsiz performans ve güvenilirlik garanti eder. Operasyonlarımızı ulusal sınırların ötesine taşıdık. En iyi güneş enerji ürünlerimiz Polonya, Almanya ve Avusturya dahil olmak üzere çeşitli ülkeler ve bölgelere satılmaktadır. Küresel varlığımız, dünya genelinde yeşil enerji devrimini ilerletmeye olan azimimizi yansıtmaktadır. string inverter ile holding ce ve tuv sertifikasyonları ve tuv sertifikasyonları, ürünlerimiz uluslararası güvenlik ve kalite standartlarının en yüksek standartlarına uygun. Bu çok saygın onaylar, üst düzey güneş enerji çözümleri sunmamıza olan kararlılığımızı vurguluyor. Her yıl 800MW'yi aşan üretim kapasitesine sahip iki adet modern String inverter ile, güneş enerjisi üretiminin öncü konumundayız. Boyutlarımız ve verimlilik bizi küçük ve büyük projelerin taleplerini karşılayabilme yeteneği kazandırıyor ve bu da kalite kaybetmeden zamanında teslimatı garanti ediyor. Telif Hakkı © Jiangsu Solarman Technology Co.,Ltd. Tüm Hakları Saklıdır
-
Gizlilik Politikası
Dizisel tersleyici
Bir String Inverter ile Güneş Panellerinden En Fazla Yarar Çıkarın
Bir String Inverter DC Gücünü Eviniz İçin AC'ye Nasıl Dönüştürür?
Bir Güneş Enerjili Ev için String Inverter'in Avantajları
Why choose Solarman Dizisel tersleyici?
Sektör Devleriyle Stratejik Ortaklıklar
Sürdürülebilir Büyüme, Küresel Ulaşımlılık
Sertifikalı mükemmellik
Sektörde Öncü Üretim Kapasitesi
Aradığınız şeyi bulamadınız mı?
Şimdi Fiyat Alın
Daha fazla ürün seçeneği için danışmanlarımızla iletişime geçin.