95598智能互动网站打印按钮

在95598智能互动网站的指定元素旁边添加一个打印按钮

// ==UserScript==
// @name         95598智能互动网站打印按钮
// @namespace    your-namespace
// @version      2.2
// @description  在95598智能互动网站的指定元素旁边添加一个打印按钮
// @match        https://www.95598.cn/osgweb/electricityCharge*
// @grant        none
// @license MIT
// ==/UserScript==

(function() {
    'use strict';
    // 定义存储结果的数组
    let result = [];
    // 模拟点击某个元素
    function simulateClick(element) {
        const event = new MouseEvent('click', {
            bubbles: true,
            cancelable: true,
            view: window
        });
        element.dispatchEvent(event);
    }
    // 异步函数,用于模拟点击并获取目标元素
    async function simulateClickAndGetElement(element, findElement, index) {
        return new Promise((resolve, reject) => {
            // 模拟点击
            simulateClick(element);

            // 延时一定时间等待点击事件完成
            setTimeout(() => {
                // 获取具有 class 为 el-table__row expanded 的 tr 元素
                const targetTr = findElement.querySelector('tr.el-table__row.expanded');

                if (targetTr) {
                    // 获取同级下一个 tr 元素
                    const nextTr = targetTr.nextElementSibling;

                    if (nextTr) {
                        // 处理下一个 tr 元素
                        //console.log(nextTr);
                        // 等待点击后的元素出现
                        const pList = nextTr.querySelector('td > div > div.drop-box-left')
                        // 谷电
                        const lowEl = pList.querySelector('p:nth-child(1) span.num')
                        const lowNum = lowEl ? lowEl.innerText.trim() : '';
                        //console.log(lowNum)
                        // 峰电
                        const highEl = pList.querySelector('p:nth-child(3) span.num')
                        const highNum = highEl ? highEl.innerText.trim() : '';
                        resolve({highNum, lowNum});
                    } else {
                        console.log('没有找到下一个 tr 元素',index)
                        resolve({highNum:'0',lowNum:'0'});
                    }
                } else {
                    console.log('没有找到满足条件的 tr 元素',index)
                    resolve({highNum:'0',lowNum:'0'});
                }

            }, 100); // 延时0.1秒等待点击事件完成
        });
    }
    // 创建打印按钮
    const printButton = document.createElement('button');
    printButton.innerHTML = '打印JSON';
    printButton.style.marginLeft = '10px';

    // 打印按钮的点击事件处理程序
    printButton.addEventListener('click', async function() {
        // 获取tbody元素
        // #pane-second > div:nth-child(2) > div.about > div.el-table.about-table.trcen.el-table--fit.el-table--enable-row-hover.el-table--enable-row-transition > div.el-table__body-wrapper.is-scrolling-none > table > tbody
        // #pane-second > div:nth-child(2) > div.about > div.el-table.about-table.trcen.el-table--fit.el-table--enable-row-hover.el-table--enable-row-transition > div.el-table__body-wrapper.is-scrolling-none > table > tbody
        const tbody = document.querySelector('#pane-second > div:nth-child(2) > div.about > div.el-table.about-table.trcen.el-table--fit.el-table--enable-row-hover.el-table--enable-row-transition > div.el-table__body-wrapper.is-scrolling-none > table > tbody');
        if (!tbody) {
            alert("没有找到表格页面,请切换到日用电量")
            console.warn("没有找到表格页面,请切换到日用电量")
            return
        }
        // 获取所有tr标签
        const trList = tbody.querySelectorAll('tr');
        result=[]

        for (let i = 0; i < trList.length; i++) {
            const tr = trList[i];
            let date = ""
            // 获取日期数据
            const firstTd = tr.querySelector('td:nth-child(1) div');
            if (firstTd) {
                // 处理第一个td元素
                date = firstTd ? firstTd.innerText.trim() : '';
            }

            // 获取电表度数数据
            let reading = ""
            // 获取日期数据
            const secondTd = tr.querySelector('td:nth-child(2) div');
            if (secondTd) {
                // 处理第一个td元素
                reading = secondTd ? secondTd.innerText.trim() : '';
            }


            const thirdTd = tr.querySelector('td:nth-child(3) div div');
            const {lowNum, highNum} = await simulateClickAndGetElement(thirdTd, tbody, i)
            //console.log(highNum)
            // 组成对象并添加到结果数组
            result.push({ date, reading, lowNum, highNum });
        }

        // 返回结果数组
        console.log(result);
        alert("获取数据完成")
    });

    function copyData (type=1) {
        if (result.length===0){
            console.log("已复制到粘贴板");
        }
        let csvContent = "";

        result.forEach(obj => {
            const { date, highNum, lowNum, reading } = obj;
            if (type===1){
                //csvContent += `${date}	${highNum}	${lowNum}	${reading}\n`;
                csvContent += `${date}\n`;
            }
            if (type===2){
                //csvContent += `${date}	${highNum}	${lowNum}	${reading}\n`;
                csvContent += `${highNum}\n`;
            }
            if (type===3){
                //csvContent += `${date}	${highNum}	${lowNum}	${reading}\n`;
                csvContent += `${lowNum}\n`;
            }
            if (type===4){
                //csvContent += `${date}	${highNum}	${lowNum}	${reading}\n`;
                csvContent += `${reading}\n`;
            }
        });

        // 创建一个文本区域元素来存储转换后的数据
        const textarea = document.createElement("textarea");
        textarea.value = csvContent;

        // 添加文本区域元素到页面中
        document.body.appendChild(textarea);

        // 选择文本区域中的内容
        textarea.select();
        textarea.setSelectionRange(0, textarea.value.length);

        // 复制内容到粘贴板
        document.execCommand("copy");

        // 移除文本区域元素
        document.body.removeChild(textarea);

        console.log("已复制到粘贴板");
    }

    // 创建复制日期按钮
    const copyDateButton = document.createElement('button');
    copyDateButton.innerHTML = '复制日期';
    copyDateButton.style.marginLeft = '10px';

    // 按钮的点击事件处理程序
    copyDateButton.addEventListener('click', async function() {
        copyData(1)
    })
    // 创建复制峰电按钮
    const copyHighButton = document.createElement('button');
    copyHighButton.innerHTML = '复制峰电';
    copyHighButton.style.marginLeft = '10px';

    // 按钮的点击事件处理程序
    copyHighButton.addEventListener('click', async function() {
        copyData(2)
    })
    // 创建复制谷电按钮
    const copyLowButton = document.createElement('button');
    copyLowButton.innerHTML = '复制谷电';
    copyLowButton.style.marginLeft = '10px';

    // 按钮的点击事件处理程序
    copyLowButton.addEventListener('click', async function() {
        copyData(3)
    })
    // 创建复制总电按钮
    const copyTotalButton = document.createElement('button');
    copyTotalButton.innerHTML = '复制总电';
    copyTotalButton.style.marginLeft = '10px';

    // 按钮的点击事件处理程序
    copyTotalButton.addEventListener('click', async function() {
        copyData(4)
    })

    // 获取指定元素
    function getTargetElement () {
        return document.querySelector("#app > div > div > article > div > div > div.my-row.clears.content-row.cler > div > div > div.el-row > div.el-col.el-col-24.el-col-md-18.el-col-lg-19.el-col-xl-19 > div > div > div > div.right-header > h3")
        //return document.querySelector("#app > div > div > div.backdrop > div > div.my-row.clears.content-row.cler > div > div > div.el-row > div.el-col.el-col-24.el-col-md-18.el-col-lg-19.el-col-xl-19 > div > div > div > div.right-header > span.title")
        //return document.querySelector('#app > div > div.backdrop > div > div.my-row.clears.content-row.cler > div > div > div.el-row > div.el-col.el-col-24.el-col-md-18.el-col-lg-19.el-col-xl-19 > div > div > div > div.right-header > span.title');
    }

    function addPrintBtn (targetEl) {
        targetEl.parentNode.insertBefore(copyTotalButton, targetEl.nextSibling);
        targetEl.parentNode.insertBefore(copyLowButton, targetEl.nextSibling);
        targetEl.parentNode.insertBefore(copyHighButton, targetEl.nextSibling);
        targetEl.parentNode.insertBefore(copyDateButton, targetEl.nextSibling);
        targetEl.parentNode.insertBefore(printButton, targetEl.nextSibling);
    }
    function removeEl () {
        const elementToModify = document.querySelector("#main > div > div:nth-child(1) > div > ul > div > li:nth-child(1) > span:nth-child(2)");

        if (elementToModify) {
            elementToModify.textContent = "****************";
            console.log("内容已成功修改");
        } else {
            console.log("未找到要修改内容的元素");
        }
    }
    console.log("loading")

    // 等待页面加载完成
    function waitForPageLoad() {
        if (document.readyState === 'complete') {
            // 页面加载完成后执行查找元素的操作
            onMounted();
        } else {
            // 等待下一帧继续检查页面加载状态
            requestAnimationFrame(waitForPageLoad);
        }
    }

    function onMounted () {
        removeEl()
        let targetElement = getTargetElement()
        // 在指定元素的右边添加打印按钮
        if (targetElement) {
            addPrintBtn(targetElement)
            console.log("add success")
        }
    }


    waitForPageLoad()
})();