实例解析jQuery中proxy()函数的用法


Posted in Javascript onMay 24, 2016

jQuery.proxy(),接受一个函数,然后返回一个新函数,并且这个新函数始终保持了特定的上下文(context )语境。

jQuery.proxy( function, context )

function将要改变上下文语境的函数。

context函数的上下文语境(`this`)会被设置成这个 object 对象。

jQuery.proxy( context, name )

context函数的上下文语境会被设置成这个 object 对象。

name将要改变上下文语境的函数名(这个函数必须是前一个参数 ‘context' 对象的属性)

这个方法通常在向一个元素上附加事件处理函数时,上下文语境实际是指向另一个对象的情况下使用。

另外,jQuery 能够确保即使你绑定的函数是经过 jQuery.proxy() 处理过的函数,你依然可以用原先的函数来正确地取消绑定。

参数:
function:Function类型需要更改上下文对象的函数。
context:任意类型指定为函数设置的上下文对象。
name:String类型需要更改上下文对象的函数名称(它应该是context的一个属性)。
additionalArguments 可选/任意类型指定调用该函数时需要传入的参数,参数可以有任意多个。

注意事项:
参数additionalArguments是从 jQuery 1.6 开始支持的。
该方法非常适用于在附加事件处理函数时,将事件处理函数的上下文指向另一个对象。此外,jQuery确保:即使你使用jQuery.proxy()返回的"代理"函数来绑定事件,如果你在解除绑定时传入原函数,jQuery仍然可以正确解除绑定。
从jQuery 1.9 开始,如果context为null或undefined,则"代理"函数的上下文不会发生更改。这将允许jQuery.proxy()只传入函数的参数,而不更改函数的上下文。

实例

我们先看个例子:

//正常的this使用
$('#Haorooms').click(function() {

  // 这个this是我们所期望的,当前元素的this.

  $(this).addClass('aNewClass');

});
//并非所期望的this
$('#Haorooms').click(function() {

  setTimeout(function() {

     // 这个this指向的是settimeout函数内部,而非之前的html元素

    $(this).addClass('aNewClass');

  }, 1000);

});

这时候怎么办呢,通常的一种做法是这样的:

$('#Haorooms').click(function() {
  var that = this;  //设置一个变量,指向这个需要的this

  setTimeout(function() {

     // 这个this指向的是settimeout函数内部,而非之前的html元素

    $(that).addClass('aNewClass');

  }, 1000);

});

但是,在使用了jquery框架的情况下, 有一种更好的方式,就是使用$.proxy函数。

有两种语法:

jQuery.proxy( function, context )
/**function将要改变上下文语境的函数。
** context函数的上下文语境(`this`)会被设置成这个 object 对象。
**/

jQuery.proxy( context, name )
/**context函数的上下文语境会被设置成这个 object 对象。
**name将要改变上下文语境的函数名(这个函数必须是前一个参数 ‘context' **对象的属性)
**/

上面的例子使用这种方式就可以修改成:

$('#Haorooms').click(function() {

  setTimeout($.proxy(function() {

    $(this).addClass('aNewClass'); 

  }, this), 1000);

});
Javascript 相关文章推荐
js 调用百度地图api并在地图上进行打点添加标注
May 13 Javascript
jQuery使用hide方法隐藏指定元素class样式用法实例
Mar 30 Javascript
jQuery实现带滚动导航效果的全屏滚动相册实例
Jun 19 Javascript
动态创建按钮的JavaScript代码
Jan 29 Javascript
JavaScipt选取文档元素的方法(推荐)
Aug 05 Javascript
利用jquery实现瀑布流3种案例
Sep 18 Javascript
jQuery remove()过滤被删除的元素(推荐)
Jul 18 jQuery
jQuery实现腾讯信用界面(自制刻度尺)样式
Aug 15 jQuery
Node.js实现连接mysql数据库功能示例
Sep 15 Javascript
vue中实现先请求数据再渲染dom分享
Mar 17 Javascript
浅谈webpack SplitChunksPlugin实用指南
Sep 17 Javascript
JavaScript字符和ASCII实现互相转换
Jun 03 Javascript
jQuery前端开发35个小技巧
May 24 #Javascript
JS+Canvas绘制时钟效果
Aug 20 #Javascript
基于JQuery实现图片上传预览与删除操作
May 24 #Javascript
JavaScript仿淘宝页面图片滚动加载及刷新回顶部的方法解析
May 24 #Javascript
通过jquery-ui中的sortable来实现拖拽排序的简单实例
May 24 #Javascript
ECHO.js 纯javascript轻量级延迟加载的实例代码
May 24 #Javascript
倾力总结40条常见的移动端Web页面问题解决方案
May 24 #Javascript
You might like
php 设计模式之 单例模式
2008/12/19 PHP
PHP mb_convert_encoding 获取字符串编码类型实现代码
2009/04/26 PHP
PHP实现异步调用方法研究与分享
2011/10/27 PHP
调试一段PHP程序时遇到的三个问题
2012/01/17 PHP
PHP的文件操作与算法实现的面试题示例
2015/08/10 PHP
php多线程实现方法及用法实例详解
2015/10/26 PHP
PHP递归实现文件夹的复制、删除、查看大小操作示例
2017/08/11 PHP
Laravel 实现密码重置功能
2018/02/23 PHP
关于Javascript与iframe的那些事儿
2013/07/04 Javascript
Jquery Uploadify多文件上传带进度条且传递自己的参数
2013/08/28 Javascript
使用JS CSS去除IE链接虚线框的三种方法
2013/11/14 Javascript
中止javascript执行的方法
2014/02/14 Javascript
Js实现动态添加删除Table行示例
2014/04/14 Javascript
js使用递归解析xml
2014/12/12 Javascript
JS的框架Polymer中的dom-if和is属性使用说明
2015/07/29 Javascript
Bootstrap布局组件应用实例讲解
2016/02/17 Javascript
JQuery给select添加/删除节点的实现代码
2016/04/26 Javascript
Web打印解决方案之普通报表打印功能
2016/08/29 Javascript
修改vue+webpack run build的路径方法
2018/09/01 Javascript
微信小程序实现的绘制table表格功能示例
2019/04/26 Javascript
深入理解redux之compose的具体应用
2020/01/12 Javascript
[02:08]我的刀塔不可能这么可爱 胡晓桃_1
2014/06/20 DOTA
[00:17]天涯墨客一技能展示
2018/08/25 DOTA
[54:17]DOTA2-DPC中国联赛定级赛 RNG vs iG BO3第二场 1月10日
2021/03/11 DOTA
pandas.cut具体使用总结
2019/06/24 Python
python通过函数名调用函数的几种场景
2020/09/23 Python
python利用xlsxwriter模块 操作 Excel
2020/10/14 Python
国际旅客访问北美最大的汽车租赁提供商:Alamo Rent A Car
2018/06/13 全球购物
应届毕业生个人自我评价
2013/09/20 职场文书
数控专业大学生的自我鉴定
2013/11/13 职场文书
记者岗位职责
2014/01/06 职场文书
打架检讨书50字
2014/01/11 职场文书
英语专业个人求职信范文
2014/02/01 职场文书
对公司合理化的建议书
2014/03/12 职场文书
安全环保标语
2014/06/09 职场文书
如何书写公司员工保密协议?
2019/06/27 职场文书