【问题标题】:Javascript assign a class that doesn't exist to a variableJavascript将不存在的类分配给变量
【发布时间】:2020-04-09 05:29:04
【问题描述】:

点击此按钮后:

var option_btn = document.querySelectorAll('[class*="sp_choice_type"]')[1]

以下按钮将在网络中可用:

var refuse = document.querySelector('[class*="priv-reject-btn"]')[0]

但是在点击那里之前不可用,下面这段代码将不起作用:

var option_btn = document.querySelectorAll('[class*="sp_choice_type"]')[1]
option_btn.addEventListener('click', ()=>{
    setTimeout(()=>{
        var refuse = document.querySelector('[class*="priv-reject-btn"]')[0];
        refuse.addEventListener('click',() =>{
            console.log("Eureka")
    })
    }, 5000)
})

我也尝试过一些 Promises,但也没有成功。

该案例位于 zonebourse.com 网站中,按钮选项来自 botton 免责声明和“Tout 拒绝者”,该按钮在单击选项后触发

【问题讨论】:

  • 你有没有试过在你的代码中设置一个断点来检查refuse FOR SURE 没有得到正确的圆顶元素?
  • querySelector 不返回列表,您不应该将其编入索引。
  • 所以它应该只是document.querySelector(...)document.querySelectorAll(...)[0]
  • @Barmar 他正在使用 querySelectorAll 实际上返回一个列表
  • @huhnmonster 不在设置refuse的那一行。

标签: javascript


【解决方案1】:

如果没有看到您所面临问题的有效示例,就很难确定问题是什么。当用户单击另一个按钮(按钮 A)并在按下按钮 B 时执行操作时,您似乎正在尝试向页面添加一个新按钮(按钮 B)。考虑到这一点,这里有一个向页面添加按钮并在单击该新按钮时执行操作的示例。代码已注释,但如果您有任何问题或不清楚的地方,请告诉我,我会改进我的答案。

// find all option buttons
var options = document.querySelectorAll('.option');
// loop over all option buttons
[...options].forEach((opt) => {
  //  wire event handler for click
  opt.addEventListener('click', (e) => {
    // check if we have already added the button
    if (!e.target.actionButton) {
      // return a promise instead of setTimeout for better async
      return new Promise((resolve, reject) => {
        // create the new button
        var btn = document.createElement("button");
        // pull out the option attribute to make it easier to reference later
        var optionAttr = e.target.getAttribute('data-option')
        // store the option for this button
        btn.setAttribute('data-option', optionAttr);
        // wire the click handler for this button
        btn.addEventListener('click', (ev) => {
          // get the option
          var option = ev.target.getAttribute('data-option');
          // just log for now
          console.log(`you clicked ${option}`)
        });
        // set the text of the button
        btn.innerHTML = `Action Button ${optionAttr}`;
        // store a reference to the action button on the option button
        e.target.actionButton = btn;
        // append the new action button to the action button container
        document.querySelector('#buttons').append(btn);
        // resolve the promise
        resolve();
      });
    }
  })
});
button {
  display: inline-block;
  margin: .5em;
  padding: .5em;
}

#buttons button {
  display: inline;
  margin: .5em;
  padding: .5em;
}
<button class="option" data-option="1">
Option 1
</button>
<button class="option" data-option="2">
Option 2
</button>
<div id="buttons">

</div>

【讨论】:

  • 非常感谢您的解释以及我应该如何解释问题的反馈。事情是这样的:我想与两个按钮进行交互,确切地说,但有一些棘手的问题:第二个按钮没有在代码中定义,它只会在单击第一个按钮后出现,因此当你尝试用一些代码抓取它,你会得到一个错误。
  • 我不确定我是否理解您的情况;当您说第二个按钮时,您是在谈论按钮 B(示例中的操作按钮)还是另一个按钮 A(示例中的选项按钮)?
  • 点击此按钮后:screencast.com/t/4KeoEsvK此按钮将在iframe中可用screencast.com/t/GPFPzkGflV1j iframe的代码将在单击第一个按钮后触发,因此无法抓取第二个按钮。
  • 好的,这是一个完全不同于我想象的问题。并不是说第二个按钮在 DOM 中不存在,问题是第二个按钮将在用户单击第一个按钮时加载的 IFrame 中呈现,对吗?
  • 如果是这种情况,那么您将需要查看postMessage 模式以在 IFrame 和主机之间进行通信。 Here 是一个 SO 帖子,询问 MDN 文章是否不够时的实现细节。
猜你喜欢
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2018-01-11
  • 1970-01-01
  • 2014-04-23
  • 2014-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多