【问题标题】:How to set an onclick event for a set? [duplicate]如何为集合设置 onclick 事件? [复制]
【发布时间】:2017-06-09 11:05:18
【问题描述】:

我有一个元素数组,我想对其应用某个 onclick 事件。这样做的正确方法是什么(如果可能的话)?

我想应用于每个元素的功能是这样的:

        function fade(element){
            var o = 1.0;
            var x = setInterval(function(){
                element.style.opacity = o;
                o -= 0.01;
                if(o <= 0) {
                    element.style.display = "none";
                    clearInterval(x);
                }
            }, 10);
        }

这就是我想要做的:

    <script type="text/javascript">
        var el = document.getElementsByClassName("circle");
        console.log(el[0]);
        for(var i = 0; i < el.length; i++){
            el[i].onclick = function(){ fade(el[i]); }
        }
    </script>

也就是说,我想将函数fade() 应用为circle 类的每个元素的onclick 事件,这样每当单击一个圆圈时,它就会淡出。

但是,上面的代码根本不起作用。 JavaScript 控制台给了我以下错误:

未捕获的类型错误:无法读取未定义的属性“样式”

我不确定我做错了什么,我只是在学习 Javascript。我已经搜索了这个特定的错误,但没有发现任何有用的信息。

--编辑--

我的实际代码不长,这里是:

function fade(element) {
  var o = 1.0;
  var x = setInterval(function() {
    element.style.opacity = o;
    o -= 0.01;
    if (o <= 0) {
      element.style.display = "none";
      clearInterval(x);
    }
  }, 10);
}
.circle {
  height: 200px;
  width: 200px;
  border-radius: 50%;
  content: '';
  float: left;
}
.red {
  background-color: red;
}
.green {
  background-color: green;
}
.blue {
  background-color: blue;
}
<div id="red" class="circle red"></div>
<div id="blue" class="circle blue"></div>
<div id="green" class="circle green"></div>
<script type="text/javascript">
  var el = document.getElementsByClassName("circle");
  console.log(el[0]);
  for (var i = 0; i < el.length; i++) {
    el[i].onclick = function() {
      fade(el[i]);
    }
  }
</script>

【问题讨论】:

  • 请单击编辑器中的&lt;&gt; 按钮并创建一个minimal reproducible example - 我们缺少 HTML,您可能需要关闭 - 或使用过渡或 jQuery
  • 你知道你可以用 CSS3 褪色,那么你所要做的就是用 javascript 添加/删除(切换)一个类 ..see here for css3 animation
  • @caramba 感谢您的提示,我不知道。不过,我仍然想知道如何使用 js 来做到这一点。我觉得我错过了一些关于如何传递变量或如何处理属性的信息,而我真的很想知道。

标签: javascript html css


【解决方案1】:
  1. 传递元素而不是数组元素
  2. 获取传递的元素的副本以在 setInterval 中使用
  3. 在加载事件处理程序中分配处理程序

function fade(el) {
  var o = 1.0,
    element = el, // copy the element passed
    x = setInterval(function() {
      element.style.opacity = o;
      o -= 0.01;
      if (o <= 0) {
        element.style.display = "none";
        clearInterval(x);
      }
    }, 10);
}
window.onload = function() {
  var el = document.querySelectorAll(".circle"); // more compatible
  for (var i = 0; i < el.length; i++) {
    el[i].onclick = function() {
      fade(this); // "this" is the element clicked
    }
  }

}
.circle {
  height: 200px;
  width: 200px;
  border-radius: 50%;
  content: '';
  float: left;
}
.red {
  background-color: red;
}
.green {
  background-color: green;
}
.blue {
  background-color: blue;
}
<div id="red" class="circle red"></div>
<div id="blue" class="circle blue"></div>
<div id="green" class="circle green"></div>

【讨论】:

  • 这正是我所需要的。我有一种感觉,this 会引用函数而不是元素。像魅力一样工作。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-21
  • 2018-06-03
  • 1970-01-01
  • 2011-01-20
  • 2020-01-24
  • 2019-02-26
  • 2014-04-13
相关资源
最近更新 更多