实例解析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 相关文章推荐
html中table数据排序的js代码
Aug 09 Javascript
ff chrome和ie下全局动态定位的异同及全局高度的取法
Jun 30 Javascript
推荐10 个很棒的 jQuery 特效代码
Oct 04 Javascript
详解JavaScript中localStorage使用要点
Jan 13 Javascript
Vue.js 递归组件实现树形菜单(实例分享)
Dec 21 Javascript
从setTimeout看js函数执行过程
Dec 19 Javascript
layer弹出层父子页面事件相互调用方法
Aug 17 Javascript
原生JS实现轮播图效果
Oct 12 Javascript
vant(ZanUi)结合async-validator实现表单验证的方法
Dec 06 Javascript
js中async函数结合promise的小案例浅析
Apr 14 Javascript
微信小程序在ios下Echarts图表不能滑动的问题解决
Jul 10 Javascript
在vue中axios设置timeout超时的操作
Sep 04 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的curl封装类用法实例
2014/11/07 PHP
学习php设计模式 php实现访问者模式(Visitor)
2015/12/07 PHP
PHP实现Snowflake生成分布式唯一ID的方法示例
2020/08/30 PHP
jquery中ajax调用json数据的使用说明
2011/03/17 Javascript
THREE.JS入门教程(3)着色器-下
2013/01/24 Javascript
THREE.JS入门教程(6)创建自己的全景图实现步骤
2013/01/25 Javascript
javascript中常用编程知识
2013/04/08 Javascript
用js实现控件的隐藏及style.visibility的使用
2013/06/14 Javascript
jquery实现手风琴效果实例代码
2013/11/15 Javascript
jQuery实现Tab菜单滚动切换的方法
2015/09/21 Javascript
js验证真实姓名与身份证号是否匹配
2015/10/13 Javascript
JS模仿手机端九宫格登录功能实现代码
2016/04/28 Javascript
vue多种弹框的弹出形式的示例代码
2017/09/18 Javascript
VSCode 配置React Native开发环境的方法
2017/12/27 Javascript
Vue项目中使用better-scroll实现菜单映射功能方法
2019/09/11 Javascript
Python脚本实现DNSPod DNS动态解析域名
2015/02/14 Python
Python正则表达式使用范例分享
2016/12/04 Python
Python实现定时执行任务的三种方式简单示例
2019/03/30 Python
python 图片去噪的方法示例
2019/07/09 Python
详解python中自定义超时异常的几种方法
2019/07/29 Python
Python完全识别验证码自动登录实例详解
2019/11/24 Python
Python爬虫:Request Payload和Form Data的简单区别说明
2020/04/30 Python
10分钟理解CSS3 FlexBox弹性布局
2018/12/20 HTML / CSS
利用HTML5实现使用按钮控制背景音乐开关
2015/09/21 HTML / CSS
马歇尔耳机官网:Marshall Headphones
2020/02/04 全球购物
沙特阿拉伯排名第一的在线时尚购物应用程序:1Zillion
2020/08/08 全球购物
几道数据库的概念性面试题
2014/05/30 面试题
2014年计算机专业个人自我评价
2014/01/19 职场文书
点菜员岗位职责范本
2014/02/14 职场文书
创建精神文明单位实施方案
2014/03/08 职场文书
幼儿园课题方案
2014/06/09 职场文书
党员群众路线整改措施及今后努力方向
2014/10/28 职场文书
2014年仓库管理工作总结
2014/12/17 职场文书
高中同学会致辞
2015/08/01 职场文书
详解Java实现设计模式之责任链模式
2021/06/23 Java/Android
Feign调用传输文件异常的解决
2021/06/24 Java/Android