千千块模板|思源笔记实时查看股票数据

千千块模板 | 思源笔记实时查看股票数据

image.png

五档实时更新版

image.png

自定义 js 代码

功能说明:

代码用户配置区

1.将你的股票代码输入用户配置区(支持多个股票数据实时更新)

2.可以设置数据自动更新的间隔

注意代码前要写上 sh 为上海 sz 为深圳 例如 sh600519 这样才算完整的股票代码

如果不知道是哪的话

https://stockapp.finance.qq.com/mstats/ 搜一下股票代码,然后网页的网址就会显示

例如 https://gu.qq.com/sz000858/gp 则股票代码为 sz000858

// --- 样式设置 ---
// 给整个块容器一些基本样式
this.style.backgroundColor = '#f8f9fa';
this.style.padding = '8px';
this.style.borderRadius = '8px';
this.style.fontFamily = '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif';
this.style.border = '1px solid #dee2e6';

// --- 用户配置区 ---
// 1. 在下面的数组中添加您想关注的股票代码
const stockCodes = [
    'sz000858', // 五粮液
    'sh600519', // 贵州茅台
    'sz300750', // 宁德时代
];

// 2. 设置数据自动更新的间隔(单位:秒)
//    设置为 0 或负数则不自动更新
const refreshIntervalSeconds = 3;

// --- 数据获取与渲染 ---

// 先清空块内容,准备初始化
this.innerHTML = '';

// 遍历配置的股票代码,为每只股票创建占位容器
stockCodes.forEach((stockCode, index) => {
    const stockElement = document.createElement('div');
    stockElement.id = `stock-container-${stockCode}`;
    stockElement.style.padding = '12px 16px'; // 调整内边距
    if (index < stockCodes.length - 1) {
        stockElement.style.borderBottom = '1px solid #e9ecef';
    }
    stockElement.innerHTML = `<div style="color: #6c757d; font-size: 0.9em;">正在加载 ${stockCode}...</div>`;
    this.appendChild(stockElement);
});


// 定义一个函数,用于更新单个股票的数据
const updateStockData = async (stockCode) => {
    const stockElement = this.querySelector(`#stock-container-${stockCode}`);
    if (!stockElement) return;

    const url = `http://qt.gtimg.cn/q=${stockCode}`;

    try {
        const response = await fetch(url);
        if (!response.ok) throw new Error(`网络服务错误 (${response.status})`);

        const buffer = await response.arrayBuffer();
        const decoder = new TextDecoder('gbk');
        const textData = decoder.decode(buffer);

        const parts = textData.split('~');
        if (parts.length < 46) throw new Error(`无效的代码或API响应不完整`);
  
        // --- 提取所有详细信息 ---
        const stockName = parts[1];
        const currentPrice = parseFloat(parts[3]).toFixed(2);
        const prevClose = parseFloat(parts[4]).toFixed(2);
        const openPrice = parseFloat(parts[5]).toFixed(2);
        const priceChange = parseFloat(parts[31]).toFixed(2);
        const percentChange = parseFloat(parts[32]).toFixed(2);
        const highPrice = parseFloat(parts[33]).toFixed(2);
        const lowPrice = parseFloat(parts[34]).toFixed(2);
        const volume = (parseFloat(parts[6]) / 10000).toFixed(2); // 万手
        const amount = (parseFloat(parts[37]) / 10000).toFixed(2); // 亿元
        const turnover = parseFloat(parts[38]).toFixed(2) + '%';
        const peRatio = parseFloat(parts[39]).toFixed(2);
        const amplitude = parseFloat(parts[43]).toFixed(2) + '%';
        const marketCap = parseFloat(parts[45]).toFixed(2) + '亿';

        let color = '#343a40';
        if (priceChange > 0) color = '#dc3545';
        else if (priceChange < 0) color = '#28a745';
  
        // --- 生成全新的紧凑型HTML布局 ---
        const stockHTML = `
            <div style="display: flex; justify-content: space-between; align-items: center; width: 100%;">
          
                <!-- 左侧: 名称, 价格, 涨跌 -->
                <div style="flex-grow: 1; min-width: 0;">
                    <div style="display: flex; align-items: baseline; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;">
                        <h3 style="margin: 0; font-size: 1.15em; color: #212529;">${stockName}</h3>
                        <p style="margin: 0 0 0 8px; color: #6c757d; font-size: 0.85em;">${stockCode.toUpperCase()}</p>
                    </div>
                    <div style="text-align: left; margin-top: 4px;">
                        <span style="font-size: 2em; font-weight: 500; color: ${color};">${currentPrice}</span>
                        <span style="margin-left: 10px; font-size: 1em; color: ${color};">
                            <span>${priceChange > 0 ? '+' : ''}${priceChange}</span>
                            <span style="margin-left: 5px;">(${priceChange > 0 ? '+' : ''}${percentChange}%)</span>
                        </span>
                    </div>
                </div>

                <!-- 右侧: 其他所有详细信息 -->
                <div style="display: grid; grid-template-columns: repeat(2, auto); gap: 4px 14px; font-size: 0.8em; color: #495057; text-align: left; margin-left: 16px;">
                    <span><strong>今开:</strong> ${openPrice}</span>
                    <span><strong>昨收:</strong> ${prevClose}</span>
                    <span style="color: #c82333;"><strong>最高:</strong> ${highPrice}</span>
                    <span style="color: #218838;"><strong>最低:</strong> ${lowPrice}</span>
                    <span><strong>换手:</strong> ${turnover}</span>
                    <span><strong>振幅:</strong> ${amplitude}</span>
                    <span><strong>成交额:</strong> ${amount}亿</span>
                    <span><strong>总市值:</strong> ${marketCap}</span>
                </div>
            </div>
        `;
        stockElement.innerHTML = stockHTML;

    } catch (error) {
        stockElement.innerHTML = `
            <div style="color: #d9534f; padding: 12px 0; font-size: 0.9em;">
                <strong>${stockCode.toUpperCase()} 加载失败:</strong> ${error.message}
            </div>
        `;
        console.error(`Stock block error for ${stockCode}:`, error);
    }
};

// 定义一个函数来触发所有股票的更新
const fetchAllStocks = () => {
    stockCodes.forEach(updateStockData);
};

// 1. 立即执行一次,加载初始数据
fetchAllStocks();

// 2. 如果设置了刷新间隔,则启动定时器
if (refreshIntervalSeconds > 0) {
    // 在定时器句柄前加一个简单的检查,防止重复创建
    if (!this.stockUpdateTimer) {
        this.stockUpdateTimer = setInterval(fetchAllStocks, refreshIntervalSeconds * 1000);
    }
}

五档实时更新版

// --- 样式设置 ---
// 给整个块容器一些基本样式
this.style.backgroundColor = '#f8f9fa';
this.style.padding = '8px';
this.style.borderRadius = '8px';
this.style.fontFamily = '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif';
this.style.border = '1px solid #dee2e6';

// --- 用户配置区 ---
// 1. 在下面的数组中添加您想关注的股票代码
const stockCodes = [
    'sz000858', // 五粮液
    'sh600519', // 贵州茅台
    'sz300750', // 宁德时代
];

// 2. 设置数据自动更新的间隔(单位:秒)
//    设置为 0 或负数则不自动更新
const refreshIntervalSeconds = 3;

// --- 数据获取与渲染 ---

// 先清空块内容,准备初始化
this.innerHTML = '';

// 遍历配置的股票代码,为每只股票创建占位容器
stockCodes.forEach((stockCode, index) => {
    const stockElement = document.createElement('div');
    stockElement.id = `stock-container-${stockCode}`;
    stockElement.style.padding = '12px 16px';
    if (index < stockCodes.length - 1) {
        stockElement.style.borderBottom = '1px solid #e9ecef';
    }
    stockElement.innerHTML = `<div style="color: #6c757d; font-size: 0.9em;">正在加载 ${stockCode}...</div>`;
    this.appendChild(stockElement);
});


// 定义一个函数,用于更新单个股票的数据
const updateStockData = async (stockCode) => {
    const stockElement = this.querySelector(`#stock-container-${stockCode}`);
    if (!stockElement) return;

    const url = `http://qt.gtimg.cn/q=${stockCode}`;

    try {
        const response = await fetch(url);
        if (!response.ok) throw new Error(`网络服务错误 (${response.status})`);

        const buffer = await response.arrayBuffer();
        const decoder = new TextDecoder('gbk');
        const textData = decoder.decode(buffer);

        const parts = textData.split('~');
        if (parts.length < 50) throw new Error(`无效的代码或API响应不完整`);
    
        // --- 提取核心信息 ---
        const stockName = parts[1];
        const currentPrice = parseFloat(parts[3]).toFixed(2);
        const prevClose = parseFloat(parts[4]).toFixed(2);
        const openPrice = parseFloat(parts[5]).toFixed(2);
        const volume = (parseInt(parts[6]) / 10000).toFixed(1); // 万手
        const time = parts[30];
        const priceChange = parseFloat(parts[31]).toFixed(2);
        const percentChange = parseFloat(parts[32]).toFixed(2);
        const highPrice = parseFloat(parts[33]).toFixed(2);
        const lowPrice = parseFloat(parts[34]).toFixed(2);
        const amount = (parseFloat(parts[37]) / 10000).toFixed(2); // 亿元
        const turnover = parseFloat(parts[38]).toFixed(2) + '%';
        const peRatio = parseFloat(parts[39]).toFixed(2);
        const amplitude = parseFloat(parts[43]).toFixed(2) + '%';
        const circulatingMarketCap = parseFloat(parts[44]).toFixed(2) + '亿';
        const marketCap = parseFloat(parts[45]).toFixed(2) + '亿';
        const pbRatio = parseFloat(parts[46]).toFixed(2);
    
        const formatTime = (ts) => {
            if (!ts || ts.length !== 14) return '';
            return `${ts.substring(8, 10)}:${ts.substring(10, 12)}:${ts.substring(12, 14)}`;
        };
        const formattedTime = formatTime(time);

        // --- 提取买卖盘信息 ---
        const sellLevels = [
            { price: parseFloat(parts[19]).toFixed(2), volume: parseInt(parts[20]) }, // 卖一
            { price: parseFloat(parts[21]).toFixed(2), volume: parseInt(parts[22]) }, // 卖二
            { price: parseFloat(parts[23]).toFixed(2), volume: parseInt(parts[24]) }, // 卖三
            { price: parseFloat(parts[25]).toFixed(2), volume: parseInt(parts[26]) }, // 卖四
            { price: parseFloat(parts[27]).toFixed(2), volume: parseInt(parts[28]) }, // 卖五
        ];
        const buyLevels = [
            { price: parseFloat(parts[9]).toFixed(2), volume: parseInt(parts[10]) },
            { price: parseFloat(parts[11]).toFixed(2), volume: parseInt(parts[12]) },
            { price: parseFloat(parts[13]).toFixed(2), volume: parseInt(parts[14]) },
            { price: parseFloat(parts[15]).toFixed(2), volume: parseInt(parts[16]) },
            { price: parseFloat(parts[17]).toFixed(2), volume: parseInt(parts[18]) },
        ];


        let color = '#343a40';
        if (priceChange > 0) color = '#dc3545';
        else if (priceChange < 0) color = '#28a745';
    
        // --- 生成包含三栏信息的HTML布局 ---
        const stockHTML = `
            <div style="display: flex; justify-content: space-between; align-items: center; width: 100%;">
            
                <!-- 左侧: 名称, 价格, 涨跌 -->
                <div style="flex-grow: 1; min-width: 0; max-width: 240px;">
                    <div style="font-size: 0.75em; color: #6c757d; margin-bottom: 4px;">更新: ${formattedTime}</div>
                    <div style="display: flex; align-items: baseline; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;">
                        <h3 style="margin: 0; font-size: 1.15em; color: #212529;">${stockName}</h3>
                        <p style="margin: 0 0 0 8px; color: #6c757d; font-size: 0.85em;">${stockCode.toUpperCase()}</p>
                    </div>
                    <div style="text-align: left; margin-top: 4px;">
                        <span style="font-size: 2em; font-weight: 500; color: ${color};">${currentPrice}</span>
                        <span style="margin-left: 10px; font-size: 1em; color: ${color};">
                            <span>${priceChange > 0 ? '+' : ''}${priceChange}</span>
                            <span style="margin-left: 5px;">(${priceChange > 0 ? '+' : ''}${percentChange}%)</span>
                        </span>
                    </div>
                </div>

                <!-- 中间: 买卖盘 (修正顺序) -->
                <div style="flex-shrink: 0; margin: 0 16px; font-size: 0.8em; width: 170px;">
                    ${sellLevels.slice().reverse().map((level, i) => `
                        <div style="display: flex; justify-content: space-between; color: #495057;">
                            <span style="width: 25%;">卖${5 - i}</span>
                            <span style="width: 40%; text-align: right; color: #28a745;">${level.price}</span>
                            <span style="width: 35%; text-align: right;">${level.volume}</span>
                        </div>
                    `).join('')}
                    <div style="height: 1px; background-color: #e9ecef; margin: 2px 0;"></div>
                    ${buyLevels.map((level, i) => `
                        <div style="display: flex; justify-content: space-between; color: #495057;">
                            <span style="width: 25%;">买${i + 1}</span>
                            <span style="width: 40%; text-align: right; color: #dc3545;">${level.price}</span>
                            <span style="width: 35%; text-align: right;">${level.volume}</span>
                        </div>
                    `).join('')}
                </div>

                <!-- 右侧: 其他详细信息 (按要求重新布局) -->
                <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 4px 14px; font-size: 0.8em; color: #495057; text-align: left; min-width: 240px;">
                    <span><strong>昨 收:</strong> ${prevClose}</span>
                    <span><strong>今 开:</strong> ${openPrice}</span>
                    <span style="color: #c82333;"><strong>最 高:</strong> ${highPrice}</span>
                    <span style="color: #218838;"><strong>最 低:</strong> ${lowPrice}</span>
                
                    <span><strong>成交量:</strong> ${volume}万手</span>
                    <span><strong>成交额:</strong> ${amount}亿</span>
                    <span><strong>总市值:</strong> ${marketCap}</span>
                    <span><strong>流通值:</strong> ${circulatingMarketCap}</span>
                
                    <span><strong>换手率:</strong> ${turnover}</span>
                    <span><strong>市净率:</strong> ${pbRatio}</span>
                    <span><strong>振 幅:</strong> ${amplitude}</span>
                    <span><strong>市盈率:</strong> ${peRatio}</span>
                </div>
            </div>
        `;
        stockElement.innerHTML = stockHTML;

    } catch (error) {
        stockElement.innerHTML = `
            <div style="color: #d9534f; padding: 12px 0; font-size: 0.9em;">
                <strong>${stockCode.toUpperCase()} 加载失败:</strong> ${error.message}
            </div>
        `;
        console.error(`Stock block error for ${stockCode}:`, error);
    }
};

// 定义一个函数来触发所有股票的更新
const fetchAllStocks = () => {
    stockCodes.forEach(updateStockData);
};

// 1. 立即执行一次,加载初始数据
fetchAllStocks();

// 2. 如果设置了刷新间隔,则启动定时器
if (refreshIntervalSeconds > 0) {
    if (!this.stockUpdateTimer) {
        this.stockUpdateTimer = setInterval(fetchAllStocks, refreshIntervalSeconds * 1000);
    }
}

专业版

// --- 样式设置 ---
// 给整个块容器一些基本样式
this.style.backgroundColor = '#f8f9fa';
this.style.padding = '8px';
this.style.borderRadius = '8px';
this.style.fontFamily = '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif';
this.style.border = '1px solid #dee2e6';

// --- 用户配置区 ---
// 1. 在下面的数组中添加您想关注的股票代码
const stockCodes = [
    'sz000858', // 五粮液
    'sh600519', // 贵州茅台
    'sz300750', // 宁德时代
];

// 2. 设置数据自动更新的间隔(单位:秒)
//    设置为 0 或负数则不自动更新
const refreshIntervalSeconds = 3;

// --- 数据获取与渲染 ---

// 先清空块内容,准备初始化
this.innerHTML = '';

// 遍历配置的股票代码,为每只股票创建占位容器
stockCodes.forEach((stockCode, index) => {
    const stockElement = document.createElement('div');
    stockElement.id = `stock-container-${stockCode}`;
    stockElement.style.padding = '12px 16px';
    if (index < stockCodes.length - 1) {
        stockElement.style.borderBottom = '1px solid #e9ecef';
    }
    stockElement.innerHTML = `<div style="color: #6c757d; font-size: 0.9em;">正在加载 ${stockCode}...</div>`;
    this.appendChild(stockElement);
});


// 定义一个函数,用于更新单个股票的数据
const updateStockData = async (stockCode) => {
    const stockElement = this.querySelector(`#stock-container-${stockCode}`);
    if (!stockElement) return;

    const url = `http://qt.gtimg.cn/q=${stockCode}`;

    try {
        const response = await fetch(url);
        if (!response.ok) throw new Error(`网络服务错误 (${response.status})`);

        const buffer = await response.arrayBuffer();
        const decoder = new TextDecoder('gbk');
        const textData = decoder.decode(buffer);

        const parts = textData.split('~');
        if (parts.length < 75) throw new Error(`无效的代码或API响应不完整`);
      
        // --- 提取核心信息 ---
        const stockName = parts[1];
        const currentPrice = parseFloat(parts[3]).toFixed(2);
        const prevClose = parseFloat(parts[4]).toFixed(2);
        const openPrice = parseFloat(parts[5]).toFixed(2);
        const volume = parseInt(parts[6]);
        const outerPlate = parseInt(parts[7]);
        const innerPlate = parseInt(parts[8]);
        const time = parts[30];
        const priceChange = parseFloat(parts[31]).toFixed(2);
        const percentChange = parseFloat(parts[32]).toFixed(2);
        const highPrice = parseFloat(parts[33]).toFixed(2);
        const lowPrice = parseFloat(parts[34]).toFixed(2);
        const amount = (parseFloat(parts[37]) / 10000).toFixed(2); // 亿元
        const turnover = parseFloat(parts[38]).toFixed(2) + '%';
        const peRatioStatic = parseFloat(parts[39]).toFixed(2);
        const amplitude = parseFloat(parts[43]).toFixed(2) + '%';
        const circulatingMarketCap = parseFloat(parts[44]).toFixed(2) + '亿';
        const marketCap = parseFloat(parts[45]).toFixed(2) + '亿';
        const pbRatio = parseFloat(parts[46]).toFixed(2);
        const upperLimit = parseFloat(parts[47]).toFixed(2);
        const lowerLimit = parseFloat(parts[48]).toFixed(2);
        const volumeRatio = parseFloat(parts[49]).toFixed(2);
        const orderDiff = parts[50];
        const avgPrice = parseFloat(parts[51]).toFixed(2);
        const peRatioDynamic = parseFloat(parts[52]).toFixed(2);
        const orderRatio = parseFloat(parts[74]).toFixed(2) + '%'; // 修正委比索引
      
        const formatTime = (ts) => {
            if (!ts || ts.length !== 14) return '';
            return `${ts.substring(8, 10)}:${ts.substring(10, 12)}:${ts.substring(12, 14)}`;
        };
        const formattedTime = formatTime(time);

        // --- 提取买卖盘信息 ---
        const sellLevels = [
            { price: parseFloat(parts[27]).toFixed(2), volume: parseInt(parts[28]) },
            { price: parseFloat(parts[25]).toFixed(2), volume: parseInt(parts[26]) },
            { price: parseFloat(parts[23]).toFixed(2), volume: parseInt(parts[24]) },
            { price: parseFloat(parts[21]).toFixed(2), volume: parseInt(parts[22]) },
            { price: parseFloat(parts[19]).toFixed(2), volume: parseInt(parts[20]) },
        ];
        const buyLevels = [
            { price: parseFloat(parts[9]).toFixed(2), volume: parseInt(parts[10]) },
            { price: parseFloat(parts[11]).toFixed(2), volume: parseInt(parts[12]) },
            { price: parseFloat(parts[13]).toFixed(2), volume: parseInt(parts[14]) },
            { price: parseFloat(parts[15]).toFixed(2), volume: parseInt(parts[16]) },
            { price: parseFloat(parts[17]).toFixed(2), volume: parseInt(parts[18]) },
        ];


        let color = '#343a40';
        if (priceChange > 0) color = '#dc3545';
        else if (priceChange < 0) color = '#28a745';
      
        // --- 生成包含三栏信息的HTML布局 ---
        const stockHTML = `
            <div style="display: flex; justify-content: space-between; align-items: center; width: 100%;">
              
                <!-- 左侧: 名称, 价格, 涨跌 -->
                <div style="flex-grow: 1; min-width: 0; max-width: 240px;">
                    <div style="font-size: 0.75em; color: #6c757d; margin-bottom: 4px;">更新: ${formattedTime}</div>
                    <div style="display: flex; align-items: baseline; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;">
                        <h3 style="margin: 0; font-size: 1.15em; color: #212529;">${stockName}</h3>
                        <p style="margin: 0 0 0 8px; color: #6c757d; font-size: 0.85em;">${stockCode.toUpperCase()}</p>
                    </div>
                    <div style="text-align: left; margin-top: 4px;">
                        <span style="font-size: 2em; font-weight: 500; color: ${color};">${currentPrice}</span>
                        <span style="margin-left: 10px; font-size: 1em; color: ${color};">
                            <span>${priceChange > 0 ? '+' : ''}${priceChange}</span>
                            <span style="margin-left: 5px;">(${priceChange > 0 ? '+' : ''}${percentChange}%)</span>
                        </span>
                    </div>
                </div>

                <!-- 中间: 买卖盘 -->
                <div style="flex-shrink: 0; margin: 0 16px; font-size: 0.8em; width: 170px;">
                    ${sellLevels.map((level, i) => `
                        <div style="display: flex; justify-content: space-between; color: #495057;">
                            <span style="width: 25%;">卖${5 - i}</span>
                            <span style="width: 40%; text-align: right; color: #28a745;">${level.price}</span>
                            <span style="width: 35%; text-align: right;">${level.volume}</span>
                        </div>
                    `).join('')}
                    <div style="height: 1px; background-color: #e9ecef; margin: 2px 0;"></div>
                    ${buyLevels.map((level, i) => `
                        <div style="display: flex; justify-content: space-between; color: #495057;">
                            <span style="width: 25%;">买${i + 1}</span>
                            <span style="width: 40%; text-align: right; color: #dc3545;">${level.price}</span>
                            <span style="width: 35%; text-align: right;">${level.volume}</span>
                        </div>
                    `).join('')}
                </div>

                <!-- 右侧: 其他详细信息 -->
                <div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 4px 14px; font-size: 0.8em; color: #495057; text-align: left; min-width: 320px;">
                    <span><strong>今开:</strong> ${openPrice}</span>
                    <span style="color: #c82333;"><strong>最高:</strong> ${highPrice}</span>
                    <span><strong>涨停:</strong> ${upperLimit}</span>
                  
                    <span><strong>昨收:</strong> ${prevClose}</span>
                    <span style="color: #218838;"><strong>最低:</strong> ${lowPrice}</span>
                    <span><strong>跌停:</strong> ${lowerLimit}</span>

                    <span><strong>成交量:</strong> ${(volume / 10000).toFixed(2)}万</span>
                    <span><strong>成交额:</strong> ${amount}亿</span>
                    <span><strong>换手:</strong> ${turnover}</span>
                  
                    <span><strong>外盘:</strong> ${outerPlate}</span>
                    <span><strong>内盘:</strong> ${innerPlate}</span>
                    <span><strong>振幅:</strong> ${amplitude}</span>
                  
                    <span><strong>量比:</strong> ${volumeRatio}</span>
                    <span><strong>委差:</strong> ${orderDiff}</span>
                    <span><strong>委比:</strong> ${orderRatio}</span>

                    <span><strong>市盈(静):</strong> ${peRatioStatic}</span>
                    <span><strong>市盈(动):</strong> ${peRatioDynamic}</span>
                    <span><strong>市净率:</strong> ${pbRatio}</span>

                    <span><strong>流通值:</strong> ${circulatingMarketCap}</span>
                    <span><strong>总市值:</strong> ${marketCap}</span>
                    <span><strong>均价:</strong> ${avgPrice}</span>
                </div>
            </div>
        `;
        stockElement.innerHTML = stockHTML;

    } catch (error) {
        stockElement.innerHTML = `
            <div style="color: #d9534f; padding: 12px 0; font-size: 0.9em;">
                <strong>${stockCode.toUpperCase()} 加载失败:</strong> ${error.message}
            </div>
        `;
        console.error(`Stock block error for ${stockCode}:`, error);
    }
};

// 定义一个函数来触发所有股票的更新
const fetchAllStocks = () => {
    stockCodes.forEach(updateStockData);
};

// 1. 立即执行一次,加载初始数据
fetchAllStocks();

// 2. 如果设置了刷新间隔,则启动定时器
if (refreshIntervalSeconds > 0) {
    if (!this.stockUpdateTimer) {
        this.stockUpdateTimer = setInterval(fetchAllStocks, refreshIntervalSeconds * 1000);
    }
}

终极版

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    28444 引用 • 119764 回帖
  • 千千块
    25 引用 • 61 回帖
  • 千千插件

    千千块(自定义块 css 和 js)
    可以用 ai 提示词来无限创作思源笔记

    32 引用 • 69 回帖
  • 千千模板
    1 引用 • 4 回帖
3 操作
lovexmm521 在 2025-09-27 13:53:02 更新了该帖
lovexmm521 在 2025-09-27 13:39:22 更新了该帖
lovexmm521 在 2025-09-27 11:40:01 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
lovexmm521 MOD
窈窕淑女,君子好逑 爱发电:https://afdian.com/a/QianQian517

推荐标签 标签

  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 444 关注
  • gRpc
    11 引用 • 9 回帖 • 116 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    19 引用 • 23 回帖 • 770 关注
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 633 关注
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 517 关注
  • OpenCV
    15 引用 • 36 回帖 • 1 关注
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    119 引用 • 54 回帖
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 51 关注
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    105 引用 • 908 回帖 • 1 关注
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 56 关注
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    51 引用 • 200 回帖 • 2 关注
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    151 引用 • 257 回帖 • 1 关注
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 133 关注
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖 • 1 关注
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 384 回帖
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 299 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    12 引用 • 5 回帖 • 660 关注
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 430 关注
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖 • 3 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    78 引用 • 37 回帖
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 668 关注
  • 负能量

    上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)

    89 引用 • 1251 回帖 • 376 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    176 引用 • 544 回帖
  • 工具

    子曰:“工欲善其事,必先利其器。”

    308 引用 • 773 回帖
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    35 引用 • 468 回帖 • 768 关注
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    386 引用 • 1892 回帖 • 1 关注