实例解析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元素集合 Drag and Drop any item
Dec 22 Javascript
兼容多浏览器的iframe自适应高度(ie8 、谷歌浏览器4.0和 firefox3.5.3)
Nov 04 Javascript
JQuery里选择超链接的实现代码
May 22 Javascript
js如何设置在iframe框架中指定div不显示
Dec 04 Javascript
Jquery中ajax方法data参数的用法小结
Feb 12 Javascript
jquery实现html页面 div 假分页有原理有代码
Sep 06 Javascript
jQuery实现非常实用漂亮的select下拉菜单选择效果
Nov 06 Javascript
jquery中validate与form插件提交的方式小结
Mar 26 Javascript
轻松实现jQuery添加删除按钮Click事件
Mar 13 Javascript
JS运动特效之链式运动分析
Jan 24 Javascript
JS中使用react-tooltip插件实现鼠标悬浮显示框
May 15 Javascript
在layui.use 中自定义 function 的正确方法
Sep 16 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 什么是PEAR?(第三篇)
2009/03/19 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(五)
2014/06/23 PHP
php生成固定长度纯数字编码的方法
2015/07/09 PHP
php面向对象值单例模式
2016/05/03 PHP
php通过会话控制实现身份验证实例
2016/10/18 PHP
javascript判断是手机还是电脑访问网页的简单实例分享
2014/06/03 Javascript
jQuery中:button选择器用法实例
2015/01/04 Javascript
JavaScript中document对象使用详解
2015/01/06 Javascript
详解照片瀑布流效果(js,jquery分别实现与知识点总结)
2017/01/01 Javascript
jQueryMobile之窗体长内容的缺陷与解决方法实例分析
2017/09/20 jQuery
解决vue elementUI中table里数字、字母、中文混合排序问题
2020/01/07 Javascript
JS eval代码快速解密实例解析
2020/04/23 Javascript
js 数据类型判断的方法
2020/12/03 Javascript
在HTML中使用JavaScript的两种方法
2020/12/24 Javascript
在JavaScript中查找字符串中最长单词的三种方法(推荐)
2021/01/18 Javascript
python对html代码进行escape编码的方法
2015/05/04 Python
Python如何读取MySQL数据库表数据
2017/03/11 Python
Python中装饰器兼容加括号和不加括号的写法详解
2017/07/05 Python
python 换位密码算法的实例详解
2017/07/19 Python
Python3自动签到 定时任务 判断节假日的实例
2018/11/13 Python
使用Python实现图像标记点的坐标输出功能
2019/08/14 Python
Python关于__name__属性的含义和作用详解
2020/02/19 Python
win10安装python3.6的常见问题
2020/07/01 Python
利用python实现汉诺塔游戏
2021/03/01 Python
包装类的功能、种类、常用方法
2012/01/27 面试题
一个SQL面试题
2014/08/21 面试题
党支部书记先进事迹
2014/01/17 职场文书
教师申诉制度
2014/01/29 职场文书
最美家庭活动方案
2014/08/31 职场文书
2014年党总支工作总结
2014/12/18 职场文书
先进个人事迹材料范文
2014/12/30 职场文书
应届生求职自荐信范文
2015/03/04 职场文书
公司管理制度范本
2015/08/03 职场文书
2016应届毕业生实习评语
2015/12/01 职场文书
导游词之无锡华莱坞
2019/12/02 职场文书
python中mongodb包操作数据库
2022/04/19 Python