不能在函数外部使用 const/var

Can't use const/var outside of a function

提问人:Adi Lasri 提问时间:8/23/2023 最后编辑:mplungjanAdi Lasri 更新时间:8/23/2023 访问量:72

问:

这是一个在 Tampermonkey 上运行的 javascript 脚本

我不能在定时函数之外使用我的 const idElement。

我需要在 sendEmail 函数中使用我的 get 值。我不能在 sendEmail 函数中使用 getElementbyId,我必须放置 I 计时器,因为我需要使用此脚本的页面加载非常奇怪(连续 3 或 4 次)。

当我将 sendEmail 放入 timed 函数时,值在 in 中。

我尝试将 sendEmail 放入定时函数中,但我需要一个按钮来启动 sendEmail,而不是定时。

“recup”之所以出现,是因为试图验证我是否可以使用它(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';

  const idElement = "rien";

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

  window.addEventListener('load', function() {
    // Utilisez setTimeout pour afficher le message après 1 minute (60000 millisecondes)
    setTimeout(function() {
      const idElement = document.getElementById('application-AccessManagement-Display-component---accessManagementPhase--accessmanagement_01_01_01-defaultXML--internationalCode-inner').value;
      console.log(idElement);
      return 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) {
    var destinataire = 'kevin';
    var recipient = '[email protected]';
    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;
  };

  // Ajouter l'événement de clic au bouton
  emailButton.addEventListener('click', sendEmail(idElement));

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

JavaScript HTML 计时器 getelementbyid mailto

评论


答:

0赞 mplungjan 8/23/2023 #1

改变

emailButton.addEventListener('click', sendEmail(idElement));

emailButton.addEventListener('click', () => { sendEmail() });

或者只是

emailButton.addEventListener('click', sendEmail);

由于您立即调用 sendmail,因此您可以添加事件 -

然后更改为并让函数访问全局变量。function sendEmail(idElement) {function sendEmail() {

然后,还要从函数内部删除 并将全局变量更改为constconst idElementlet idElement

我已将超时更改为间隔,因此它将每秒检查一次元素是否存在,并在存在时停止

我还把所有东西都包装在DOMContentLoaded中,因为它更有意义

(function() {
  'use strict';
  window.addEventListener('DOMContentLoaded', function() {
    // 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 idElement = "rien"; // accessible from the whole IIFE


    // Utilisez setTimeout pour afficher le message après 10 secondes
    let tId = setInterval(function() {
      const element = document.getElementById('application-AccessManagement-Display-component---accessManagementPhase--accessmanagement_01_01_01-defaultXML--internationalCode-inner');
      if (element) {
        idElement = element.value; // set the global value
        console.log(idElement);
        emailButton.style.backgroundColor = '#38a832';
        clearInterval(tId)
      }
    }, 1000);


    // 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() {
      var destinataire = 'kevin';
      var recipient = '[email protected]';
      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'; // from the global variable
      body += 'Variable 2 : ' + variable2 + '\n';
      body += 'Variable 3 : ' + variable3 + '\n';

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

    // Ajouter l'événement de clic au bouton
    emailButton.addEventListener('click', sendEmail);
  });

})();

评论

0赞 Adi Lasri 8/23/2023
感谢您的回答!但可悲的是,它没有奏效。该按钮消失,控制台中没有任何内容。我认为主要问题是 Tampermonkey 是我用来启动 js 的 chrome 扩展程序
0赞 Adi Lasri 8/23/2023
update : without “ window.addEventListener('DOMContentLoaded', function() {}); ”按钮会回来,但 IdElement 不会像开头那样工作