停止onclick事件处理程序

时间:2020-10-16 02:00:49

标签: javascript event-handling dom-events

我有一些正在使用的工作代码,它们在稍微不同的上下文中使用。工作部分是我使用对象的onclick事件调出一个表单来发送电子邮件。当它在HTML页面中时,它可以正常工作。我会有很多看起来像这样的按钮:

<button id="mail-c1" onclick="initMailFormButton(this.id, 'someone','somedomain.com','a subject')">Someone's Name</button>

整个表单都是使用javascript创建的,并且具有自己的“提交”和“取消”按钮,但位于button元素内。为了能够将数据输入表单,我需要杀死onclick事件,然后在提交或取消电子邮件后将其还原。 onclick处理程序的开头为:

function initMailFormButton(mailId, eName, eDomain, eSubject) {
    myFormLocation = document.getElementById(mailId);
    stopFormClick(myFormLocation);

其中的stopFormClick函数为:

function stopFormClick(myFormLocation) {
    saveOnclick = myFormLocation.onclick;
    myFormLocation.onclick = null;
}

这有一个错误,即不能处理某个人一次打开多个表单的错误,但这不是我的直接关注。我将在讨论之外进行修复。

生成的表单中的“提交”和“取消”按钮均会还原onclick事件处理程序,因此您可以很开心地多次打开和关闭表单。

我的新情况是我正在从数据库生成HTML页面。我正在使用HTML数据集来存储以前的硬编码信息,如下所示:

    emailButton.setAttribute("data-mailname",   emailName);
    emailButton.setAttribute("data-maildomain", emailDomain);
    emailButton.addEventListener("click", function() { initMailFormButton(this.id, this.dataset.mailname, this.dataset.maildomain, ""); }, false);

正在检索的信息正确,并且表格显示在正确的位置。但是,我无法输入信息,因为当我在第一个表单字段中单击并生成另一个表单时,原始的onclick处理程序会启动。

我唯一的线索是,当我查看保存在静态HTML页面中的onclick事件的值时,它具有预期值,但在生成的页面中为null。我觉得这很混乱,因为我将(唯一的)元素ID传递给例程,因此它应该到达正确的元素。

有人可以帮助我吗?同时,我将修复上面提到的事件处理程序错误。

1 个答案:

答案 0 :(得分:0)

好。因此,单击和onclick之间是有区别的。未设置onclick事件处理程序,因此为null。我将设置click事件监听器更改为将onclick属性设置为:

    emailButton.onclick = 
        function() { initMailFormButton(this.id, this.dataset.mailname, this.dataset.maildomain, ""); };

一切正常。

要处理我前面提到的限制,我将saveOnclick变量制成了一个以按钮id为键的关联数组。现在人们可以根据需要单击任意数量的按钮-尽管想要多个按钮可能很少见。