理解 jQuery 中的 $.proxy()

2024-02-23

From docs http://api.jquery.com/jquery.proxy/我明白那个.proxy()会改变作为参数传递的函数的范围。有人可以更好地向我解释一下吗?我们为什么要这样做?


它最终要做的是确保this函数中将是您想要的值。

一个常见的例子是setTimeout发生在一个click处理程序。

拿着它:

$('#myElement').click(function() {
        // In this function, "this" is our DOM element.
    $(this).addClass('aNewClass');
});

意图很简单。什么时候myElement被点击,它应该得到类aNewClass。处理程序内部this代表被点击的元素。

但是如果我们想在添加类之前有短暂的延迟怎么办?我们可能会使用一个setTimeout来完成它,但问题是无论我们赋予什么功能setTimeout, 的价值this该函数内部将是window而不是我们的元素。

$('#myElement').click(function() {
    setTimeout(function() {
          // Problem! In this function "this" is not our element!
        $(this).addClass('aNewClass');
    }, 1000);
});

所以我们可以做的是调用$.proxy(),向其发送我们想要分配的函数和值this,它将返回一个保留该值的函数。

$('#myElement').click(function() {
   // ------------------v--------give $.proxy our function,
    setTimeout($.proxy(function() {
        $(this).addClass('aNewClass');  // Now "this" is again our element
    }, this), 1000);
   // ---^--------------and tell it that we want our DOM element to be the
   //                      value of "this" in the function
});

所以在我们给予之后$.proxy()函数和我们想要的值this,它返回一个函数,该函数将确保this已正确设置。

它是如何做到的?它只是返回一个匿名函数calls我们的函数使用.apply()方法,它可以显式设置this.

返回的函数的简化外观可能如下所示:

function() {
    // v--------func is the function we gave to $.proxy
    func.apply( ctx );
    // ----------^------ ctx is the value we wanted for "this" (our DOM element)
}

所以这个匿名函数被赋予setTimeout,它所做的就是用正确的方式执行我们的原始函数this语境。

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

理解 jQuery 中的 $.proxy() 的相关文章

  • Meteor:应用程序无法在 0.9.1.1 版本上运行

    出现类似错误 Error TypeError undefined is not a function evaluating Template create anonymous function iron dynamic template j
  • 可以使用 jQuery 或 Javascript 将图片的特定部分用作链接吗?

    我有这个想法 将图片 而不是文本 的各个部分链接到不同的页面或网站 并且我想在不实际创建不同的照片并将它们彼此靠近的情况下完成 这样看起来就像是一张完整的图片 这里有人知道如何使用 JavaScript 的变体 例如 jQuery 或纯 J
  • 从未用 @flow 标记的导入文件中获取类型定义

    TL DR我怎么告诉flow从未声明的导入模块导入类型定义 flow 加长版 流接缝能够从不使用流语法的文件中派生类型 请参阅示例 示例文件 flow js if Math random lt 0 5 var y hello else va
  • 如何将 Google Charts 与 Vue.js 库一起使用?

    我正在尝试使用 Vue js 库使用 Google Charts 制作图表 但我不知道如何添加到 div 这是我尝试做的 这是如何使用普通 javascript 添加图表 这是文档的代码示例 https developers google
  • Meteor - 从客户端取消服务器方法

    我正在通过服务器方法执行数据库计数 用户可以选择他们希望如何执行计数 然后调用该方法 我的问题是 计数可能需要一些时间 并且用户可能会在方法运行时改变主意并请求不同的计数 有什么方法可以取消调用的方法并运行新的计数吗 我认为 this un
  • jquery从变量中删除html元素

    我将 html 保存在变量中 var itinerary events today html 我有很多 html 和一个按钮我想删除 它的 ID 为 myButton 如何从变量中保存的 html 中删除它 我建议这种方法 var itin
  • 动态地将工具提示文本设置为 div 元素

    我正在尝试动态地将工具提示文本设置为容器 div 并对我刚刚添加到有序列表的每个 div 元素 elem Alias Status 使用 jQuery function addNewElement elem var li li li li
  • Electron - 为什么在关闭事件时将 BrowserWindow 实例设置为 null

    The 电子文档 https electronjs org docs api browser window 提供以下代码示例来创建新窗口 const BrowserWindow require electron let win new Br
  • 如何判断 jquery 对话框是否打开? [复制]

    这个问题在这里已经有答案了 寻找通用案例解决方案来确定当前是否打开任何 jquery 对话框 有多个 试过 ui dialog content dialog isOpen true ui dialog dialog isOpen true
  • jQuery 获取元素内的鼠标位置

    我希望制作一个控件 用户可以在 div 内单击 然后拖动鼠标 然后松开鼠标以指示他们想要的内容有多长 这是针对日历控件的 因此用户将指示特定事件的时间长度 看起来最好的方法是在父 div 上注册一个 mousedown 事件 而父 div
  • 为什么我不能在 AngularJS 中使用 data-* 作为指令的属性名称?

    On the t他的笨蛋 http plnkr co edit l3KoY3 p preview您可以注意到属性名称模式的奇怪行为data 在指令中 电话 Test of data named attribute br
  • Javascript 纪元时间(以天为单位)

    我需要以天为单位的纪元时间 迄今为止 我已经看到过有关如何翻译它的帖子 但几天后就没有了 我对纪元时间很不好 我怎么能得到这个 我需要以天为单位的纪元时间 我将解释为您想要自纪元以来的天数 纪元本身是第 0 天 或第 1 天的开始 无论您如
  • Jquery 验证不能正确验证数字?

    我在使用 jquery 非侵入式验证验证数字时遇到问题 我使用的版本是 ASP NET MVC 3 jQuery 1 9 1 jQuery 用户界面 1 10 1 JQuery 验证 1 11 0 我试图验证的输入是
  • Safari 支持 JavaScript window.onerror 吗?

    我有一个附加到 window onerror 的函数 window onerror function errorMsg url line window alert asdf 这在 firefox chrome 和 IE 中工作正常 但在 s
  • 如何仅在最后一个
  • 处给出透明六边形角度?
  • 我必须制作这样的菜单 替代文本 http shup com Shup 330421 1104422739 My Desktop png http shup com Shup 330421 1104422739 My Desktop png
  • 如何在 pg-promise 中设置模式

    我正在搜索的文档pg 承诺 https github com vitaly t pg promise特别是在创建客户端时 但我无法找到设置连接中使用的默认架构的选项 它始终使用public架构 我该如何设置 通常 为数据库或角色设置默认架构
  • 使用 Ajax 请求作为源数据的 Jquery 自动完成搜索

    我想做的事 我想使用 jquery 自动完成函数创建一个输入文本字段 该函数从跨域curl 请求获取源数据 结果应该与此示例完全相同 CSS 在这里并不重要 http abload de img jquerydblf5 png http a
  • Javascript/Jquery:确定用户是否使用鼠标滚轮、滚动条或键盘滚动

    我正在尝试让用户界面正常工作 如果他们使用鼠标滚轮 我需要让它以一种方式滚动 如果他们使用滚动条 我需要让它以另一种方式滚动 如果他们使用键盘 我需要让它以另一种方式滚动 我相信滚轮和滚动条都充当鼠标事件 但是当单击滚动条时我无法让 jav
  • 导致回发到与弹出窗口不同的页面

    我有一个主页和一个详细信息页面 详细信息页面是从主页调用的 JavaScript 弹出窗口 当单击详细信息页面上的 保存 按钮时 我希望主页 刷新 是否有一种方法可以调用主页的回发 同时还可以从详细信息页面维护保存回发 Edit 使用win
  • fullCalendar 未显示正确的结束日期

    我正在看调试页面 http jsbin com wukofacaxu edit js outputFullCalendar 官方网站的 我想安排一个活动时间为 22 09 2015 至 30 09 2015 dd mm yyyy 但它只显示

随机推荐

  • 如何给JTextField添加背景图片?

    我知道如何向 JPanel 添加背景图像 创建扩展 JPanel 的 ImagePanel 类并重载它的 PaintComponent 方法 但是 JTextField 的这个技巧无法正常工作 显示图像 但不显示文本 那么 如何正确地向 J
  • Multiprocessing.pool 具有多个 args 和 kwargs 的函数

    我想使用 mutliprocessing pool 方法并行计算 问题是我想在计算中使用的函数提供了两个参数和可选的 kwargs 第一个参数是数据帧 第二个参数是 str 任何 kwargs 是字典 对于我尝试执行的所有计算 我想要使用的
  • 如何在 swift 中导入 JSQMessagesViewController?

    我正在使用 xcode 6 3 swift 1 2 并使用 cocoapods 安装 JSQMessagesViewController 库 这是我的 pod 文件 pod JSQMessagesViewController 和我的桥接文件
  • HttpListener:请求的地址在此上下文中无效

    当创建一个HttpListener对象使用 var server new HttpListener server Prefixes Add http 8080 server Start 一切正常 但是 当我使用 var server new
  • 对齐 2 个矩阵以实现最大重叠

    那么下面是一道面试题 Given two N2 matrices with entries being 0 or 1 How can we find out the number of maximum overlapping 1 s pos
  • 用户因“记住我”而注销

    我似乎无法理解 Identity 2 0 和 cookies 的工作方式 ASP NET MVC 5 我想要的是 如果用户登录并选中 记住我 复选框 我不希望他永远退出 但是发生的情况是 用户在一定时间跨度后退出 如果用户在时间跨度之前关闭
  • 致命错误:未捕获的 CurlException:26:创建表单数据失败抛出

    我收到以下错误 Fatal error Uncaught CurlException 26 failed creating formpost data thrown in home u801961841 public html inc li
  • JQuery 可排序列表和固定/锁定项目

    是否可以锁定 JQuery 可排序列表中的列表项 使这些项保留在列表中的特定位置 例如 考虑这个带有锁定项目的伪列表 item A item B locked item C locked item D item E item F item
  • 是否可以在 PlantUML 中对参与者进行分组?

    我想要一个围绕几个参与者的盒子 表明他们是一个实体的一部分 如何在 PlantUML 中做到这一点 您可以将参与者 装箱 如 plantuml 网站上所示 摘录如下 startuml box Internal Service LightBl
  • 无法使用 VS 2010 启动 SOS.dll

    我正在尝试启动SOS dll from Visual Studio 2010 旗舰版 我收到以下错误 命令期间出错 IDebugClient 要求未实现的接口 命令期间出错 异常 c0000005 发生在 1BC4EF9E 我还为该项目启用
  • 我在 IE 中遇到语法错误,但在 Chrome 中却没有

    所以我有这段代码 一个函数 可以在 Google Chrome Fire Fox 中运行 但不能在 IE 中运行 如果我评论这一行 一切都会运行良好 除了该行至关重要 我有一个名为 ReadCookie 的函数 它基本上只是将 cookie
  • jqgrid:拖放多行

    如何使用 jqgrid 拖放多行 即我可以拖动多于一行吗 我怎么知道这在 jqGrid 中是不可能的 jQuery UI 的可排序功能是否支持它 请参阅http jqueryui com demos sortable http jquery
  • Html:

    标记的正确顺序是什么?

    根据标准 以下哪一项 如果有的话 是正确的 a href p Link Description p a p a href Link Description a p 我知道它们的功能相同 但这是一个最佳实践 标准问题 这也适用于 ul ol
  • C中通过套接字发送文件

    我在学校接到一个任务 用C语言 针对Linux 编写一个FTP程序 我很快就可以使用所有基本功能 ls cd 但是我在文件传输部分遇到了麻烦 我使用 sendfile 通过套接字发送文件 如下所示 int fd open temp O RD
  • postgres hstore同时存在和不存在[重复]

    这个问题在这里已经有答案了 我在远程服务器上设置了 Rails 应用程序并创建了 hstore 扩展 sudo u postgres psql CREATE EXTENSION hstore 然后 我部署了应用程序的迭代 该迭代在 post
  • 如何使用 postgresql 验证 Rails 中的重叠时间

    我有一个Event model具有start at时间和end at我的日程应用程序中的时间 我想在保存之前验证重叠时间 我创建了我的 Rails 应用程序Cloud9 我的视图图像如下 Day1 07 00 07 20 event1 10
  • JMESpath 表达式,用于按属性过滤对象并返回设置了此属性的对象名称列表

    是否可以编写 JMESPath 表达式来返回设置了特定子属性值的对象名称列表 在下面的示例中 我想获取所有主机名的列表 其中文件存在 stat 存在设置为 true 我的目标是使用 Ansible hostvars 结构来获取存在特定文件的
  • 相当于 .NET 中的 Windows 错误代码

    Microsoft 为 Windows 提供了一系列标准化错误代码 http msdn microsoft com en us library ms681381 VS 85 aspx 当适用时 我发现它们可以在我自己的应用程序中参考 而不是
  • 如何比较相似的代码库?

    我们有几个基于相同代码库构建的 C 项目 它们之间有很多相似之处和共同的代码 但它们是独立开发的 来源未以任何方式共享 即使底层代码没有改变 并且个别行将被调整 更改和替换 类和文件也将被重命名 我希望能够比较不同的代码库并找出有多少代码仍
  • 理解 jQuery 中的 $.proxy()

    From docs http api jquery com jquery proxy 我明白那个 proxy 会改变作为参数传递的函数的范围 有人可以更好地向我解释一下吗 我们为什么要这样做 它最终要做的是确保this函数中将是您想要的值