`
南山忍者
  • 浏览: 86118 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

$.proxy方法的理解

 
阅读更多

    1、首先先看一下,jQuery的proxy的官方文档中的解释

 

函数名称 返回值/类型
jQuery.proxy(function,context) Function

     其中:

          proxy(function,context),中的参数说明如下:

             (1)、function:

                          类型:Function

                          说明:The function whose context will be changed.(这句话的含义为:作用于上下文(context)的方法,会使得上下文发生变化---(其实这句话是一句废话,一个方法作用于某个东西,必然会使该“东西”发生变化))。

             (2)、context。

                          类型:PlainObject

                          说明:The object to which the context (this) of the function should be set.

                                 //-“The object”是指context。所以本句话的意思是指:参数context就是方法(function)的上下文(this)。

 

2、举例说明

       这个例子是jQuery官网的上的例子,在这里

<!DOCTYPE html>
<html>
	<head>
		<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
	</head>
	<body>
		<p><button type="button" id="test">Test</button></p>
		<div id="log"></div>
		<script>
			var me = {
				type: "zombie",
				test: function(event) {
					/* Without proxy, `this` would refer to the event target */
					/* use event.target to reference that element. */
					/*如果不使用proxy方法,‘this’关键字将会是事件对象的target。*/
				var element = event.target;
				$(element).css("background-color", "red");
					/* With proxy, `this` refers to the me object encapsulating */
					/* this function. */
					/*若使用了proxy,则上下文中的this,将会是‘me’*/
				$("#log").append( "Hello " + this.type + "<br>" );
				$("#test").off("click", this.test);
				}
			};
			var you = {
				type: "person",
				test: function(event) {
				$("#log").append( this.type + " " );
				}
			};
			/* execute you.test() in the context of the `you` object */
			/* no matter where it is called */
			/* i.e. the `this` keyword will refer to `you` */
			var youClick = $.proxy( you.test, you );
			/* attach click handlers to #test */
			$("#test")
				/* this === "zombie"; handler unbound after first click */
			.on( "click", $.proxy( me.test, me ) )
				/* this === "person" */
			.on( "click", youClick )
				/* this === "zombie" */
			.on( "click", $.proxy( you.test, me ) )
				/* this === "<button> element" */
			.on( "click", you.test );
		</script>
	</body>
</html>
 

 

   通过这个例子,就可以知道:this关键词一般是指event.target,即事件的对象。但是通过proxy方法,可以改变this关键字所指的事件对象。这也就是context参数的含义。

     通过function,作用于context,使其context发生改变。

 

     在《Learning jQuery(third Edition)》中附录C中,对proxy的定义为:

 

      创建(返回)一个在指定上下文中执行的新方法

 

       个人理解:

            在这个句话中:

                  指定上下文:是指:proxy中的context参数。

                  执行:是指proxy中的function参数。

 

       所以proxy方法的目的是直接指定上下文,然后定义的function作用于该上下文(this)      

 

3、proxy使用目的

 

       举例说明:

         代码-1

$('#myElement').click(function() {
        // In this function, "this" is our DOM element.
    $(this).addClass('aNewClass');
});
       在代码-1中,点击myElement,则该元素(myElement)将会添加aNewClass样式类。
    如果,我们想在1秒之后,为该元素添加样式,则会用到setTimeOut方法,实现如下:
$('#myElement').click(function() {
    setTimeout(function() {
          // 将会出问题,this将不是我们想要的element。
        $(this).addClass('aNewClass');
    }, 1000);
});
   但是这样使用,就会出现问题。文中的‘this’,不是ID为myElement元素,而是window。
   所以处理该问题的将会用到proxy方法。
$('#myElement').click(function() {
   // ------------------v--------give $.proxy our function,
    setTimeout($.proxy(function() {
        $(this).addClass('aNewClass');  // Now "this" is again our element
    }, this), 1000);
   // ---^--------------and tell it that we want our DOM element to be the
   //                      value of "this" in the function
});
   
     这样问题就会解决~~

3、参考资料

     1、关于proxy的一些博客是不错的。

      举例:《个人对JQuery Proxy()函数的理解

    2、stackoverflow中的问答:

       这儿:

    3、一个不错的讲解proxy的视频。(是英文的)

          这儿

    4、jQuery中proxy的源代码(呵呵,没看,仅仅是贴在这了)

 

01	/* jQuery 源码之 proxy:
02	 使用 apply 形式, 执行回调函数.
03	*/
04	jQuery.proxy = function( fn, proxy, thisObject ) {
05	    if ( arguments.length === 2 ) {
06	        // jQuery.proxy(context, name);
07	        if ( typeof proxy === "string" ) {
08	            thisObject = fn;
09	            fn = thisObject[ proxy ];
10	            proxy = undefined;
11	 
12	            /* 转化结果:
13	                thisObject -> context
14	                fn -> name
15	                proxy -> undefined
16	             */
17	        }
18	        // jQuery.proxy(name, context);
19	        else if ( proxy && !jQuery.isFunction( proxy ) ) {
20	            thisObject = proxy;
21	            proxy = undefined;
22	        }
23	    }
24	    if ( !proxy && fn ) {
25	        /* 使用 proxy 保证 函数执行时, context 为指定值 */
26	        proxy = function() {
27	            return fn.apply( thisObject || this, arguments );
28	        };
29	    }
30	    // Set the guid of unique handler to the same of original handler, so it can be removed
31	    if ( fn ) {
32	        proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
33	    }
34	    // So proxy can be declared as an argument
35	    return proxy;
36	}

 

   【最后】:不足之处,请批评与指正,多谢!

 

 

 

 

 

分享到:
评论

相关推荐

    java.lang.NoSuchMethodException: com.sun.proxy.$Proxy58.list错误解决办法

    首先,我们需要理解`com.sun.proxy.$Proxy`类的作用。这是Java动态代理机制生成的类,当我们在代码中使用了接口的代理对象时,JVM会创建这个代理类来实现对原始接口方法的拦截和增强。例如,Spring AOP(面向切面...

    proxy.jsp、proxy.ashx、proxy.php、proxy.config

    同时,理解代理服务的工作原理,如如何处理请求和响应,以及如何在客户端和服务器端进行交互,对于开发和维护GIS应用至关重要。 在资源包`resource-proxy-1.0`中,可能包含了这些代理服务的源代码、配置示例以及...

    jquery1.2.6源码分析rar + API

    3. 事件处理:jQuery的事件系统通过$.event.add和$.event.remove管理事件监听,$.proxy确保回调函数在正确的上下文中执行。 4. 动画效果:jQuery的动画功能如fadeIn、slideToggle等,底层实现依赖于setTimeout和...

    jQuery 1.7 (api)

    7. **其他API改进**:还包括对$.proxy(), $.extend(), $.grep()等多个函数的改进,使它们更强大、更易用。 jQuery 1.7的API文档(jQuery 1.7_20111204.chm)详细列出了所有可用的函数、方法和属性,以及它们的参数...

    jquery-1.7

    `$.proxy()`方法是1.7引入的一个实用工具,它允许开发者固定一个函数的上下文(this值),无论何时调用该函数,`this`总是指向预设的对象,这对于事件处理和回调函数特别有用。 9. **$.each()的优化** `$.each()`...

    jquery效果经典效果

    jQuery还提供了一些实用工具函数,如$.trim()用于去除字符串首尾空白,$.extend()用于合并对象,$.inArray()检查元素是否在数组中,$.proxy()确保函数在指定上下文中调用。 压缩包中的124种效果可能包括上述各个...

    jQuery函数命名四种方式总结

    `$.proxy`函数用于确保函数在特定上下文中调用,这对于事件处理尤其有用。它可以保持函数的作用域,即使函数在其他对象内部调用。例如: ```javascript var obj = { counter: 0, increment: function() { ...

    jquery1.7+jquery1.8 API文档CHM格式

    4. **$.proxy**: 优化了$.proxy,使其可以处理未定义的上下文(context)。 5. **动画改进**: 添加了`.stop(true, true)`,使动画立即停止并跳至末态。 ### jQuery 1.8 版本 #### 1.8 版本更新要点 1. **$.ajax...

    jquery-1.2-release

    4. **事件处理**:事件绑定功能得到了加强,$.event特殊事件和$.proxy()函数的引入,使得事件处理更加灵活,可以更好地处理冒泡和委托事件。 5. **动画效果**:jQuery 1.2增强了动画效果的控制,如animate()方法...

    救活HiSuite Proxy的方法.docx

    1. **理解HiSuite Proxy原理**: - HiSuite Proxy是一种允许用户通过代理服务器来操作手机固件的工具,主要用于降级等场景。 - 正常情况下,用户通过HiSuite连接手机后,可以从华为的官方服务器下载相应的固件进行...

    Python库 | zope.proxy-4.1.6.win32-py3.2.exe

    Python是一种广泛使用的高级编程语言,尤其在Web开发、数据分析、人工智能等领域有着重要应用。在Python的生态系统中,存在大量的第三方库来扩展其...正确理解和使用这个库,可以极大地提升Python应用的效率和质量。

    Python库 | zope.proxy-4.2.1-py3.3-win-amd64.egg

    在上面的例子中,`proxy_obj`是`MyClass`的一个代理实例,调用`get_value`方法时,实际上是调用了`original`对象的方法。 **5. 兼容性与版本** `zope.proxy-4.2.1-py3.3-win-amd64.egg`这个文件表明该库版本为...

    jQuery1-8-2.js和jqueryAPI

    - **$.proxy()**:创建一个函数,其上下文(this)被设置为指定的对象。 **3. jQuery 1.8.2 的改进与变化:** - **$.support**:添加了一些新的浏览器特性检测。 - **$.Callbacks()**:创建可配置的回调函数队列,...

    jQuery1.7和1.11.3的汉化API

    此外,对于事件处理,$.proxy()函数的引入使得函数上下文的绑定更为简单,解决了在回调函数中正确引用this的问题。 两个版本的汉化手册,jQuery1.11.3 中文手册.chm和jQuery1.7 中文手册.chm,为中文开发者提供了...

    java 请求的方法不存在(NoSuchMethodException)

    3. **Java动态代理**:基于`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`,实现对目标对象的代理,用于拦截方法调用。 综上所述,`NoSuchMethodException`是Java编程中需要关注的一个重要异常...

    jquery-1.2.3.zip

    同时,$.proxy()函数可以确保事件处理函数内的this指向正确,解决了JavaScript中this上下文的问题。 动画效果是jQuery的一大亮点。$.animate()函数可以实现平滑的CSS属性过渡,配合.stop()和.clearQueue()可以精确...

    Jquery 1.7 js

    `$.proxy` 函数允许开发者固定一个函数的上下文(即`this`值),在1.7版本中,它支持第二个参数,用于指定要绑定到的函数名,这在处理匿名函数时非常有用。 #### 1.3 `.delegate()` 与 `.live()` 合并为 `.on()` `...

    学习AJAX的框架Jquery1.2以及Jquery1.2的API

    - **$.proxy()**:创建一个新的函数,保持原函数的上下文,避免this指向问题。 **总结** jQuery 1.2作为AJAX开发的利器,其简洁的API和强大的功能使得网页动态交互和DOM操作变得简单。无论是初学者还是经验丰富的...

    jQueryAPI1.4.rar

    在jQuery 1.4.1中,`$.extend()`用于合并对象,`$.each()`遍历数组或对象,`$.proxy()`确保函数的上下文正确,这些都是常用的工具函数。此外,`$.support`属性提供了浏览器特性的检测,便于进行跨浏览器的兼容性开发...

    squid 配置实例

    - `visible_hostname kspcb-proxy`:设置代理服务器的主机名为 `kspcb-proxy`。 - `cache_mem 26 MB`:指定 Squid 的缓存内存大小为 26MB。 - `cache_swap_low 90` 和 `cache_swap_high 95`:分别设置了 Squid ...

Global site tag (gtag.js) - Google Analytics