实例解析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 相关文章推荐
javascript 3d 逐侦产品展示(核心精简)
Mar 26 Javascript
Javascript中的return作用及javascript return关键字用法详解
Nov 05 Javascript
浅析JavaScript声明变量
Dec 21 Javascript
BootstrapValidator不触发校验的实现代码
Sep 28 Javascript
vuejs通过filterBy、orderBy实现搜索筛选、降序排序数据
Oct 26 Javascript
jQuery插件FusionCharts绘制ScrollColumn2D图效果示例【附demo源码下载】
Mar 22 jQuery
react.js 父子组件数据绑定实时通讯的示例代码
Sep 25 Javascript
AngularJS中控制器函数的定义与使用方法示例
Oct 10 Javascript
vue3.0 CLI - 2.1 -  component 组件入门教程
Sep 14 Javascript
微信小程序学习笔记之登录API与获取用户信息操作图文详解
Mar 29 Javascript
浅谈express.js框架中间件(middleware)
Apr 07 Javascript
javascript全局自定义鼠标右键菜单
Dec 08 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对数组排序的简单实例
2013/12/25 PHP
php实现的简单日志写入函数
2015/03/31 PHP
php给图片添加文字水印方法汇总
2015/08/27 PHP
PHP加密解密函数详解
2015/10/28 PHP
thinkphp微信开发(消息加密解密)
2015/12/02 PHP
遍历指定目录,并存储目录内所有文件属性信息的php代码
2016/10/28 PHP
PHP mysqli事务操作常用方法分析
2017/07/22 PHP
javascript getElementsByClassName实现代码
2010/10/11 Javascript
侧栏跟随滚动的简单实现代码
2013/03/18 Javascript
解析jQuery的三种bind/One/Live事件绑定使用方法
2013/12/30 Javascript
js实现日期级联效果
2014/01/23 Javascript
javascript检查浏览器是否支持flash的实现代码
2014/08/14 Javascript
jQuery插件实现图片轮播特效
2016/06/16 Javascript
vue分页组件table-pagebar使用实例解析
2020/11/15 Javascript
微信小程序表单验证form提交错误提示效果
2020/06/19 Javascript
使用localStorage替代cookie做本地存储
2019/09/25 Javascript
vue+vuex+axios从后台获取数据存入vuex,组件之间共享数据操作
2020/07/31 Javascript
JS使用setInterval计时器实现挑战10秒
2020/11/08 Javascript
Python多线程编程(七):使用Condition实现复杂同步
2015/04/05 Python
通过5个知识点轻松搞定Python的作用域
2016/09/09 Python
python读取与写入csv格式文件的示例代码
2017/12/16 Python
安装python及pycharm的教程图解
2019/10/10 Python
基于Python中的yield表达式介绍
2019/11/19 Python
Python中Selenium库使用教程详解
2020/07/23 Python
python爬虫分布式获取数据的实例方法
2020/11/26 Python
澳大利亚领先的孕妇服装品牌:Mamaway
2018/08/14 全球购物
JavaScript实现前端网页版倒计时
2021/03/24 Javascript
三字经教学反思
2014/04/26 职场文书
学籍证明模板
2014/11/21 职场文书
2014年企业党支部工作总结
2014/12/04 职场文书
2014年房地产个人工作总结
2014/12/20 职场文书
苏州园林导游词
2015/02/03 职场文书
2015年乡镇党务公开工作总结
2015/05/19 职场文书
怒海潜将观后感
2015/06/11 职场文书
CSS3 制作精美的定价表
2021/04/06 HTML / CSS
VUE使用draggable实现组件拖拽
2022/04/06 Vue.js