实例解析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判断操作系统的类型实现不同操作系统下的兼容性
Jan 29 Javascript
js操作iframe的一些方法介绍
Jun 25 Javascript
jquery仿QQ商城带左右按钮控制焦点图片切换滚动效果
Jun 27 Javascript
在JavaScript中处理数组之reverse()方法的使用
Jun 09 Javascript
js内置对象处理_打印学生成绩单的简单实现
Sep 24 Javascript
学习vue.js表单控件绑定操作
Dec 05 Javascript
vue点击input弹出带搜索键盘并监听该元素的方法
Aug 25 Javascript
vue-cli系列之vue-cli-service整体架构浅析
Jan 14 Javascript
JavaScript ES6常用基础知识总结
Feb 09 Javascript
Node.js API详解之 repl模块用法实例分析
May 25 Javascript
Vue项目打包编译优化方案
Sep 16 Javascript
addEventListener()和removeEventListener()追加事件和删除追加事件
Dec 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实现清除wordpress里恶意代码
2015/10/21 PHP
PHP简单实现数字分页功能示例
2016/08/24 PHP
Laravel5中Cookie的使用详解
2017/05/03 PHP
window.location.href IE下跳转失效的解决方法
2014/03/27 Javascript
JS小游戏之宇宙战机源码详解
2014/09/25 Javascript
JavaScript语言对Unicode字符集的支持详解
2014/12/30 Javascript
JQuery节点元素属性操作方法
2015/06/11 Javascript
详解JavaScript数组的操作大全
2015/10/19 Javascript
使用JQuery中的trim()方法去掉前后空格
2016/09/16 Javascript
JS获取IE版本号与HTML设置IE文档模式的方法
2016/10/09 Javascript
xmlplus组件设计系列之树(Tree)(9)
2017/05/02 Javascript
微信小程序实现移动端滑动分页效果(ajax)
2017/06/13 Javascript
Web制作验证码功能实例代码
2017/06/19 Javascript
详解Vue-cli中的静态资源管理(src/assets和static/的区别)
2018/06/19 Javascript
小程序清理本地缓存的方法
2018/08/17 Javascript
axios全局注册,设置token,以及全局设置url请求网段的方法
2018/09/25 Javascript
JavaScript简单实现动态改变HTML内容的方法示例
2018/12/25 Javascript
如何解决js函数防抖、节流出现的问题
2019/06/17 Javascript
Vue项目中ESlint规范示例代码
2019/07/04 Javascript
python3使用SMTP发送简单文本邮件
2018/06/19 Python
nohup后台启动Python脚本,log不刷新的解决方法
2019/01/14 Python
python实现UDP协议下的文件传输
2020/03/20 Python
Python -m参数原理及使用方法解析
2020/08/21 Python
CSS3中的弹性布局em运用入门详解 1em等于多少像素
2021/02/08 HTML / CSS
shallow copy和deep copy的区别
2016/05/09 面试题
银行自荐信范文
2013/10/07 职场文书
居委会四风问题个人对照检查材料
2014/09/25 职场文书
KTV门卫岗位职责
2014/10/09 职场文书
党员群众路线教育实践活动学习笔记
2014/11/05 职场文书
自我检讨书怎么写
2015/05/07 职场文书
三方合作意向书范本
2015/05/09 职场文书
心灵点滴观后感
2015/06/02 职场文书
领导欢送会主持词
2015/07/06 职场文书
导游带团欢迎词
2015/09/30 职场文书
Html分层的box-shadow效果的示例代码
2021/03/30 HTML / CSS
PHP 技巧 * SVG 保存为图片(分享图生成)
2021/04/02 PHP