【发布时间】:2021-07-29 06:30:51
【问题描述】:
当我尝试将类方法绑定到事件时,我收到错误消息“无法读取未定义的属性‘绑定’。”这告诉我,我绑定的对象是未定义的,但它确实存在并且可以调用。考虑以下代码:
someClass = ({
event: function(workObject, event, action) {
workObject.addEventListener(event, window[action].bind(null, arguments[3]));
},
methodEventHandler: function(param) {
// Do Something
},
});
function someEventHandler(param) {
// Do Something
}
现在当我尝试像这样绑定事件监听器时:
someClass.event(workObject, "click", "someEventHandler", someParameter);
它有效。但是,当我尝试以这种方式绑定它时:
someClass.event(workObject, "click", "someClass.methodEventHandler", someParameter);
它因上述错误而失败。我的问题是为什么?我认为它与范围有关,因为常规函数在全局上下文中并且有效,但不在全局范围内的方法失败。我使用包装函数解决了这个问题,但我真的很想知道它为什么会表现出这种行为。我这样做是为了可以使用函数名作为字符串绑定事件处理程序。使动态生成网页时更容易处理。我唯一能想到的是事件处理程序的名称需要采用某种格式,但我不确定它是什么样的。有什么见解吗?
我对此进行了一些研究,并发现了很多关于如何使用各种框架(如 jQuery、AngularJS 和 Node.js)将处理程序绑定到事件等的问题和答案。其中一些在这里:
How to access the correct `this` inside a callback?
【问题讨论】:
-
我认为您的问题与
this绑定无关 - 它更简单。您失败的第二个示例最终尝试读取window["someClass.methodEventHandler"]的bind属性,这与window.someClass.methodEventHandler完全不同。您要么需要编写一个函数来从点分隔的字符串动态访问对象的嵌套属性并使用它 - 或者几乎可以肯定有更好的方法来实现您真正想要的。 (换句话说,这看起来像一个XY problem。) -
@RobinZigmond 我不会称其为 XY 问题,因为它在大多数情况下都有效。正如我所说,我认为这是一个范围界定问题。我这样做是为了在解析 JSON 并呈现页面时动态处理事件绑定。正如我所提到的,我使用了一个包装函数来解决这个问题。但是,正如您所指出的,两者并不相同。我不知道为什么我之前没有看到。
标签: javascript html events binding