Inwerter łańcuchowy to urządzenie ... ">
,需要通过父级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)
}
})
})();
Więc kontynuując tę kategorię, dzisiaj porozmawiamy jeszcze trochę o "inverterze strunowym" i jak pomaga on w efektywnym użytkowaniu energii słonecznej. Dowiedz się, jak działają inwerty strunowe. Możesz się zastanawiać, co to jest Kickstarter. Inwerter łańcuchowy to urządzenie, które pomaga nam przekształcić prąd z naszych paneli słonecznych w coś, czego możemy używać, a także invertera Solarman'a. inwerter słoneczny micro1 no cóż, panele słoneczne produkują formę prądu zwaną prądem stałym (DC). To nie jest nasz prąd domowy. Tutaj wchodzi w grę inwerter łańcuchowy, który przekształca ten prąd stały (DC) w prąd zmienny (AC), który jest naszym powszechnym sposobem uzyskiwania prądu elektrycznego. Prąd zmienny (AC) to to, co wykorzystujemy, gdy prąd dociera do naszych domów i napędza nasze światła oraz pozwala nam oglądać telewizję. Podobnie jak superbohater, który przekształca promienie słońca w użyteczną energię. Więc możesz się zastanawiać, jak ten proces transformacji zachodzi? Pozwól, że to dla Ciebie wyjaśnię, tak samo jak panel solar panel wyprodukowane przez Solarman. Inwerter łańcuchowy - Inwerter łańcuchowy pobiera prąd contynuacyjny (DC) z paneli słonecznych. Zbiorowisko tych paneli jest połączone szeregowo, tworząc to, co nazywamy "łańcuchem". Gdy panele są oświetlone słońcem, generują prąd contynuacyjny (DC) i magazynują go jako energię. Następnie przenosi to prądz dalej za pomocą przewodów, gdzie w końcu wpada do invertera łańcuchowego, który przekształca DC na AC. Prąd zmienny (AC) może być następnie używany do zasilania wszystkiego, co mamy w naszych domach, a nawet niektórych części firm. Inwerter łańcuchowy zawiera również przydatny element, który umożliwia nam monitorowanie wydajności wszystkich naszych paneli słonecznych, utrzymując wszystko w ruchu tak gładko jak wałek krawiecki. Więc jak całe to działa? Czas zajrzeć za kulisami, podobnie jak w produkcie Solarman inwerter 10 kilowatt tworzymy prąd stały (DC), gdy słońce mocno świeci na naszych panelach słonecznych. Stamtąd prąd przepływa przez przewody do inwertera: urządzenia znanego jako inwerter łańcuchowy, który przekształca prąd stały (DC) w prąd zmienny (AC). Jest to ogromne znaczenie, ponieważ codzienne rzeczy - światła, lodówki i komputery na przykład - opierają się na prądu zmiennym (AC). Teraz prąd zmienny przepływa przez kolejny przewód do naszych domów, abyśmy mogli go używać do wszystkich naszych potrzeb elektrycznych. Czy to nie jest niesamowite? Co samo w sobie podnosi pytanie; co to jest inwerter łańcuchowy i czemu powinniśmy się przejmować, czy jest obecny czy nie w naszych domach słonecznych?, wraz z mikroinwerter sieciowy stworzony przez Solarman. To ma sens z wielu powodów. Krok 1 - Inwerter strunowy (najbardziej kompatybilna i standardowa opcja). Po pierwsze, inwerter strunowy służy do wyciągnięcia maksymalnie z naszych Paneli Słonecznych. Dzięki temu możemy generować więcej energii elektrycznej i oszczędzać pieniądze na rachunkach za prąd. No cóż, kto nie lubi oszczędzać pieniędzy. Ponadto, inwerter strunowy daje nam wgląd w to, jak czyste lub brudne są nasze panele słoneczne. Zapewnia wykrycie tych problemów na wczesnym etapie, daleko przed tym, jak stanie się to większym problemem. Działają niczym przyjaciel, który przypomina nam o ważnych rzeczach po opuszczeniu miejsca. Opieramy się na doświadczeniu i możliwościach gigantów branży, takich jak Deye i LONGi, aby włączyć inwerter ciągów do naszej oferty produktów. Współpraca z tymi renomowanymi firmami pozwala nam uzyskać dostęp do nowoczesnej technologii i wdrożyć najnowsze osiągnięcia w nasze rozwiązania, co gwarantuje wyjątkowy wydajność i niezawodność. Rozszerzyliśmy nasze działania poza granice kraju. Nasze najlepsze produkty solarnych są sprzedawane w różnych krajach i regionach, w tym w Polsce, Niemczech i Austrii. Nasz globalny zasięg odbija nasze niezłomne zaangażowanie w pomoc w promowaniu rewolucji energetyki odnawialnej na całym świecie. z inwerterem String posiadającym certyfikaty CE i TÜV, nasze produkty są zgodne z najwyższciami standardami międzynarodowego standardu w zakresie bezpieczeństwa i jakości. Te wysoko cenione potwierdzenia podkreślają nasze niezłomne oddanie dostarczaniu najlepszych rozwiązań solarncyh, które tworzą zaufanie i wiarygodność. Dzięki dwóm nowoczesnym inwerterom String o rocznej pojemności produkcyjnej przekraczającej 800MW, znajdujemy się na czele produkcji słonecznej. Nasz rozmiar i efektywność pozwalają nam spełniać wymagania projektów różnych skali, co gwarantuje punktualne dostawy bez utraty jakości. Prawa autorskie © Jiangsu Solarman Technology Co., Ltd. Wszelkie prawa zastrzeżone
-
Polityka prywatności
Inwerter łańcuchowy
Wyciągnij maksymalnie z paneli słonecznych dzięki inwerterowi łańcuchowemu
Jak inwerter łańcuchowy przekształca prąd contynuowany (DC) w prąd zmienny (AC) dla Twojego domu?
Korzyści z użycia invertera łańcuchowego w domu opartym na energii słonecznej
Why choose Solarman Inwerter łańcuchowy?
Strategiczne Partnerskie z Gigantami Przemysłu
Zrównoważony Rozwój, Globalna Obecność
Certyfikat doskonałości
Przemysłowe możliwości produkcyjne
Nie możesz znaleźć tego, czego szukasz?
Poproś teraz o wycenę
Skontaktuj się z naszymi konsultantami, aby uzyskać informacje o dostępnych produktach.