保存对此范围的访问权限

2023-12-13

我将颜色存储在按钮上的数据属性中,我想在切换中使用该颜色。但是,当我尝试使用访问数据信息时this,没有可用数据。我怎样才能保持对正确的访问this scope?

我试图只切换不包含 Skip 的元素的给定颜色。

html

<div>
 <input id="toggleButton" type="button" value="Toggle" data-color="Red" />
</div>
<div id="toggleSet">
<div>Element</div>
 <div>Skip</div>
 <div>Element</div>
</div>

css

.ActivateRed{ color: red; }

js

$('#toggleButton').click(function(){
 $("#toggleSet div").each(function(index,element){
  if( element.innerHTML != "Skip" ){
   $(element).toggleClass("Activate"+$(this).data("color"));
                                       //^this has no data to access?
                                       //Why am I getting undefined?
  }
 });
});

这里有一个jsFiddle我的尝试。我不断得到Activateundefined作为类名。为什么不是this访问我的toggleButton 的数据?


问题说明

这改变了

The value of thisMDN has changed and is no longer referencing the expected element or value. Often this is because the scope has changed, and as a result so has the this reference.

这包含在执行上下文中

The scope refers to the current Execution ContextECMA. In order to understand why this has changed, it is important to understand the way these execution contexts operate in JavaScript.

执行上下文绑定 this

当控制进入执行上下文时(代码正在该范围内执行),变量的环境被设置(词法和变量环境 - 本质上,这设置了一个用于变量输入的区域,该区域已经可以访问,以及一个用于局部变量的区域存储),以及绑定this occurs.

执行上下文的 this 绑定已更改

These contexts form a logical stack. The result is that contexts deeper in the stack have access to previous variables, but their bindings may have been altered. Every time jQuery calls a callback function, it alters the this binding by using applyMDN.

callback.apply( obj[ i ] )//where obj[i] is the current element

调用的结果apply是 jQuery 回调函数内部,this指回调函数正在使用的当前元素。

例如,在.each,常用的回调函数允许.each(function(index,element){/*scope*/})。在那个范围内,this == element是真的。这样做的结果是,如果您期望之前的this为了可用,它将绑定到不同的元素。

简要说明this在 jQuery 回调中

As shown above, jQuery callbacks use the apply function to bind the function being called with the current element. This element comes from the jQuery object's element array. Each jQuery object constructed contains an array of elements which match the selectorjQuery API that was used to instantiate the jQuery object.

$(selector)调用 jQuery 函数(记住$是对jQuery, code: window.jQuery = window.$ = jQuery;)。在内部,jQuery 函数实例化一个函数对象。因此,虽然它可能不会立即显而易见,但使用$()内部使用new jQuery()。构建此 jQuery 对象的一部分是查找选择器的所有匹配项。然后,jQuery 对象包含与选择器匹配的 DOM 元素的类似数组的结构。

当调用 jQuery api 函数时,它将在内部迭代这个类似数组的结构。对于数组中的每个项目,它调用 api 的回调函数,绑定回调的this到当前元素。这个调用可以在上面的代码片段中看到,其中obj是类似数组的结构,并且i是用于当前元素在数组中的位置的迭代器。

寻找解决方案

It can be hard to determine what happened since jQuery tends to fail silently. .data()jQuery API is still a valid call here, it just returns undefined. As a result, the above code produces a class name of "Activate"+undefined, "Activateundefined".

这里要认识到的重要部分是 jQuery 改变了this捆绑。为了使用之前的this绑定时,值必须存储在变量中。存储它的通用名称是that, self, me,或者在最佳实践中,对内容的实际描述this代表。

保存绑定有效的原因是回调的执行上下文将在执行上下文堆栈中相对于绑定值的保存位置更深,从而可以访问该存储的值。

jsFiddle 演示

$('#toggleButton').click(function(){
 var toggleBtn = this;
     //^ store this into the toggleBtn variable
 $("#toggleSet div").each(function(index,element){
                           //^ binds `this` to the current element
  if( element.innerHTML != "Skip" ){
       //^ we could have used `this.innerHTML` here
     $(element).toggleClass("Activate"+$(toggleBtn).data("color"));
                                        //^ re-use the stored `this` value
  }
 });
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

保存对此范围的访问权限 的相关文章

随机推荐

  • 在 Python 中覆盖现有 Excel 文件时图形丢失

    我正在使用 openpyxl 写入现有文件 一切正常 但是 将数据保存到文件后 图表就会消失 据我了解 Openpyxl 目前仅支持在工作表中创建图表 现有工作簿中的图表将丢失 Python 中是否有任何替代库可以实现此目的 我只想提供一些
  • 如何从 F# 中的构造函数调用方法

    我知道这个问题 但提问者似乎对另一个问题的答案感到满意 如何重载构造函数 我有一个类 它充当可变类的高级记忆器 这样我就可以将其视为从外部不可变的 type Wrapper args let tool new MutableTool too
  • 我可以让 Memcached 在 Windows (x64) 64 位环境上运行吗?

    有人知道吗IF WHEN or HOW我可以得到内存缓存在 Windows 64 位环境上运行 我正在设置一个新的托管解决方案 并且更愿意运行 64 位操作系统 并且由于它是带有 SQL Server DB 的 ASP Net MVC 解决
  • \a(警报和蜂鸣声)转义序列字符在 C 语言中不起作用

    我不知道为什么 a不管用 我的代码正在运行并显示在终端中 我的代码 include
  • VS 2017安装失败

    我在 Windows 7 上安装 VS2017 一段时间后我收到错误 MSI C ProgramData Microsoft VisualStudio Packages Microsoft VisualStudio MinShell Msi
  • 就效率而言,全局 CSS 变量与局部变量

    CSS 中的全局变量在内存或效率方面是否比局部 CSS 变量低 所以基本上我的问题是 与在特定选择器的代码块中声明并相对于选择器本地作用域的变量相比 在全局范围内声明并且可以在CSS中的任何位置访问的变量是否有任何好处 当谈论全球范围时 我
  • Mongodb条件查询

    作为 mongo 的新手 陷入了条件查询 我想根据 3 个条件 名字 姓氏和电子邮件 ID 执行搜索 当所有字段都存在时 下面的查询工作完美 db students find and first name Abc i last name X
  • CSS 样式未在 IE8 中加载

    我有一个非常奇怪的问题 IE8 中没有加载 CSS 样式 也许 IE7 也是如此 但无法检查 我的网站位于http www leavetrackapp com 我的主 CSS 文件如下 import url reset css import
  • ASP.NET 5 自定义错误页面未在 Azure 网站上呈现

    我有一个 ASP NET 5 网站 我想向其中添加自定义错误页面 我习惯在 web config 中添加条目 从 ASP NET 4 天开始 但我想在 ASP NET 5 中使用新方法 因此 我的 Startup cs 类中有以下内容 if
  • 如何在每页的基础上更改导航栏的背景图像?

    我一直在寻找一种方法来改变我的背景图像NavigationBar并控制我的外观NavigationBar当用户导航应用程序时 据我了解 更改背景图像的公认方法是 implementation UINavigationBar UINaviga
  • 包含 U+001A 的 XML 文档的编码

    我有一个 XML 文档 它是根据人们从各种地方复制 粘贴的一些内容生成的 尽管大多数是 Word 文档 它看起来像这样
  • .NET 6 CORS 策略在客户端 CORS 上被阻止

    我的应用程序的客户端是 NET6 服务器端Web API是 NET 4 8 当尝试访问服务器端时 浏览器控制台中会产生以下错误 从源 https localhost 34564 获取 https localhost 12345 api co
  • 为什么单元测试中的代码无法找到捆绑资源?

    我正在单元测试的一些代码需要加载资源文件 它包含以下行 NSString path NSBundle mainBundle pathForResource foo ofType txt 在应用程序中它运行得很好 但是当由单元测试框架运行时p
  • Cross-Origin-Embedder-Policy:如何仅允许某些域?

    在网站上 我必须在网站上嵌入需要以下标头的 iframe 因为它需要 SharedArrayBuffer 功能 Cross Origin Embedder Policy require corp Cross Origin Opener Po
  • 在 C# 中设置 Azure ACS

    我正在查看几个使用 ACS 的示例 它们确实让我感到愚蠢 我查看了在线教程 似乎我所需要的只是配置中的以下行 httpRuntime requestValidationMode 2 0 但本节中的其他一些例子示例项目SimpleMVC4 的
  • 必需的自定义 WooCommerce 结帐字段不会验证输入的值

    我在店面子主题中添加 WooCommerce 自定义结账字段functions php file 它们具有 必需 属性 目的是让这些字段出现在页面顶部 账单字段之前 当单击 提交 按钮继续付款时 我收到所需的自定义字段验证错误 请填写您的姓
  • Asp.Net MVC:URL 太长的请求和错误处理

    通过检查我的 elmah 日志 我发现我不断收到 网址太长 请求 错误是 System Web HttpException 0x80004005 The length of the URL for this request exceeds
  • 二维数组变量指针混淆

    我对二维数组 C 语言 有一个基本的疑问 考虑二维数组的声明如下 int array 3 5 现在 当我执行以下操作时 以下 printf 的输出是相同的 printf u n array printf u n array 现在尝试以下操作
  • python 中多行和单行字符串文字的优点是什么?

    我知道三引号字符串用作文档字符串 但是真的需要两个字符串文字吗 是否有任何用例可以区分单行和多行 在 Clojure 中 我们有 1 个字符串文字 是多行的 我们将其用作文档字符串 那么为什么Python会有这样的差异呢 必须明确创建多行字
  • 保存对此范围的访问权限

    我将颜色存储在按钮上的数据属性中 我想在切换中使用该颜色 但是 当我尝试使用访问数据信息时this 没有可用数据 我怎样才能保持对正确的访问this scope 我试图只切换不包含 Skip 的元素的给定颜色 html div div