Javascript:类属性在拖动事件期间变得未定义

2024-03-05

我对 Javascript 中的类还很陌生,我已经被困了几天试图理解为什么我的属性在我的所有方法中都变得未定义......

我试图复制this https://www.kirupa.com/html5/drag.htm到一个类中,但不成功,因为每次调用方法时我的属性都是未定义的。

我在 stackoverflow 上找不到类似的问题,但如果有,请链接我,因为我可能没有搜索正确的问题。

<div class="row" style="height: 800px;">
    <div class="col" id="container">
        <div class="card" style="width: 300px; border-top: solid 20px black;" id="dragcard">
            <div class="card-body">
                <p>Text</p>
            </div>
        </div>
    </div>
</div>
class DragEvents {

    dragCard = document.querySelector("#dragcard");
    container = document.querySelector("#container");

    currentX = 0;
    currentY = 0;
    initialX;
    initialY;

    constructor() {

        this.container.addEventListener("mousedown", this.dragStart, false);
        this.container.addEventListener("mouseup", this.dragEnd, false);
        this.container.addEventListener("mousemove", this.drag, false);

        console.log(this.currentX);//works, but I need this to work in my methods.
    }

    drag() {
        console.log("Drag");//fires
        console.log(this.currentX);//undefined
        console.log(this.currentY);//undefined
        console.log(this.initialX);//undefined
        console.log(this.initialY);//undefined
    }

    dragStart() {
        console.log("DragStart");//fires
    }

    dragEnd() {
        console.log("DragEnd");//fires
    }

}//End Class
var DragEvent = new DragEvents();

这是 Web 应用程序开发中的常见问题,尤其是当您尝试使用实例方法作为事件处理程序时。

通常,当你调用类似的东西时

instance.method(foo);

功能method被称为,与this指向instance and foo作为唯一的参数。这就是大多数人期望此代码的行为方式。

然而,instance.method(没有调用)只是对函数的引用。如果你这样做:

const bar = instance.method;
bar(foo);

你会看到不同的行为。在这种情况下,bar被称为this没有指向任何东西并且foo作为唯一的参数。这是因为该函数不再绑定到instance就像你打电话时的样子instance.method(foo);

这正是您致电时发生的情况

this.container.addEventListener("mousedown", this.dragStart, false);

您传入对函数的引用this.dragStart指向,但与您的班级的连接丢失了。

有很多方法可以解决这个问题。它们都有效地执行相同的操作,即将事件处理程序绑定到类的实例:

箭头函数表达式你可以使用箭头函数表达式 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions绑定值this到你的班级:

constructor() {
  this.container.addEventListener("mousedown", (e) => this.dragStart(e), false);
  this.container.addEventListener("mouseup", (e) => this.dragEnd(e), false);
  this.container.addEventListener("mousemove", (e) => this.drag(e), false);
}

绑定方法您还可以使用bind method https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Function/bind显式绑定this到函数参考

constructor() {
  this.container.addEventListener("mousedown", this.dragStart.bind(this), false);
  this.container.addEventListener("mouseup", this.dragEnd.bind(this), false);
  this.container.addEventListener("mousemove", this.drag.bind(this), false);
}

ES6方法定义您还可以更改定义类方法的方式,以便将函数绑定到类的实例:

class DragEvents {

    /* ... */

    drag = () => { /* ... */ }

    dragStart = () => { /* ... */ }

    dragEnd = () => { /* ... */ }

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

Javascript:类属性在拖动事件期间变得未定义 的相关文章

  • 命名和配置jsfiddle

    对于任何知道答案的人来说 这听起来都是一个非常愚蠢的问题 当我创建 JSfiddle 时 它 会出现在我的列表页面上 如下所示 cGzCe Revision 8 然后我将其命名为 多创建节点 由于添加了修订号 因此该短语中没有空格 所以有额
  • 之后的脚本会阻止 DOM 加载

    考虑以下代码 div class box div 令我惊讶的是 DOM 延迟了十秒的加载 10秒后出
  • 使用 ng-if 内容短暂呈现然后消失

    我的页面上有一些内容包含在 ng if 中 如下所示 div class text danger p strong Message displayed to User strong p div 然后在我的 Angular js 控制器中我有
  • 考虑使用“jsdom”测试环境

    我有这个简单的测试 import React from react import render from testing library react import Button from describe Button gt it rend
  • 最小有效 JSON 是多少?

    我仔细阅读了 JSON 描述http json org http json org 但我不确定我是否知道这个简单问题的答案 最小可能的有效 JSON 字符串是什么 string 该字符串是有效的 JSON 吗 42简单的数字是有效的 JSO
  • 如何确保循环完成后执行语句?

    下面是我的代码的快照 routes index js exports index function req res var results new Array for var i 0 i lt 1000 i do database quer
  • Nightmare.js 截图缓冲区长度 0

    我正在运行一个 night js 脚本 我试图在其中截取页面上多个元素的屏幕截图 The first元素被捕获得很好 但折叠下方的所有其他元素都以零长度捕获 我正在努力调试这个问题 任何帮助将非常感激 基本上这个脚本会遍历一个页面并选择al
  • 如何将 iLike 运算符与 Sequelize 结合使用来进行不区分大小写的查询

    我使用 Sequelize 和 PostgreSQL 来管理我的数据库 我想执行不区分大小写的搜索查询 当我用谷歌搜索时 有人说我可以使用 iLike 运算符来做到这一点 我尝试以这种方式实现 var getRadiosByGenre fu
  • 移动设备上的剩余悬停效果

    我一整天都在努力做这个JSFiddle http jsfiddle net gsamaras q2w4jjyt 4 也适用于手机 但我所有的尝试都没有效果 在桌面上 当用户将鼠标悬停在箭头上时 它会变成红色 在移动设备上 当用户触摸 为了单
  • innerText 和 html 之间的区别

    有什么区别innerText text and html innerText or text http docs jquery com Attributes text如果您使用的是 jQuery 不包含任何 HTML 标签 因此 如果您有一
  • JavaScript 语法是什么:{Ci, CC}? [复制]

    这个问题在这里已经有答案了 我正在做一些 FF 附加开发 我看到这样的语法 var Cc Ci require chrome 只是好奇这个语法是什么 以及它是否对 FF 开发或其他东西有特殊意义 这称为解构赋值 它的一个特点是JavaScr
  • jQuery/JavaScript“this”指针混淆

    当函数时 this 的行为bar被称为让我困惑 请参阅下面的代码 当从单击处理程序调用 bar 时 有什么方法可以将 this 安排为普通的旧 js 对象实例 而不是 html 元素 a class with a method functi
  • React Native v0.71.8 React-native-vector-icons 你看不到的图标

    我在用react native版本v0 71 8 我安装了react native vector icons库 但图标未显示 似乎链接在最新版本的 React Native 中不再起作用 所以我按照说明进行操作 但它不再编译 出现以下错误
  • ajax调用后如何停止刷新页面?

    ajax 调用后我无法停止刷新页面 我尝试过放置 e preventDefault 并返回 false 但我的页面又刷新了 我不知道代码有什么问题或者什么 请帮助我在ajax调用后停止刷新页面 解决这个问题对我来说会有很大的帮助 提前致谢
  • 无法使用 Excel JavaScript API 设置 NumberFormat

    我正在使用 Excel Javascript API 在搜索文档后 仍然找不到我想要实现的解决方案 因此 我想将所有内容设置为数字格式 文本 这样 Excel 的自动格式设置就不会与任何单元格的内容混淆 不会删除前导零或更改日期格式 文档建
  • Ace Editor 自动完成和多种语言

    如何为 Ace 编辑器创建自动完成功能以及如何突出显示 php 中的 html javascript 和 csshttp ace ajax org http ace ajax org
  • 将 async 和await 与export const 一起使用

    我无法完成这项工作 它说 await 是一个保留字 是的 当然是 而且我想使用它 怎么了 export const loginWithToken async gt return dispatch gt dispatch type SESSI
  • 如何比较 JavaScript 表格中的单元格并测试是否相等? indexOf 是如何工作的?

    我在 HTML 代码中创建了一个表格 它有 9 列和 13 行 它被 JavaScript 循环完全填满 该循环用几个数组中的人名填充它 但是 我想添加一个验证步骤 确保一行中没有两个单元格具有相同的值 并且每个单元格的值不会在其正下方的单
  • Web API 2.0 使用 pascalcase 模型接收驼峰式命名的 JSON 数据

    我正在尝试对我的 Web API 进行 PUT 调用 我在 WebApiConfig cs 中设置了以下内容 以处理以驼峰形式将数据发送回我的 Web 项目 config Formatters JsonFormatter Serialize
  • 阻止 Chrome 扩展程序的 popup.html 自动打开

    我正在创建一个 Chrome 扩展程序 其中包含background html每分钟从 API 请求一次信息的文件 收到信息后 它会发送消息popup html弹出窗口使用 JSON 信息将新的 HTML 元素附加到弹出窗口的主体上 问题是

随机推荐

  • Javascript 点击事件多次触发?

    为什么我的函数运行多次 var s getData settings gender input name gender age input name age init function s this settings this getInp
  • 向导航栏添加类似于 iOS 11 中 Apple Music 的标题和副标题

    这是一IOS 11问题 我不确定我们是否可以谈论这个 iOS 还处于测试阶段 但我在 Apple Music 中查看了这个导航栏 我知道他们推出了大标题IOS 11 navigationController navigationBar pr
  • 如何使用 Cordova/Ionic 在 inappbrowser 中显示 AdMob 横幅

    我在用着ionic framework 我可以创建一个admob横幅 但是当我加载时inappbrowser在我关闭之前 横幅不会显示inappbroswer 有没有办法在以下情况下显示 AdMob 横幅 inappbrowser开了 我建
  • IIS 8.0 详细 500.0 内部服务器错误 - IsapiModule 未找到

    我正在开发一个最初在 Visual Studio 的早期版本 2013 年之前 上构建的项目 但遇到了错误 我在 google 和 stackoverflow 上搜索了又搜索 包括以下资源 IIS 7 5 详细错误 500 0 在 Wind
  • 如何将测试保留在 Vite 项目的源目录之外?

    Running npm init vue latest通过以下设置 生成一个 Vitest 规范文件src目录 我想知道为什么 Cypress e2e 测试有一个单独的目录 而 Vitest 单元测试就在源代码旁边 有什么原因吗 我想将这些
  • 如何通过 API 将资金从 PayPal 帐户转移到另一个 PayPal 帐户

    我花了很长时间寻找一种通过 API 将资金从企业 PayPal 转移到多个用户的 PayPal 帐户的方法 IE 我有收件人的 PayPal 电子邮件地址 我想通过 API 将 X 笔资金从我们的帐户转移到他们的帐户 PayPal 自适应支
  • 如何检查属性是否存在[重复]

    这个问题在这里已经有答案了 我正在尝试从中读取属性DirectoryEntry 不幸的是并非所有记录都有employeeNumber属性 所以我需要检查它是否存在 我已经尝试过 a one DirectoryEntry record a G
  • 退款状态NO_API_ACCESS_TO_RECEIVER,贝宝响应

    我在我的 Rails 应用程序中使用这个 gem 进行支付 https github com jpablobr active paypal adaptive payment https github com jpablobr active
  • Apache mod_auth_form 如何锁定文件夹

    在我看来 我对 mod auth form 应该如何工作有一个根本性的误解 我参考了 Apache 文档的这一页 http httpd apache org docs current mod mod auth form html 我有一个公
  • 不同端口上的 Route 53 记录集

    我是一名 ruby 开发者 刚刚开始学习一些 Node js 我正在运行一个实例AWS主持我的rails带有乘客 nginx 监听的应用程序port 80 现在我想举办一个node js同一实例 t1 micro 上的应用程序并将其监听端口
  • UIViewController 不自动旋转

    正如标题所说 我的 UIViewController 无论如何都不会旋转 当它加载时 shouldAutorotateToInterfaceOrientation 被调用 但之后就不会了 更新1 这是一个非常非常奇怪的问题 至少对于我来说
  • 如何屏蔽nginx日志中POST正文的敏感信息?

    为了方便分析我们保存 request body访问日志中的字段 但是 帖子正文中存在一些敏感信息 例如密码或信用卡号 会在日志中暴露 我们怎样才能掩盖这些信息呢 password 1234asdf gt password 如果我编写一个 n
  • 如果 A 列为空,隐藏 Google 电子表格中的行吗?

    如果 A 列为空 我试图隐藏行 我想将其应用于特定工作表 第 1 周 第 2 周 第 3 周 第 4 周和第 5 周 这是我迄今为止第一周的代码 function ConditionalHideRow var ss SpreadsheetA
  • VSCode 添加随机百分比

    每次我使用终端打印出字符串或任何类型的字符时 它都会自动在每行末尾打印一个 每当我尝试从 C 或 php 打印某些内容时 都会发生这种情况 但还没有尝试过其他语言 我认为这可能是 vscode 的问题 并且不知道它是如何出现的或如何修复它
  • 如何从未签名的存储库安装 debian 软件包

    尝试从未签名的存储库将 Debian 软件包安装到 Debian 9 apt get allow unauthenticated update Get 1 http files freeswitch org repo deb freeswi
  • 在 WPF 中显示多维数据

    在 WPF 中显示多维数据的最佳方式是什么 直到运行时我才会知道数据的大小 形状 理想情况下 我想使用数据绑定 但这不是严格的要求 我正在考虑某种网格 但我不知道如何动态绑定到数据并让它计算出行数和列数 请提供建议和示例 听起来好像您想要一
  • 隐藏样式、块样式和无样式之间的区别

    我试图找出风格之间的差异 hidden block none 我正在尝试这个例子 但不幸的是这不起作用 有人可以告诉我答案吗 div hr DIV 1 hr div 你真的很接近 两种不
  • 用于输入/V 模型的 Vue 过滤器

    所以我对 ES6 SPA Javascript 和 Vue JS 非常陌生 我主要使用 JQuery 所以我有一个全局过滤器 Vue filter formatDate function value if value return mome
  • 在 Backbone.js 中,如何让模型超类默认值充当子类的默认值?

    我有一个定义一些默认值的类和一个定义一些默认值的子类 但是 当我创建子类的实例时 它只查看本地默认值 不会将其默认值与父类的默认值合并 有没有什么简单的方法可以做到这一点 而无需显式地将本地默认值与父默认值合并initialize每个子类的
  • Javascript:类属性在拖动事件期间变得未定义

    我对 Javascript 中的类还很陌生 我已经被困了几天试图理解为什么我的属性在我的所有方法中都变得未定义 我试图复制this https www kirupa com html5 drag htm到一个类中 但不成功 因为每次调用方法