You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tampermonkey脚本作用域问题:如何在定时函数外使用变量

解决方案

关键问题分析

  • 定时器内部声明的const idElement是局部变量,外部无法访问;全局的idElement初始值固定,未被定时器更新。
  • 按钮点击事件绑定错误:sendEmail(idElement)会立即执行函数,而非点击时触发。

修改后的完整代码

(function() {
  'use strict';

  // Créer le bouton
  var emailButton = document.createElement('button');
  emailButton.innerText = 'Envoyer un e-mail';
  emailButton.style.position = 'fixed';
  emailButton.style.bottom = '20px';
  emailButton.style.right = '20px';
  emailButton.style.zIndex = '9999';
  emailButton.style.padding = '10px';
  emailButton.style.backgroundColor = '#a83232';
  emailButton.style.color = 'white';
  emailButton.style.border = 'none';
  emailButton.style.borderRadius = '5px';
  emailButton.style.cursor = 'pointer';

  // 改用let声明,允许后续更新值
  let idElement = "rien";

  function recup(currentId) {
    if (currentId) {
      console.log('Valeur de l\'input:', currentId);
    } else {
      console.log('Élément input introuvable.');
    }
  }

  window.addEventListener('load', function() {
    setTimeout(function() {
      // 直接更新全局作用域的idElement,而非声明局部变量
      idElement = document.getElementById('application-AccessManagement-Display-component---accessManagementPhase--accessmanagement_01_01_01-defaultXML--internationalCode-inner').value;
      console.log(idElement);
      emailButton.style.backgroundColor = '#38a832';
    }, 10000);
  });

  // Ajouter le bouton à la page
  document.body.appendChild(emailButton);

  // Fonction pour ouvrir l'application de messagerie par défaut avec des informations pré-remplies
  function sendEmail() {
    // 点击时使用当前的idElement值
    if (idElement === "rien") {
      alert("Veuillez attendre que la page charge complètement !");
      return;
    }
    
    var destinataire = 'kevin';
    var recipient = 'destinataire@example.com';
    var subject = 'Sujet de l\'e-mail';

    // Variables que vous pouvez définir
    var variable2 = 'Valeur de la variable 2';
    var variable3 = 'Valeur de la variable 3';
    // ... Ajoutez plus de variables si nécessaire

    // Corps de l'e-mail avec les variables
    var body = 'Contenu de l\'e-mail :\n\n';
    body += 'Variable 1 : ' + idElement + '\n';
    body += 'Variable 2 : ' + variable2 + '\n';
    body += 'Variable 3 : ' + variable3 + '\n';

    var mailtoLink = 'mailto:' + recipient + '?subject=' + encodeURIComponent(subject) + '&body=' + encodeURIComponent(body);
    window.location.href = mailtoLink;
  };

  // 绑定点击事件:传入回调函数,点击时执行sendEmail
  emailButton.addEventListener('click', sendEmail);

  // Appeler la fonction recup lorsque la page est complètement chargée
  // document.addEventListener('DOMContentLoaded', () => recup(idElement));
})();

核心改动说明

  1. 变量作用域调整:将全局的const idElement改为let idElement,让定时器可以更新这个变量的值,而非创建局部变量覆盖它。
  2. 定时器逻辑修正:删除无意义的return idElement,直接赋值给全局的idElement,确保外部能获取到最新的元素值。
  3. 点击事件修复:将emailButton.addEventListener('click', sendEmail(idElement))改为emailButton.addEventListener('click', sendEmail),避免函数立即执行,改为点击时触发。
  4. 添加加载状态判断:在sendEmail中增加判断,如果idElement还是初始值,提示用户等待页面加载完成,避免发送无效数据。

内容的提问来源于stack exchange,提问作者Adi Lasri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 22:17:35