如何访问类实例上的事件侦听器
How Do I Access Event Listeners on an instance of class?
寻求创建一个事件处理程序,该处理程序注册回调并根据事件进行迭代。
一个早期的工作示例是这样的:
var elt = document.getElementById("square"),
clickCount = 0;
// call a priviledged method with access to prviate vars from
// outer scope
var count = function () {
clickCount += 1;
alert("you clicked me " + clickCount + " times!");
};
elt.addEventListener("click", count, false);
现在我想真正写一些我可以使用的js。这是当前的结构:
//Create a class object
function CountMe () {
//privately scoped variables
var clickCount = 0;
//methods on 'class' CountMe
this.countClick = function () {
//who's context am I in?
this.addCount();
alert("you clicked me " + clickCount + " times!");
};
this.addCount = function() {
clickCount += 1
};
};
// Create an instance of countMe class
var clickMe = new CountMe();
//Add an event listener for clicks
document.getElementById("square").addEventListener("click", clickMe.countClick ,false)
我收到的错误是Uncaught TypeError: Object #<CountMe> has no method 'addEventListener'
给定一个像这样的 html 页面:
<html>
<body>
<div style="width:50px; height:50px; background-color:red;" id="square">
</div>
</body>
</html>
我的问题是:
- 应该如何构造它
onclick
以便事件像在第一种方法中一样运行? - 在方法中
countClick
嵌套在什么上下文中?我怀疑CountMe
类的实例,只是想要别人的拿走。
这就是应该如何构造它,以便点击事件像在第一种方法中一样运行?
未捕获的类型错误:对象 # 没有方法"addEventListener"
不知所措的原因。您需要将事件侦听器添加到 DOM 元素中,因此您可以执行以下操作:
var clickMe = new CountMe();
document.getElementById("square").addEventListener("click", clickMe.countClick, false);
变量elt
,正如正确注释的那样,是私有范围的,不能从外部访问。这意味着您应该将添加过程移动到构造函数中(如果元素是可确定的),或者完全删除它。
在方法计数中单击嵌套在哪个上下文中?我怀疑 CountMe 类的实例只是想要别人的拿走。
这取决于召唤。使用您的代码
clickMe.countClick();
实例clickMe
将是上下文,但是当函数作为事件侦听器调用时,DOM 元素将是上下文。请参阅 MDN 的 this
关键字概述。您可以使用闭包范围的变量来保存对实际实例的引用,例如此处所述(对此有很多问题)。
三种可能的快速修复:
-
domel.addEventListener("click", clickMe.countClick.bind(clickMe), false)
-
domel.addEventListner("click", function(){clickMe.countClick();}, false)
-
var that=this; this.countClick=function(){ that.addCount(); alert(); };
相关文章:
- 如何用javascript调用函数,然后在滚动事件中调用该函数的特定实例
- 如何在事件函数中访问窗口实例
- Jquery将事件绑定到页面上的多个实例
- 允许在自定义事件上“查找使用实例”的 IDE
- JavaScript和将事件实例传递给函数
- 处理Twitter Flight组件的多个实例的事件
- 只为构造函数的所有实例触发一次事件侦听器
- 如何访问类实例上的事件侦听器
- 触发不同实例设置的 jQuery 自定义事件
- 如何将事件绑定到 ember 中动态创建的实例.js
- 下拉列表更改事件直到第二个实例才触发
- 事件保持绑定到僵尸实例
- Extjs 5.1 事件在 Ext.select.不能在 Ext.dom.Fly 实例上使用 addListener()
- 如何将“拖动启动”事件与 CKEditor 实例分离
- 创建实例时覆盖的主干视图类事件
- 从谷歌日历 API 中的事件列表中检索实例
- 如何删除多维数据集.js实例的一天之后的事件
- 如何使用 Ember.sendEvent 将事件发送到每个实例化的控制器
- jQuery类选择器事件绑定是否将eventHandler附加到每个实例
- Jquery变量直到单击事件才实例化