javascript - Chrome 与 Firefox 中的点击事件给出了不同的目标?

标签 javascript

TL;DR:

如果您使用的是 Firefox 和 Chrome,则单击此按钮会在单击事件上提供不同的目标。似乎应该有一个优雅的解决方案来解决这个问题,而不必检查元素的父元素来查看它是否是按钮。

类似问题:

详细信息

JS:

    let guid = '05c4d5b0-44c6-4e4f-a4dd-b5ac9029b3a9';
    //Get the div with this GUID.
    let elem = document.getElementById(guid);

    //Get the button that belongs to this div that has the 'delete-device' class.
    let b = elem.getElementsByClassName("delete-device")[0];

    //Add listener to delete the div when clicked.
    b.addEventListener("click", delete_devices, false);

HTML:

<button data-id="05c4d5b0-44c6-4e4f-a4dd-b5ac9029b3a9" class="btn-floating btn-small waves-effect waves-light red delete-device ">
      <i class="material-icons">delete</i>
</button>

在 Firefox 中,e.target 是按钮。

在 Chrome 中,e.target 是 <i>元素。

因此,当我们执行回调(如下)时,Chrome 找不到我们需要的 div,并将变量设置为 null,这(当然)会引发错误。

function delete_devices(e){
    e.preventDefault();
    let id = e.target.getAttribute('data-id');
    let elem = document.getElementById(id);
    elem.remove();
    return true;
}

最佳答案

使用this引用单击的元素,如果您使用按钮,请确保确实在按钮及其中的某些元素上添加事件。

const guid = '05c4d5b0-44c6-4e4f-a4dd-b5ac9029b3a9';
//Get the div with this GUID.
const elem = document.getElementById(guid);
const button = elem.querySelector("button.delete-device");
//Add listener to delete the div when clicked.
button.addEventListener("click", delete_devices, false);
    
function delete_devices(e){
    let id = this.getAttribute('data-id');
    console.log("Deleting widget: ", id)
    const elem = document.getElementById(id);
    elem.remove();
    return true;
}
<div id="05c4d5b0-44c6-4e4f-a4dd-b5ac9029b3a9">Device widget
<button data-id="05c4d5b0-44c6-4e4f-a4dd-b5ac9029b3a9" type="button" class="btn-floating btn-small waves-effect waves-light red delete-device ">
      <i class="material-icons">delete</i>
</button>
</div>

请注意,我删除了 event.preventDefault 。我想您使用它是因为您想阻止提交表单。任何<button>默认情况下是提交,要将其转换为普通按钮,请执行以下操作:

<button type="button">This does not submit form</button>

关于javascript - Chrome 与 Firefox 中的点击事件给出了不同的目标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48572264/

相关文章:

javascript - 我的带有 classList.toggle 的 javascript 代码不能正常工作

javascript - 有人可以解释一下(e)在做什么以及目标对象吗?

javascript - angularjs中的路由和多个 View

javascript - 如何重定向到同一页面

Controller 重定向后,Javascript 不会在 View 中执行

javascript - 我想在提交表单后进行验证,但它也在 drupal 表单中使用 jquery 在提交表单之前进行验证

javascript - 仅捕获当前页面的 keyDown

javascript - 如何使用混合移动应用程序的 ajax 和 json 登录

javascript - 选择2 : swapping between text and value in multiple select2

javascript - 如何按顺序对 svg 动画进行计时?