Skip to content

JavaScript

放一些浏览器 / Node / 前端 JavaScript 小片段,目标也是复制后直接改

浏览器批量点击模板

js
const nodeList = document.querySelectorAll('.icon-cover');

nodeList.forEach(node => {
  node.querySelector('span')?.click();
});

fetch 超时模板

js
async function fetchWithTimeout(url, options = {}, timeout = 5000) {
  const controller = new AbortController();
  const timer = setTimeout(() => controller.abort(), timeout);

  try {
    const response = await fetch(url, {
      ...options,
      signal: controller.signal,
    });

    if (!response.ok) {
      throw new Error(`HTTP ${response.status}`);
    }

    return await response.json();
  } finally {
    clearTimeout(timer);
  }
}

URL 参数模板

js
const query = {
  pageNo: 1,
  pageSize: 20,
  userName: 'jerry',
};

const search = new URLSearchParams(
  Object.entries(query).filter(([, value]) => value !== undefined && value !== null && value !== '')
).toString();

const url = `/api/users?${search}`;

localStorage 安全读写模板

js
function setStorageJSON(key, value) {
  localStorage.setItem(key, JSON.stringify(value));
}

function getStorageJSON(key, defaultValue = null) {
  const raw = localStorage.getItem(key);
  if (!raw) {
    return defaultValue;
  }

  try {
    return JSON.parse(raw);
  } catch (error) {
    console.error(`parse storage failed: ${key}`, error);
    return defaultValue;
  }
}

复制到剪贴板模板

js
async function copyText(text) {
  if (navigator.clipboard?.writeText) {
    await navigator.clipboard.writeText(text);
    return;
  }

  const textarea = document.createElement('textarea');
  textarea.value = text;
  textarea.style.position = 'fixed';
  textarea.style.opacity = '0';
  document.body.appendChild(textarea);
  textarea.select();
  document.execCommand('copy');
  document.body.removeChild(textarea);
}

下载 Blob 文件模板

js
function downloadBlob(blob, fileName) {
  const url = URL.createObjectURL(blob);
  const a = document.createElement('a');
  a.href = url;
  a.download = fileName;
  a.click();
  URL.revokeObjectURL(url);
}

async function exportExcel() {
  const response = await fetch('/api/report/export');
  const blob = await response.blob();
  downloadBlob(blob, 'report.xlsx');
}

Node 读取环境变量模板

js
function requireEnv(name) {
  const value = process.env[name];
  if (!value) {
    throw new Error(`missing env: ${name}`);
  }
  return value;
}

const appId = requireEnv('APP_ID');
const appSecret = requireEnv('APP_SECRET');
最近更新