使用Vanilla JS在外部单击时删除元素的属性

时间:2015-05-19 22:34:34

标签: javascript

如何在外部点击或同一类型的另一个div上删除元素的属性?这是我的代码:

HTML:

<div id="container">
  <div data-something></div>
  <div data-something></div>
</div>

JavaScript的:

var elements = document.querySelectorAll("[data-something]");    

Array.prototype.forEach.call(elements, function(element) {

  // Adding
  element.onclick = function() {
    this.setAttribute("data-adding", "");
  };

  // Removing -- Example
  element.onclickoutside = function() {
     this.removeAttribute("data-adding");
  };

});

2 个答案:

答案 0 :(得分:6)

我可能会在文档上使用点击处理程序,然后从任何没有冒泡路径的元素中删除该属性。

document.addEventListener("click", function(e) {
    Array.prototype.forEach.call(document.querySelectorAll("*[data-adding][data-something]"), function(element) {
        var node, found = false;
        for (node = e.target; !found && node; node = node.parentNode) {
            if (node === element) {
                found = true;
            }
        }
        if (!found) {
            element.removeAttribute("data-adding");
        }
    });
}, false);

......或类似的东西。

直播示例:

&#13;
&#13;
    document.addEventListener("click", function(e) {
      Array.prototype.forEach.call(document.querySelectorAll("*[data-adding]"), function(element) {
        var node, found = false;
        for (node = e.target; !found && node; node = node.parentNode) {
          if (node === element) {
            found = true;
          }
        }
        if (!found) {
          element.removeAttribute("data-adding");
        }
      });
    }, false);
&#13;
*[data-adding] {
  color: red;
}
&#13;
<div data-adding data-something>One</div>
<div data-adding data-something>Two</div>
&#13;
&#13;
&#13;

答案 1 :(得分:2)

您可以在全局点击事件处理程序中使用Node.contains()来检查点击是否在元素之外,并正确处理事件:

box = document.getElementById('box');
lastEvent = document.getElementById('event');

box.addEventListener('click', function(event) {
  // click inside box
  // (do stuff here...)
  lastEvent.textContent = 'Inside';
});

window.addEventListener('click', function(event) {
  if (!box.contains(event.target)) {
    // click outside box
    // (do stuff here...)
    lastEvent.textContent = 'Outside';
  }
});
#box {
  width: 200px;
  height: 50px;
  background-color: #ffaaaa;
}
<div id="box">Click inside or outside me</div>

<div>Last event: <span id="event">(none)</span>
</div>