Javascript“this”被事件监听器覆盖[重复]

2024-04-22

我可能做错了什么,但在尝试将一些面向对象编程应用于 Javascript 时,我发现了一些有趣的行为。考虑以下

function Bug(element) {
    this.focusedCell = null;
    element.addEventListener('click', this.onClick, true);
};

Bug.prototype.onClick = function(event){
    console.log("this is: ");
    console.log(this);
};

当我从控制台调用该方法时,我看到“this”的正确实例,但是当我单击文档中的元素时,我看到文档元素而不是实例。所以...很可能将事件侦听器与实例方法一起使用可能不是一个好主意,至少按照我的方式是这样。

所以问题是:

  • 是否可以有一个像这样的事件监听器来调用 javascript 对象的实例方法,同时在调用中保留实例?

  • 有更好的模式来做到这一点吗?

编辑: 除了 Chrome 之外,我还没有在其他地方尝试过这个。但我想行为是一样的。


有一个更好的模式,并且不需要太多改变。我先展示代码。

function Bug(element) {
    this.focusedCell = null;
    // --------------------------------v----pass the object, not a function
    element.addEventListener('click', this, true);
};

// Implement the `EventListener` interface
Bug.prototype.handleEvent = function(event) {
    if (event.type === "click")
        this.onClick(event);
}

Bug.prototype.onClick = function(event) {
    console.log(JSON.stringify(this));         // '{"focusedCell":null}'
    console.log(event.currentTarget.nodeName); // "DIV"
};

通过添加handleEvent方法,我们使Bug实施EventListener界面。这使我们能够通过新的Bug对象作为第二个参数addEventListener()而不是一个函数。

现在当"click"事件发生时,.handleEvent()方法将被调用,并且值this在该方法中将是Bug被绑定的对象。


Since this是对Bug例如,它显然不再是对该元素的引用。但这不是必需的,因为该元素可以通过event.currentTarget.

当然,您可以直接将元素添加到您的Bug如果需要,可以在构造函数中添加对象。

DEMO:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javascript“this”被事件监听器覆盖[重复] 的相关文章

随机推荐

  • 没有互联网连接的 Maven

    我是 Maven 项目的新手 我正在将 ant 项目更改为 Maven 项目 为了在 Maven 本地存储库中安装第 3 方 jar 我使用了 install 命令 它尝试下载资源 jar pom 我在我的组织中没有下载权限 因此构建安装失
  • 是否可以通过 CDK 为 AWS Kinesis 启用 EnableEnhancedMonitoring?

    我们希望使用 CDK 记录 kinesis 的增强 每个分片 指标 对于标准指标 我们这样做 const throughput new cloudwatch GraphWidget height CHART HEIGHT width CHA
  • 为什么 TypeSynonymInstances 不允许在实例头中使用部分应用的类型同义词?

    我知道TypeSynomymInstances 只允许在实例头中使用完全应用的类型同义词 http hackage haskell org trac haskell prime wiki TypeSynonymInstances 但如果我也
  • 从数组中打印素数

    我想用方法从数组中打印出所有素数 我可以用一个 int 来完成 但不知道如何从数组中返回某些数字 感谢帮助 public static boolean isPrime int tab boolean prime true for int i
  • Xcode 11.4 / iOS13.3.1 无法检查应用程序包

    Details Unable to install wtsp ios Domain com apple dt MobileDeviceErrorDomain Code 402653103 Could not inspect the appl
  • javascript 无法在 IE9 中调用

    我创建了一个文本框并写道onfocus getFocus 现在我用javascript编写了函数 function getFocus alert Hello I Got Focus 问题是在 IE8 中它工作得很好 但在 IE9 中警报没有
  • 如何禁用 IE8 中文本区域的默认滚动条?

    我正在浏览一些旧网站 其中有一个联系表单 并且在 IE8 中 即使没有内容 我的文本区域也始终会显示一个垂直滚动条 在 Firefox 中 直到文本区域中的内容达到认为有必要的高度时 它似乎才会使垂直滚动条存在 我在旧网站上设置了输入框的样
  • 将 NSArray 转换为 NSMutableArray [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如上 了解一下会有帮助的 谢谢 这里有两个选项 NSMutableArray createMutableArray1 NSArray ar
  • 它当前正被另一个 Gradle 实例使用

    我想做一些基本的功能 我正在命令行中运行 构建它 我指的是用户指南 http www gradle org docs current userguide userguide html 并且 做一些简单的任务 当我开始运行简单任务时 它已成功
  • 从线程接收数据后pyqt主窗口不断崩溃

    我有一个 QMainWindow 启动 QThread 并等待来自网络的数据 当收到任何数据时更新 UI 问题是 它有时会崩溃 有时不会 我所做的就是启动它并等待数据 这是线程类 class ListenerThread QtCore QT
  • 将多选列表框中的 SelectedItems 与 ViewModel 中的集合同步

    我在使用 prism 的 SL3 应用程序中有一个多选列表框 并且我的视图模型中需要一个集合 其中包含列表框中当前选定的项目 视图模型对视图一无所知 因此它无法访问列表框控件 另外 我需要能够从视图模型中清除列表框中的选定项目 不知道如何解
  • 符号查找错误未定义符号,但所有符号似乎都存在

    可执行文件似乎无法解析链接库中的符号 LD DEBUG libs 的相关输出表明加载了正确的库 6557 usr lib libcharon so 0 error symbol lookup error undefined symbol a
  • 使用 ngx-mat-file-input 从 Angular 将文件上传为 multipart/form-data

    我在用着ngx mat file input 0 检索用户输入的文件 我想将其上传到服务器 端点需要一个多部分文件 我怎样才能做到这一点 0 https www npmjs com package ngx material file inp
  • 内置模块计算最小公倍数

    我目前正在使用一个接受两个数字并使用循环来查找这些数字的最小公倍数的函数 def lcm x y This function takes two integers and returns the L C M Choose the great
  • MySQL order by 在 group by 之前

    这里有很多类似的问题 但我认为没有一个能充分回答这个问题 我将从当前最流行的继续question https stackoverflow com questions 5140785 mysql order before group by如果
  • ANTLR“无法启动调试器。等待连接到远程解析器超时。”

    我在 AntlrWorks 中运行的 ANTLR 语法之一抛出 无法启动调试器 等待连接到远程解析器超时 过去 此消息通常会消失 但此消息会持续存在 在搜索 ANTLR 列表时 例如http www antlr org pipermail
  • 将 A => M[B] 转换为 M[A => B]

    对于一个单子M 是否可以转A gt M B into M A gt B 我尝试过遵循这些类型 但没有成功 这让我认为这是不可能的 但我想我还是会问 另外 搜索 Hooglea gt m b gt m a gt b 没有返回任何东西 所以我没
  • Perl:函数参数不足

    我是 Perl 的新手 目前正在尝试理解提到的错误消息 我有这段代码 仍然主要用于测试目的 usr bin perl use strict use warnings my info autor gt Karryanna jazyk gt c
  • Android ACTION_SHUTDOWN 广播不起作用

    Code public class ShutdownReceiver extends BroadcastReceiver private static final String TAG ShutdownReceiver Override p
  • Javascript“this”被事件监听器覆盖[重复]

    这个问题在这里已经有答案了 我可能做错了什么 但在尝试将一些面向对象编程应用于 Javascript 时 我发现了一些有趣的行为 考虑以下 function Bug element this focusedCell null element